• v.1.0.0-beta.5 60852f13e6

    v.1.0.0-beta.5 Pre-release

    abiwab released this 2026-07-26 10:26:43 +02:00 | 0 commits to main since this release

    Release Notes - v1.0.0-beta.5

    Cleaning up the codebase

    Hi! Let's cut right to the chase: this beta 5 is about making sure the whole engine actually holds together reliably.

    As a solo developer working on Gram and learning as I go, the project has quietly turned into a pretty sizable monorepo (parser, kitchen, analyzer, renderer, cli, lsp, format). Recently, I ran into a — reportedly — classic problem: tweaking a line in one package would randomly break something else three packages away.

    Before adding any more features or syntax additions, I thought it would be preferable to stop and build a proper safety net. So for this release, I spent some time digging through the codebase, fixing edge cases, and locking down test suites and golden files across every package.

    Along with all that internal cleanup, this release packs many changes covering a brand-new code formatter, interactive Gantt charts right in VS Code, SSRF security guards, full rendering parity between Markdown, HTML, and printable HTML (gram print), and some long-overdue unit fixes for French recipes.


    Formatting & VS Code Tools

    • Standalone Formatter (@gram-lang/format): Extracted the formatting logic into its own package with 13 canonical rules. gram format in the CLI and Format on Save in VS Code now use the exact same engine.
    • Frontmatter Safety: gram format won't mess with casing inside frontmatter metadata blocks anymore (so emails like Jean@Example.com stay as-is).
    • Spacing Cleanup: Fixed #cookware at line starts being misread as section headers, and enforced exactly one blank line before ## Section titles.
    • VS Code Gantt View: You can now open a real-time Gantt chart panel right inside VS Code to inspect your recipe timelines while typing.

    Parser & Syntax Fixes

    • Sigil Swallow Bug: Fixed a nasty bug where bare mentions like @ingredient or #cookware without {} swallowed subsequent items or timers further down the line.
    • TextMate Highlighting: Aligned the VS Code syntax highlighter so it stops matching names at @, #, ~, ^, and &, fixing color bleed across lines.
    • Fraction Edge Cases: Fixed decimal numerators (1.5/2 no longer gets truncated to 0.5) and properly rejected zero denominators (1/0 no longer turns into null/Infinity).
    • Headerless Recipes: Fixed LSP crashes and missing symbols on recipes that don't start with a ## Section header.

    Engine & Calculation Fixes

    • ALAP Scheduling across Empty Sections: Empty or comment-only sections no longer mess up ALAP timing for following steps.
    • Named Track Chaining: Chaining steps on the same passive track (~_oven{...}) no longer triggers false conflict warnings.
    • Indirect Cycles: The compiler now catches indirect circular dependencies between sections and warns you about them.
    • Scaling Fixes: gram scale now scales cookware properly, eliminates float rounding noise like 110.00000000000001, and rejects extreme multipliers cleanly instead of crashing.
    • Timer Warnings: Unrecognized time units now produce proper warnings instead of fake durations.

    CLI & Security Hardening

    • SSRF Protection in gram import: gram import now refuses to fetch local or private addresses (localhost, internal IPs, cloud metadata), even across HTTP redirects.
    • API Key Isolation: Fixed a bug where an API key could leak to the wrong provider if multiple keys were set in your environment.
    • Safer DB Enrichment: gram db enrich rejects physically impossible AI suggestions (like absurd densities) and won’t claim success if nothing was written to disk.
    • Clean Terminal Output: Invalid DB entries now print warnings to stderr instead of stdout, so piping gram build | jq works reliably again.

    French Unit Fixes

    • livre: Now uses the French metric pound (500g) instead of the imperial pound (453.59g).
    • tasse: Now uses the French cup (250mL) instead of the US liquid cup (236.58mL).
    • quart: "Un quart d'heure" is no longer misidentified as a liquid quart volume in French recipes.
    • pinte: Emits an explicit unknown-unit warning instead of guessing a wrong number.
    • Language Awareness: language: in .gram/config.yaml now actually drives unit resolution and supermarket category sorting.

    Rendering & Parity

    • Full Format Parity: Markdown (toMarkdown), HTML, and printable HTML (toPrintHTML/gram print) now show the exact same information:
      • Markdown recipes now include full nutrition tables.
      • Recipe comments render as numbered footnotes in both Markdown and print output.
      • Gross vs. net weight notes (e.g. "1 avocado" vs usable flesh) show up everywhere.
      • Mixed unit warnings ("100g" + "1 cup") are grouped consistently across all exports.
    • XSS Neutralization: Raw HTML tags (< and &) are now escaped in toMarkdown and timing tooltips.
    • Print View Fixes: Fixed sodium showing up in grams instead of milligrams in print view (toPrintHTML), and fixed blank nutrition warnings.

    Language Server Resilience

    • No More Editor Crashes: A malformed ingredients.yaml, a remote workspace, or a failed background reload will no longer crash the entire VS Code extension session.
    • Fresh Buffer Operations: Formatting, renames, and code actions now operate directly on live editor state rather than stale disk files.

    What's Next?

    I feel like taking the time to do this cleanup was absolutely necessary at this stage. It actually gives me much more confidence for everything I want to implement after the V1 launch.

    On a more personal note, I have to say that I'm having an absolute blast building Gram. Watching this project come to life, mature, and become more robust and genuinely useful makes me happier than ever ☺️

    I feel like the feature set for the official V1 launch is now complete. Obviously, there are a million more features I want to add in the future, but I'm forcing myself to stay disciplined and stick to this first major milestone. It's certainly not 100% perfect, but when I look back at where this project started compared to where it is today... it feels pretty great!

    My main goal now is to prepare for the official V1 release: revamp the documentation homepage to introduce Gram better, and iron out the last few bugs that I may find.

    The next steps will arrive very quickly. I've already populated the backlog (over on Projects) with plenty of issues and big features planned to make Gram even more powerful down the road.

    Until then, please give beta.5 a spin, don't hesitate to share the project with people around you and let me know if you run into anything! À bientôt !

    Downloads