Blossom β A Language for Structured Thinking
It began with a vague request in a chat window: βMake it look nicer.β
By session five, that single line had splintered into thousands of messages, half-formed ideas, and repeated clarifications. I wasnβt just building softwareβI was drowning in unstructured conversation. Then it hit me: if Iβm co-developing the product and the process simultaneously, why am I still speaking in paragraphs when I could speak in structure?
Thatβs how building without Blossom Specs ML could look like. Letβs face it AI-assisted development can be a messy, iterative reality that can generate more tangent options at great speed than you can handle.
Thesis:
Blossom turns thinking into structureβand structure into a language.
It is a way to surface ideas into structured mental modelsβso they can be clearly expressed, shared, and understood by both humans and AI.
The Origin of Blossom
From the genesis line of 'This is a single file vanilla JS PWA markdown editor. Analyze for bug'.
Session 1: "Add a button to the toolbar"
Session 2: "Add a dark mode toggle"
Session 3: "TopToolBar[[Logo, LogoText], [<empty>], [DarkLight, Focus, Import, Export{md,html,pdf,zip}]]"
Co-Developing Product & Process
As part of my development philosophy, Iβve always believed in improving both the product and the process in parallel. Most developers focus on shipping features. I focus on shipping features while refining how I build them.
When I started building what was then called LocalMark Studio (now Blossom), my usual dialetical conversations with AI(aka workflow) looked like this(over-simplfied, but sometimes so):
ps: my solutioning usually takes a breadth first, then depth approach - hence discovery through open-ended questioning at the start.
- Session 1:
"Add a button to the toolbar" - Session 2:
"Add a dark mode toggle" - Session 3:
TopToolBar[[Logo, LogoText], [<empty>], [DarkLight, Focus, Import, Export{md,html,pdf,zip}]]
By Session 3, natural language had fractured under complexity. I was repeating clarifications, losing context across AI sessions, and paying a hidden βrework taxβ every time a vague prompt resulted in misaligned code.
The above is over-dramatised, but I am sure many have encountered these traumas:
- Ambiguity bred scope creep
- Context windows filled, then forgot
- Decisions vanished into chat history
- Every βfixβ created two new edge cases
By now all vibe coders would also have discovered codes confidently produced by AI can have bugs as well.
Blossom wasnβt planned to be. It is inevitable that I would have innovated it - to allow proper channeling of its powers.
The Evolution: From Chat Logs to Structured Trees
The transition didnβt happen overnight. It emerged through three distinct phases:
| Phase | Behavior | Realization |
|---|---|---|
| Discovery | "Add Kanban", "Fix layout" |
We learned what works through doing |
| Pattern Recognition | "Kanban needs full width", "All full-width views use overlay pattern" |
Shared vocabulary emerged organically |
| Specification | GraphView[type: fullwidth, layout: force-directed] |
Complex features needed exact specs to avoid rework |
What made Specs ML emerge wasnβt a desire to write documentation. The turning point was when I tried to figure out a better way to communicate with AI more effectively and capture ideas without losing them where Prompt Engineering is too structured and hence boxed-in. This is often the case in new product development as features are discovered and evolved and not well defined yet.
| Before Specs ML | After Specs ML |
|---|---|
| Ideas scattered in chat | Structured, searchable specification |
"What did we decide?" |
Single source of truth |
"What's coming next?" |
Clear version roadmap |
| Duplicate feature requests | Track whatβs planned vs done |
The tree structure became CRUD-native. Every node is a first-class citizen that can be created, moved, updated, or archived gracefully. Ideas no longer go MIA. They have a home.
The Missing Layer: What Blossom Actually Is (and Isnβt)
Software development has a gap. On one side: rigid code. On the other: loose notes. In between lies a vacuum where ambiguity thrives, context evaporates, and alignment fractures.
Blossom Specs ML fills that gap. It is a lightweight Domain-Specific Language (DSL) for product specification. Not a markup language. Not Turing complete. Not prescriptive. It lives between thinking and implementation.
The Intentional Constraint
You might ask: Is Blossom Specs ML Turing complete?
Short answer: No. Long answer: Itβs not meant to be.
Blossom is a data description language, not a programming language. It has no conditionals, no loops, no mutable state, no arithmetic. It intentionally trades computational power for predictability, readability, and version-control friendliness.
The Recursive Joke
"Specs ML cannot answer that question because Specs ML cannot answer any question. It only describes what is."
A flower doesnβt compute. It grows. Thatβs Blossom.
Where Blossom Stacks
Blossom Specs ML lives at the vision layer - above code, above data, in the realm of product thinking.
| Layer | Tool |
|---|---|
| Compute | JavaScript, Python, C++ |
| Structure | JSON, YAML |
| Product Vision | Blossom Specs ML |
| Human Conversation | Natural Language |
Itβs human-first, machine-parseable (if you want), and designed to survive context switches, team member turnover, and your own memory.
Practice: Specifying an API Client
Letβs use a real-world application Yaak REST API Client to construct a specification. Using Blossom, I can map its UI hierarchy, component relationships, state, and proposed improvements into a single tree, with as much detail as I want(can):
Yaak[
type: API_Client,
platform: desktop,
status: active,
version: 2026.3.1
]
|
βββ Layout[
β βββ Sidebar[position: left, width: 260px]
β β βββ EnvironmentSelector[current: "No Environment", dropdown: true]
β β βββ Search[placeholder: "Search", shortcut: βF]
β β βββ RequestTree[type: nested, items: [...]]
β β
β βββ MainPanel[
β β βββ RequestHeader[method: GET, url: "swapi.info/api/"]
β β βββ Tabs[items: [Body, Headers, Auth, Info, Pretty], active: Pretty]
β β βββ ContentArea[type: json, formatting: pretty]
β β
β βββ Footer[
β βββ UpdateNotification[message: "Yaak 2026.3.1 is available"]
β ]
]
This single structure captures:
β
Visual hierarchy & component relationships
β
State, properties, and active selections
β
Proposed improvements (prioritized by impact)
β
Contextual comments & elaboration zones
The notation scales from simple descriptions to complex systems while remaining readable at a glance. No JSON nesting hell. No YAML indentation guesswork. Just trees, attributes, and status markers (β
π§ π‘ π).
Alternate Way Of Specifying a Product
Another user from another lens, could have specified it this way - both are valid.
App[
Name: Yaak
Modules[
RequestBuilder[
Methods: [GET, POST, PUT, DELETE]
BodyTypes: [JSON, FormData, Raw]
]
ResponseViewer[
Views: [Pretty, Raw, Headers]
]
Collections[
Structure: Tree
]
]
]
The Impact To Productivity, Quality, Efficiency and Speed: Metrics That Matter
Writing specs takes time. Estimated overhead: 15β20%. But this overhead pays for itself within three sessions.
I estimate the following improvements to productivity, speed and quality if the original LocalMarkdown Studio(now Blossom) editor was implemented with Blossom Specs ML. In the original implementation - most of the breakages came from shifting the UI design midway to cater to expanded features that were originally not in scope.
Hereβs what changes when you shift from reactive chat-building to structured specification:
Sessions to MVP
| Metric | Without Spec | With Spec | Improvement |
|---|---|---|---|
| Features per session | 1.2 | 2.0 | +67% |
| Sessions to MVP | 10 | 6 | -40% |
| Rework sessions | 4 | 0.5 | -87% |
| Bug fix sessions | 2 | 1 | -50% |
The Rework Tax
The biggest cost wasnβt building features. It was rebuilding them.
| Feature | Without Spec | With Spec | Savings |
|---|---|---|---|
| Kanban | 2 sessions (wrong placement β CSS fixes β mode rewrite) | 1 session | -50% |
| Calendar | 2 sessions (sidebar β fullwidth β mode parsing bugs) | 1 session | -50% |
| Graph | 1.5 sessions (layout redone β drag detection fixed) | 0.5 session | -67% |
| Theme system | 1 session | 0.5 session | -50% |
Quality & Communication
| Aspect | Without Spec | With Spec |
|---|---|---|
| Clarification questions per feature | 5β10 | 1β2 |
| Misinterpretations | Frequent | Rare |
"I meant the other toolbar" |
Yes | Never |
| New developer ramp-up | 2β3 sessions | ~30 minutes |
| Forgotten decisions | Frequent | Documented |
Architectural Quality
| Metric | Without Spec | With Spec |
|---|---|---|
| Consistent patterns | Emergent | Intentional |
| View lifecycle standardization | None | Uniform |
| Mode management | Scattered | Centralized |
| Property naming | Inconsistent | Standardized |
Knowledge Transfer
| Aspect | Without Spec | With Spec |
|---|---|---|
| New developer ramp-up | 2-3 sessions | 30 minutes |
| βWhat does this do?β | Dig through code | Read the spec |
| Forgotten decisions | Frequent | Documented |
| Session recap needed | Every time | Rare |
The Real Savings: Rework
The biggest cost wasnβt building features. It was rebuilding them.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β REWORK TAX - WITHOUT SPEC β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Kanban: β
β βββ Built in sidebar (wrong) β Moved to full-width β 1 session lost β
β βββ CSS grid issues β Fixed β 0.5 session lost β
β βββ Mode management β Rewritten β 0.5 session lost β
β β
β Calendar: β
β βββ Built in sidebar (wrong) β Moved to full-width β 1 session lost β
β βββ Date parsing bugs β Fixed β 0.5 session lost β
β βββ Three modes β Added incrementally β 0.5 session lost β
β β
β Graph: β
β βββ Layout β Redone β 0.5 session lost β
β βββ Drag detection β Fixed β 0.5 session lost β
β β
β Total Rework: ~4 sessions β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
With Spec, these would not have necessarily been built correctly the first time, but improvements will pay dividends over time.
The Spec Development Tax
Writing specs takes time. Estimated overhead:
| Activity | Time |
|---|---|
| Initial spec creation | 1 session |
| Updating spec per feature | 5-10 minutes |
| Reviewing spec before building | 2-3 minutes |
| Total overhead | +15-20% |
But this overhead pays for itself in reduced rework.
Net Improvement Summary
| Category | Before | After | Improvement |
|---|---|---|---|
| Productivity | 1.2 feat/session | 2.0 feat/session | +67% |
| Efficiency | 40% rework | 10% rework | +75% |
| Quality | 26 defects | 6 defects | +77% |
| Speed | 10 sessions | 6 sessions | +40% |
The Compounding Effect
The real benefit compounds over time:
Session 1-3: Small difference (spec writing overhead)
Session 4-6: Gap widens (less rework)
Session 7-10: Gap doubles (accumulated savings)
Session 10+: Exponential (architectural consistency)
By Session 10, the Spec-driven approach would beΒ 2-3x more productive.
What We Would Have Done Differently
- Defined View base classΒ from the start
- Centralized mode managementΒ before Kanban
- Standardized layout patternsΒ (list vs fullwidth)
- Consistent property namingΒ across all features
- Documented decisionsΒ as we made them
Final Verdict
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β If we had started with Blossom Specs ML: β
β β
β β
40% fewer sessions to MVP β
β β
75% less rework β
β β
77% fewer bugs β
β β
2x productivity by session 10 β
β β
β The 15-20% spec overhead pays for itself within 3 sessions. β
β β
β After that, it's pure compounding efficiency. β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
But the more important insight:Β We didnβt know what to specify until we built it.
We didnβt know what to specify until we built it. The spec couldnβt have come first. It emerged from the building. Thatβs not a bug. Thatβs the process.
Comparing Blossom Fit in the Spec-Driven Landscape
Specification-Driven Development is fashionable. But not all specs are created equal. Blossom doesnβt replace existing methodologies; it occupies a different niche.
| Aspect | Waterfall | Agile (Stories) | BDD (Gherkin) | OpenAPI | Blossom Specs ML |
|---|---|---|---|---|---|
| Purpose | Contract | Communication | Testing | API docs | Product vision |
| Format | Document | "As a user..." |
Given/When/Then |
YAML/JSON | Tree notation |
| Prescriptive vs Descriptive | Prescriptive | Descriptive | Prescriptive | Prescriptive | Descriptive |
| Discovered vs Designed | Designed | Discovered | Designed | Designed | Discovered |
| AI-Optimized | β | β οΈ | β οΈ | β οΈ | β |
| Living Document | β | Sometimes | Sometimes | β | β |
How Blossom Differs
- Descriptive, Not Prescriptive: It tells you what exists, not what you must build. Future features are marked with
π‘, not locked withπ. - Emergent, Not Designed: Traditional:
Plan β Spec β Build β Test. Blossom:Build β Discover β Spec β Update β Build more. - Human-First, Machine-Second: Optimized for glanceable hierarchy and status markers. Parseable if needed, but never required.
- Spec + Roadmap + Bug Tracker in One: One document. Multiple purposes. Zero duplication.
Rating for its niche: 8/10.
Best for: Solo builders, AI collaborators, exploratory products, small teams.
Struggles with: Large enterprises, fixed-contract work, regulatory compliance, formal validation.
Traditional spec-driven development asks: βWhat will we build?β
Blossom Specs ML asks: βWhat have we built? What have we learned? What should we build next?β
One is prediction. The other is reflection.
Lessons from the AI Collaborator
Building Blossom was a partnership. The AI handled execution. I handled direction. Hereβs what that taught me:
What AI Did Well
- Pattern Recognition: Noticed Kanban, Calendar, and Graph all needed full-width layouts. Suggested the overlay pattern before I asked.
- Rapid Prototyping:
"Add a graph view"β working minimal version in minutes. Speed matters when exploring. - Memory Retention: Tracked variable names, CSS conventions, and function signatures across sessions. Saved hours of hunting.
What AI Struggled With
- The Hallucination Tax: Invented APIs, referenced removed functions, confidently outputted broken logic.
- Context Limits: After ~100k tokens, early decisions vanished. Required constant re-anchoring.
- Scope Creep Enabler: Every
"can we add X?"seemed reasonable. The AI doesnβt say no to complexity.
The Humanβs Job
Knowing when to stop adding features was harder than saying yes to bad ones. Every feature adds maintenance burden and cognitive load. The spec became the boundary. It forced discipline. It preserved architecture.
Why This Matters for Teams & Open Source
Blossom isnβt built for enterprises. But its principles scale beautifully to collaboration:
| Benefit | Impact |
|---|---|
| Single Source of Truth | New devs read the spec instead of digging through git history |
| Explicit Roadmap | Contributors see β
, π§, π
, π‘ at a glance |
| CRUD for Ideas | Move Bookmarking from v3.0 β v2.0 without losing context |
| Decision Documentation | Comments/elaborations attach directly to nodes |
| Session Continuity | Start every meeting by reviewing: Whatβs done? Whatβs next? Whatβs new? |
A spec that exists is infinitely better than a perfect spec that doesnβt.
It transforms specification from a bureaucratic artifact into a living, version-controlled blueprint that evolves alongside your codebase.
No external tools. No Jira syncs. Just spec.md in your repo, diffing cleanly with every commit.
Closing: Let a Thousand Notes Bloom
When the idea of Blossom bloomed as I was closing the current MVP stages, I decided to commemorate the occasion by renaming LocalMark Studio to Blossom. The old name was functional. The new one is as intentional and resonant as it is zen-like. The tagline wrote itself:
πΈ βLet a thousand notes bloom.β
Blossom Specs ML is not a programming language. Itβs not a framework. Itβs a language for imbuing structure into open thinking. It surfaces ideas into mental models that both humans and AI can understand, share, and build upon.
In early sessions, I described features in natural language. The AI understood. Mostly. Sometimes it added buttons to the wrong toolbar. Sometimes it used the wrong icon. As the product grew, I needed a way to specify exactly what I wanted without writing ten-paragraph essays.
Prompt Engineering methods like RICE does not usually work if one is path-finding into previously unknown features. Being rigid and too overly structured from the start already constrains the outcome. For instance, you cannot give a specific example if the context and content is vague.
More importantly, interfacing to AI really means βspeaking in a tongueβ that both Man and Machine can understand - and this is what Blossom can help.
The solution emerged organically:
TopToolBar[
left: [Logo("Mβ"), Text("Blossom")],
center: [],
right: [Theme, Focus, Find, Import, Export{md, html, pdf, zip}]
]
Itβs not Turing complete. Itβs not supposed to be. Itβs a spec, not a program. It has a root. Branches. Leaves. Attributes. Status markers. You can nest arbitrarily deep. You can move nodes without losing context. You can commit it, diff it, and share it.
AI didnβt build Blossom on its own. I didnβt build Blossom alone. We built it together, session by session, conversation by conversation, over a few nights.
Let a thousand notes bloom β but this time, with some structure. πΈ
Appendix A: Comparing Blossom Specs ML to Prompt Engineering as a Methodology
Blossom Specs ML vs Prompt Engineering - The Fundamental Difference
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PROMPT ENGINEERING vs BLOSSOM SPECS ML β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Prompt Engineering Blossom Specs ML β
β ββββββββββββββββββ βββββββββββββββββ β
β "Write code that..." "Here is what exists. Here is its shape."β
β Imperative (do this) Declarative (this is true) β
β Session-scoped Persistent across sessions β
β Human β AI instruction Shared reference between human + AI β
β Lost after context expires Lives in repo, versioned with code β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Comparison Matrix
| Aspect | Prompt Engineering | Blossom Specs ML |
|---|---|---|
| Nature | Instruction | Description |
| Tense | Future (βdo thisβ) | Present (βthis existsβ) |
| Persistence | Ephemeral (per session) | Permanent (in repo) |
| State tracking | Human memory | Documented (β π§ π‘ π) |
| AI understanding | Good, but forgets | Excellent, structured |
| Human understanding | Requires reading | Visual, hierarchical |
| Change tolerance | Low (rewrite prompt) | High (update node) |
| Context efficiency | High token cost | Low token cost |
| Version control | Not applicable | Git-friendly |
| Collaboration | Single human + AI | Team + AI |
| Learning curve | Low | Low |
| Tooling | None needed | None needed |
How They Work Together
Prompt Engineering and Blossom Specs ML are not competitors. They are complementary.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β THE COMBINED WORKFLOW β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. Read Spec 2. Prompt Engineering β
β βββββββββββββββββββββββ βββββββββββββββββββββββ β
β β "Here's the current β β "Based on the spec, β β
β β state of Blossom" β βββββββββΊ β add Kanban view β β
β βββββββββββββββββββββββ β with columns..." β β
β β² β β
β β βΌ β
β 4. Update Spec 3. Build & Discover β
β βββββββββββββββββββββββ βββββββββββββββββββββββ β
β β "Kanban[β
]" β βββββββββ β "It works! But it β β
β β "DarkMode[π]" β β needs full width" β β
β βββββββββββββββββββββββ βββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The Problem Prompt Engineering Alone Cannot Solve
1. Context Loss
After 100,000 tokens, the AI forgets what you built in Session 3.
Session 1: "We built a markdown editor."
Session 5: "Remember the editor we built in Session 1?"
AI: "What editor?"
Blossom Specs ML solves this. The spec is the memory. The AI reads it fresh each session.
2. Inconsistent Naming
Prompt: βAdd a dark mode toggle to the header.β
AI adds: DarkModeButton
Later prompt: βAdd a theme switcher next to dark mode.β
AI adds: ThemeSwitcher (different component, different pattern)
Blossom Specs ML solves this. The spec defines the pattern once. All implementations follow it.
3. Hidden Dependencies
Prompt: βAdd a graph view.β AI builds graph view in the sidebar (wrong). Why? Because the AI forgot about the βfull-width viewβ pattern established for Kanban and Calendar.
Blossom Specs ML solves this. The spec shows the pattern:
Views[
Kanban[type: fullwidth],
Calendar[type: fullwidth],
Graph[type: fullwidth] β AI knows to use same pattern
]
4. Rework from Incomplete Information
Prompt: βAdd tags to notes.β AI adds tags to frontmatter (good). But doesnβt add a Tags view (missing).
Blossom Specs ML solves this. The spec defines both:
Tags[
extraction: frontmatter,
view: tag-cloud,
filter: click-to-filter
]
The AI sees the whole picture.
Prompt Engineeringβs Strengths (Where Blossom is Weak)
| Strength | Why |
|---|---|
| Exploration | Specs describe what exists. Prompts explore what could exist. |
| Edge cases | βWhat if the user pastes an image?β is a prompt, not a spec. |
| Debugging | βFix the dark mode bugβ is a prompt. The spec just marks it π. |
| Nuance | βMake the animation smootherβ is not spec-able. Itβs feel. |
Blossomβs Strengths (Where Prompt Engineering is Weak)
| Strength | Why |
|---|---|
| Persistence | Prompts are ephemeral. Specs live in the repo. |
| Consistency | Prompts vary. Specs define standards once. |
| State tracking | Prompts donβt track whatβs done. Specs have β . |
| Team collaboration | Prompts are personal. Specs are shareable. |
| Onboarding | New AI session? Read the spec. |
The Combined Methodology
Pattern: Spec-First Prompting
Step 1: Feed the spec to the AI
Step 2: Add the prompt
Step 3: Build
Step 4: Update the spec
Example:
[Read spec.md]
Based on the current spec, add a Bookmarking feature.
Bookmarking[
type: line-level,
trigger: click-gutter,
storage: metadata,
view: bookmarks-sidebar
]
Follow the existing patterns. Update the spec when done.
Token Efficiency Comparison
| Approach | Tokens per session | Notes |
|---|---|---|
| Prompt only | 500-2000 | Each session repeats context |
| Spec + short prompt | 200-500 | Spec provides context efficiently |
| Savings | 60-75% | Less repetition, more building |
Real-World Example
Without Spec (Pure Prompt Engineering)
Human: "Add a kanban board."
AI: [Builds kanban in sidebar]
Human: "No, kanban needs full width. Move it to main area."
AI: [Moves kanban, breaks layout]
Human: "The columns are stacked vertically. Make them horizontal."
AI: [Fixes CSS]
Human: "Add drag and drop."
AI: [Adds drag and drop, doesn't update status]
Human: "Update the note's status when moved."
... (continues)
Total prompts: ~15
Total tokens: ~10,000
Rework: High
With Blossom Specs ML
Human: [Shares spec.md]
Human: "Add kanban board. Use the fullwidth pattern from Calendar.
Columns: new, draft, review, published, archive.
Update note status on drag."
AI: [Builds correctly first time, following existing patterns]
Total prompts: 1
Total tokens: ~2,000 (including spec)
Rework: Minimal
The Verdict
| Statement | Verdict |
|---|---|
| Is Blossom better than prompt engineering? | No β different tools, different jobs |
| Does Blossom make prompt engineering better? | Yes β significantly |
| Can you use one without the other? | Yes, but you shouldnβt |
| Would I start a project with Blossom Specs? | No β emerge it |
| Would I continue a project without Blossom Specs? | No β write it now |
The One-Sentence Summary
Prompt Engineering tells the AI what to do next.
Blossom Specs ML tells the AI what exists now.
You need both. The spec is the memory. The prompt is the instruction.
Recommendation
If youβre building with AI:
- Start without a spec. Explore. Discover. Build messy.
- When patterns emerge, write them down in Blossom Specs ML.
- Use the spec as context for every subsequent prompt.
- Update the spec after each session.
- Watch rework drop. Watch speed increase. Watch the AI get smarter.
The spec doesnβt replace the prompt. It amplifies it.
Appendix B: Blossom DSL(v0.1)
At its core, Blossom is built from a few primitives:
- Nodes
- Properties
- Lists
- Inline structures
Hereβs a simple example:
UIComponent[ Name: TopToolBar Layout: [[Logo, LogoText], [Spacer], [Actions]] Actions: [DarkLight, Focus, Import, Export{md,html,pdf}]]
This expresses:
- Hierarchy
- Layout
- Behavior
- Relationships
Without requiring a single sentence of explanation.
What was once described verbally is now immediately visible:
Left: identity (Logo)
Center: spacing
Right: actions
Blossom captures this directly.
Formalizing the Language β EBNF
At some point, it became clear:
If this is a language, it should be treated like one.
Blossom formalized using EBNF:
Program = Node ;
Node = Identifier "[" Elements? "]" ;
Elements = Element ("," Element)* ;
Element = Node | Property ;
Property = Identifier ":" Value ;
Value = Identifier | String | List | Inline ;
List = "[" Elements? "]" ;
Inline = Identifier "{" Elements? "}" ;
Identifier = letter (letter | digit)* ;
String = '"' .* '"' ;
This makes Blossom:
- Parsable
- Extensible
- βRealβ as a DSL