Most AI content is written for one of two rooms. Either it's a sales deck full of words like "transformative", or it's a developer blog that assumes you know what a token is. Cannabis operators fall in the gap. You have real problems (Metrc discrepancies, invoice matching, a menu that's wrong on three platforms) and you'd use AI tomorrow if someone told you plainly how.
So every page here reads at three levels. Level 1 is plain English: what to do, what to type, what to expect back. Level 3 is the same page for the person who will wire it up: real commands, config, the gotchas. Level 2 is the bridge between them, carrying both vocabularies in one sentence while the story stays the same.
Most AI content is written for one audience. Sales decks for owners, developer blogs for engineers. Cannabis operators fall in the gap, and so does anyone who has to translate between the two. This site is written once and rendered three ways: the skeleton (headings, exercises, giveaways) is shared, and the technical vocabulary is swapped in and out by level. You are on level 2, where both vocabularies appear together. It is the level to read with a colleague from the other side.
The site is a static Astro build. Every lesson is one MDX file whose title, summary and body are authored as a shared skeleton with level-gated parts: <Level from to> blocks, <Term> glossary phrases with three renderings each, and <Swap>/<Lv> for inline text. All three renderings are in the HTML; a data-level attribute on <html> (persisted in localStorage, applied inline before first paint) decides which one CSS shows. No hydration, no reload, no per-level routes to keep in sync.
Content rules live in docs/CONTENT_CONTRACT.md. Agent instructions live in AGENTS.md. Schema enforcement is Zod via Astro content collections; a bad frontmatter field fails npm run build with a path and a reason. npm run lint:content catches banned words, missing exercises and unknown glossary keys.
The three stopsThe three stopslevels
- 1 · Plain English. No jargon at all.
- 2 · Bridge. Both vocabularies side by side.
- 3 · Technical. Full jargon; assumes you can read JSON and run a terminal.
Move between them with the dial in the top bar. It stays put while you scroll. Your choice is remembered, and any link works at any level: add ?level=3 to send someone straight to the bridge.Move between them with the dial in the top bar. It stays put while you scroll. Your choice is remembered, and any link works at any level: add ?level=3 to send someone straight to the bridge.Dial in the top bar (sticky). Hotkeys: ⌘/Ctrl+⇧+←/→ steps, ⌘/Ctrl+. jumps to the other end. ?level=n forces a level and persists it. Search engines index level 1; blocks from level 3 carry data-nosnippet.

Buddy, the course guide, can work out which of the five suits you from five quick questions. He can also answer questions about any lesson, at whatever level you are reading.Buddy, the course guide, can work out which of the five suits you from five quick questions. He can also answer questions about any lesson, at whatever level you are reading.Buddy: placement check (five questions, scored in the browser) and a lesson Q&A that takes the reader's level with every question.Take the checkTake the check./levelcheck
Who made thisWho made thismaintainers
Distru builds software for cannabis manufacturers and distributors. We talk to operators all day and watch the same problems come up. This course is the stuff we'd tell a friend over coffee. It is not a pitch: the lessons work with whatever software you already run, and we say so when a problem needs no AI at all. There is one demo link in the sidebar if you want to see what we build, and that is the whole of the sales pitch.Distru builds software for cannabis manufacturers and distributors. We talk to operators all day and watch the same problems come up. This course is the stuff we'd tell a friend over coffee. It is not a pitch: the lessons work with whatever software you already run, and we say so when a problem needs no AI at all. There is one demo link in the sidebar if you want to see what we build, and that is the whole of the sales pitch.Distru engineering and GTM. Contributions welcome: node scripts/new-lesson.mjs to scaffold, npm run check:all to validate.
What “No Bullshit” means hereWhat “No Bullshit” means hereprinciples
- We say when AI is the wrong tool.We say when AI is the wrong tool.Name the failure modes. Say when an LLM is the wrong tool.
- We don't pad. If a lesson is four minutes, it's four minutes.We don't pad. If a lesson is four minutes, it's four minutes.No padding, no preambles.
- Every handout is free to download with no account. Lessons are free to read too, behind a name and an email.Every handout is free to download with no account. Lessons are free to read too, behind a name and an email.MIT. Handouts are ungated; lesson bodies sit behind auth (name + email, no payment).
- Design intent: level 1 is neo-brutalist (heavy ink strokes, hard offset shadows, flat colour, 18px Roboto); level 2 balances the two (thin tinted offsets, a faint grid, mono labels); level 3 is cyber core (near-black, neon edges and glow, HUD corners, scanlines, JetBrains Mono, 15.5px, square). The flip should read as a change of register, not a theme toggle.