Baseline owns its copy of the receipt
The receipt code was copied in, not imported, so Baseline can change it freely.
Possible documentation pages for the Image Portal prototypes, built only from the pieces of the Visual Aid Atlas (charts and diagrams, numbered V) and the Type Atlas (text elements, numbered T).
Each page type comes in several radically different templates. Every template is a real, filled page you can read, click and resize.
Content: the Baseline prototype, the receipt feature and the silo rules. Facts from the repository are real; anything made up has an orange dotted underline.
The start page of one experiment: what it is, what to open, where to read on.
A full-bleed poster: generative art, one sentence, two buttons. Four numbers you can click, then the buying journey as a metro map whose stations open the screens.
Today's model, clickable. Search, buy and get a receipt, as a company or as a private person.
Numbers from the repository. Sparklines show invented weekly history.
The classic three-column docs page: nav tree left, page in the middle, on-this-page right. Quiet and predictable; the visual summary is a strip of four key facts.
Today's model: main group, license group, product, base prices.
Ferdinand (UX) answers design questions for the checkout.
The prototype team keeps this page and the status up to date.
The experiment as a newspaper front page: the latest change is the lead story, numbers sit in the rail, a ticker rolls the small news. Serif, columns, dense.
Today's model, written up for designers, product owners and developers
Companies and private buyers see the same prices, with the VAT on its own line.
The design split buyers. Companies saw prices without VAT, private buyers with.
Ferdinand (UX) changed that on 8 October: every customer sees prices including VAT.
Every price says “incl. VAT”. Totals show subtotal, VAT (25 %) and total.
Prices are whole kroner. 1 711 kr plus VAT is 2 139 kr, not 2 138,75. D11
Admin prices stay excluding VAT. Only customers see the VAT added.
No hero, no prose: the experiment's folder tree is the navigation. Every leaf is a page or a screen, so developers and designers read the same map.
One folder is one website. Blue leaves are docs pages, orange leaves are app screens, grey is code.
Start in app/, then check components/.
Start in -lib/rules/, then
routing.
Show the feature first, then say three things about it. Here: the receipt.
The thing itself, big and tilted on a brand-coloured stage, like a product shot. Three bold facts and two buttons beside it; the six sample cases as chips underneath.
A comic strip carries the whole idea before a single rule is stated: who gets the receipt, when, and why it must not change. Three numbered take-aways follow, each a link.
The receipt feature, in four panels. Story invented; the rules behind it are real.
An isometric exploded drawing shows the feature as a stack: one order snapshot, one component, three outputs. The four real build steps sit underneath as a strip.
Screen, print and PDF come from the same React page.
Checkout copies lines, prices and buyer.
React renders the snapshot as an A4 sheet.
Opens the page in print mode, from localhost. R5
A4 with margins and page numbers.
Learning by doing: a safe path with a result at the end. The reader follows; the page checks they got there.
A progress header and six steps. Each step pairs one action with a small picture of what you should see, and a box to tick when you see it. The header fills up as you go.
Press Alt Shift P to open the prototype menu. Choose Kari, the private person.
Search for ski. Open the ski jumper over Holmenkollen.
Choose Editorial. Every price says “incl. VAT”, for every buyer. D3
Open the cart, go to checkout, and press Pay now without ticking anything. The button always works; it points out what's missing. D8
Private persons tick two boxes; companies tick one. D15 There's no payment step yet. D14
The tutorial is a conversation. A guide gives one instruction at a time; you answer with a reply button, which reveals the next message. Checkpoints fill in the side rail.
A dark, code-first lesson for developers. A rail of numbered lessons with times; each lesson is one command, its output, and what to notice. Ends by breaking a rule on purpose.
~/im-web-prototypesbun install ✓ 412 packages installed ✓ commit gate on (.githooks)
Installing also turns on the commit gate. Every commit is checked from now on.
~/im-web-prototypesbun scripts/new-prototype.ts baseline price-test ✓ copied 118 files → src/routes/prototypes/price-test ✓ rewrote routes and PROTOTYPE_ID ✓ regenerated route tree and agent rules
Your copy gets its own server state, so the two never share orders or carts.
Folders are the routes. A leading
- hides a folder from the router;
_ adds no URL. Routing
Open price-test/ and change
the title.
staticData and the type
checker stops you.
Import the receipt's VAT helper straight from the receipt feature, then commit.
~/im-web-prototypesgit commit -am "Use the receipt's VAT" ✗ fallow: price-test imports features/receipt ~/im-web-prototypesbun scripts/copy-from.ts receipt prototypes/price-test vat.ts ✓ copied vat.ts → -lib/from-receipt/ ✓ noted source commit in copied-from.json ~/im-web-prototypesgit commit -am "Copy the receipt's VAT" ✓ format · lint · fallow: all clear
Experiments never import each other. Copy instead; your copy is yours to change.
One task, for someone who already knows what they want to do. Steps, no theory.
The whole task on one ruled index card: what you need on the left, three steps on the right, the menu drawn as you will see it. Nothing to scroll past.
A docs-shell page whose lead is a yes/no flowchart: most readers stop at their first “yes”. The command only appears at the end, for those who need it.
Answer from the top. Stop at your first yes.
# from the repository root $ bun scripts/copy-from.ts features/receipt prototypes/baseline receipt-page.tsx copied receipt-page.tsx, receipt.tsx, types.ts, vat.ts wrote prototypes/baseline/-lib/from-receipt/copied-from.jsonThen point your imports at -lib/
Never import across experiments. Fallow refuses the commit. See who may import whom.
The source commit is recorded in copied-from.json, so drift can be shown later.
The reference is copied too, never imported:
reference/
A dark, terminal-flavoured page where the command is the headline. Every word of it is labelled in place; below come the three results and the four ways it can fail.
“Refuses to overwrite” means your copy has changed since. Keep
it, or add --force to take the source again.
“Target must be <prototypes|features>/<id>”: you
typed a path. Use prototypes/baseline, not
src/routes/…
“Source and target are the same experiment.” Inside one experiment, just import.
Want a different folder? Add --into rules to copy
into -lib/
Last step: point imports that used the source at the copy. Not sure you should copy? · Why copy at all?
Look it up, don’t read it. Fields, rules, names and who may use what, complete and in a fixed order.
A real path, cut into coloured segments, is the first screen; under it a sticky row of names jumps into a three-column dictionary: name, what it means, where you’ll meet it.
URL:
/prototypes/
entries for the nav.
_docs puts the docs shell around docs pages.
-lib and
markdown in -docs sit next to the routes that
use them.
_docs and
app instead.
Full rules and reasons: why the routes look like this. Names after TanStack’s file naming conventions.
Dense and tool-like: all 36 Baseline decisions as a waffle you can click, then one line each under a sticky filter bar with group chips, counts and live search.
Split screen: a dark adjacency matrix answers “may A import B?” at a glance and explains any cell you tap; the light side lists each folder as a card.
Row imports column. Tap a square.
| Baseline | Receipt | Image grid | Platform | Reference | Docs site |
|---|
One experiment: its docs, app, code and markdown.
Neutral building blocks: UI, formatters, media fixtures, docs shell, chart engine, design tokens.
im-web today, team proposals and the working model.
Docs and the lists of experiments, plus the root routes.
Checked by Fallow after every edit and before every commit. What would go wrong without it?
Why it works this way. For reading away from the keyboard: context, reasons, trade-offs.
An illustrated essay: the metaphor picture first, then a centred serif column with a drop cap, notes in the margin and one pull quote. On a phone the notes drop into the text.
Prototypes are allowed to disagree. Sharing code would make them agree by accident.
Experiments test ideas that contradict each other. One prototype may show prices without VAT while another shows them with it. Both have to keep working.1
So each folder is a silo. Its docs, app, code and markdown live together, and it imports only itself and the platform.
The platform holds no opinions. UI parts, formatters, media and the docs shell: mechanisms, never product decisions.2
“Nothing has to stay compatible across them.”docs/routing.md
Yes, on purpose. A copy can change freely. An import would tie two experiments together, and the next change to one would quietly change the other.
Copies remember where they came from. The script records the source commit, so drift can be shown later.3
A tool, not good intentions. Fallow checks imports after every edit and again before every commit. A cross-import never reaches the repository.
The cost is small. About one copy a week, against never wondering whether a change here broke a test over there.
Starts from what people wrongly believe. One myth fills the first screen, struck out beside its fact; smaller pairs follow; leftover questions fold into an accordion.
“I’ll just import the receipt into my prototype.”
You copy it. The commit with the import is refused.
Fallow, before every commitAnd why the repository works the way it does.
No. The receipt keeps its own licenses, prices and buyers (R6). Prototypes may change their samples freely.
From the route tree. Nothing else lists pages, so nothing falls out of step. Route names
Copy it twice, or change the reference and copy again. Decide with the flowchart
An explanation you operate: a sentence with live numbers, a network that tangles when you allow cross-imports, and the count of ties that a change could break.
With 6 experiments and cross-imports , a change in one experiment can reach 0 others.
Silos: each experiment ties only to the platform. One more experiment adds one tie.
Counting every possible import. Real repos use fewer, but nobody can see which. Read the long version
One UI component: every variant side by side, and what to check in each.
No diagram and no prose: the page is a wall of live mock-ups, one per situation, each with its own tick list. Filter chips pick a customer.
One panel, six situations. What it offers depends on the plan of the customer you view the site as.
An engineer’s data sheet: a blueprint-blue spine holds the facts, and four tabs hold one view each. It opens on the measured drawing.
All measures are illustrative; the design file has the real ones.
canPay
isPrivate
const canPay = termsAccepted 1 && (buyer === 'company' || waiverAccepted) 2 <PayNow total={order.total} 3 onPay={() => send({ type: 'PAY' })} /> 4
Guards quoted from
-lib/
The screen itself leads, with numbered markers; hover a number to light its part. Below, a three-frame film strip shows the component change state.
The right-hand panel in checkout. Seven things on it are decided.
A dark poster of right and wrong pairs, each with its reason, ending in a one-click quiz. The component is the smallest one there is: a price.
Every price on the site, from the panel to the receipt. Five rules, all decided.
A base price of 1 711 kr. What does the customer see?
What was decided, why, and what else was on the table. Example: D5, prices including VAT for everyone.
One sheet of paper, like an architecture decision record: a stamp, four key facts in a ruled strip, the options as three columns, then consequences.
The design split buyers in two. Companies saw prices without VAT, private buyers with.
Now one price for all, in the panel, mini cart, cart, checkout, confirmation and receipt.
The admin is unchanged: base prices are still entered excluding VAT.
“incl. VAT” beside every price. D3
Whole kroner, since 25 % gives øre. D11
The receipt follows suit. R7
The checkout chart’s comment is now out of date. To fix
The first screen is the change itself: grey past on the left, coloured present on the right, with the old price struck out. The rule’s wording follows as a word diff.
New wording from D5; the old wording is reconstructed from the checkout chart’s comment.
Ferdinand (UX) answered question 1 in Slack on 8 October.
One price is easier to test than two that depend on the workspace.
Not changed: the admin still takes prices excluding VAT.
A story told as a timeline: the question, the chat where it was answered, the edit to the rule. A side panel keeps the outcome in view the whole way down.
Five moments in nine days.
Prices were entered without VAT in the admin that was tested.
Companies without VAT, private buyers with. The prototype copied the design.
Answers and date are real; the wording is reconstructed.
Before you test a prototype: what to set up, what to ask, what to watch for.
A cockpit for the facilitator on test day: the agenda as a Gantt bar, a ticking checklist with progress, keys and customers at hand. Built to be glanced at, not read.
A print sheet on a cutting mat: big serif task cards for the participant, handwritten stickies with what to watch for the facilitator. The stickies don’t print.
Print, cut, hand over one at a time.
Your paper needs a picture of a ski jumper for tomorrow’s sports page. Buy one.
Viewing as Aftenposten · no planYou want the same picture for your newsroom’s Instagram too. What will it cost?
Look for “Web and social media”You’re buying a photo of the northern lights for yourself. Go all the way to paying.
Viewing as Kari · privateYour accountant asks for proof of what you paid. Find it.
Ends at the receipt PDFThe test is laid out as the buyer’s journey: stages across, rows for the task, the screen, what to watch and the rules in play, with an expected-mood line on top. On a phone it folds into one column per stage.
Task: search “nordlys” on Search.
Editorial tab first: does Kari switch? (D25)
Task: pick the web license on the image page.
Three licenses: is the choice clear? (D6, D3)
Task: check the total in the cart.
Looks for VAT? (D10, D11)
Task: read what you agree to in checkout.
Opens the terms, or not? (D15, D22)
Task: press Pay now.
Presses with a box unticked? (D8, D14)
Task: open the PDF from the confirmation.
Expects an email? (R1, R7)
* The mood line is our guess, to compare with what you see. Task cards · Run-sheet · Status: what isn’t built
How the parts fit: what may depend on what, and what happens in which order.
A poster: the layered diagram takes the whole first screen, four short floors read left to right under it, and a dark strip ends the page with what is checked before every commit. On a phone the drawing becomes stacked HTML layers.
Every experiment stands alone. It may use itself and the platform, nothing else.
✕ No silo imports another. Reuse means copying.
↓ every silo may import ↓
im-web today, proposals, the working model. Copied in, never imported.
The routes are the only list. Nav, breadcrumbs and tab titles come from them.
One folder per experiment. Docs at its URL, the running thing
under app/.
Every experiment may import it. It holds mechanisms, never product decisions.
Read by people, copied by code. Improve the working model there, then copy again.
From docs/routing.md and AGENTS.md. The experiments are the folders in the repository today.
An explorer instead of an essay: a list of experiments down the side, a network and an import matrix in the middle. Pick one and everything else fades; three boxes say what it may use, what it copied and what is refused.
Pick an experiment.
Architecture told as one request, drawn on blueprint paper with a title block: a sequence diagram of how a receipt becomes a PDF, numbered steps with the files involved, and the bug that shaped it crossed out in red.
Six hops, one rule: Chrome reads the page from this machine.
One real artefact, its parts lettered, every letter tied to the rule behind it. Here: what’s on a receipt.
The V69 drawing blown up to fill the first screen: the sheet in the middle, every part lettered and named on both sides. A lettered key with links follows. On a phone the letters sit on the sheet and the key becomes the page.
Features / Receipt / What’s on a receipt
Eleven parts, each there because of a decision. Click a letter to read why.
Layout and rules from the receipt feature. Buyer from its sample data. Picture titles, IDs, credits, order number, reference and PO number are made up.
The receipt stays pinned while short steps scroll past; each step dims the sheet and lights up one lettered part. Reads like a guided walk from the top of the paper to the bottom.
Scroll. The sheet stays put and the part you’re reading lights up.
A dark desk, the receipt on it, pulsing letters to tap. One explanation at a time in a side card, next and previous to walk through, dots to show what you’ve seen. “Show all names” labels every part at once.
Eleven parts. Each one is there for a reason.
Want the whole list instead? Read the receipt decisions or open a sample receipt. Picture titles, IDs and order number are made up.
The receipt as real, selectable text, read like a proof on the desk: lettered labels in the margin, and highlighter in four colours showing which decision governs each phrase. Press a colour to isolate it.
The colour says which rule a line follows. The margin says what the part is.
13 October 2026
Oslo
NTB AS · Skippergata 24 (Pressens hus), 0154 Oslo · Boks 6817 St. Olavs plass, N-0130 Oslo · ntb.no · kundeservice@ntb.no · Org. no. 000 000 000 MVA
Aftenposten AS
Org. no. NO 912 345 678 MVA
Akersgata 55, 0180 Oslo
Attn. Ola Nordmann
Receipt
Image licenses from NTB Bilder og video
Editorial use · NTB Editorial
One time editorial use in one publication.
◆ For editorial use only. Not permitted in advertising or commercial contexts.
Web and social media · NTB Editorial
Editorial use online and on social media for 12 months.
◆ ntb-9d4x6 EDITORIAL USE ONLY. No use in betting or games.
What you can try today, what isn't there yet, and what changed. The page people check before a meeting.
The page is a kanban board and nothing else: three columns, one card per fact from status.md, and chips that dim what isn't for you.
Updated 8 October 2026 · from status.md · open the prototype
Older states: changelog · all decisions
A serif logbook: a strip of days as the visual summary (bar height = changes that day), then one dated entry per change, newest first, typed New, Changed or Fixed.
Checkout now follows Ferdinand's answers. Everything else this week was the admin, the docs and how experiments are kept apart.
The receipt code was copied in, not imported, so Baseline can change it freely.
Docs live at /prototypes/baseline; the running prototype at
/prototypes/
Every buyer sees prices including VAT. One box accepts the license terms.
Public prices now come from the admin, as tested on 30 September.
The top menu opens under its own button and the sidebar collapses, like the tested admin.
The page no longer shifts when a menu panel opens.
A shared link now gets the receipt, not the tunnel's warning page.
A dark dashboard of tiles: four big numbers, a waffle of decisions, bullet bars for how far each area has come, and a screen inventory with status dots. No prose at all.
All decided. Read them
Search to receipt. Open
Front page, history, plans…
Flask menu, who
Bar: share built. Tick: what the user test needs. Bands: rough, usable, done.
The words this repository uses, in one place, so a newcomer can read any other page.
First screen: every word placed where it lives in the repository, as clickable chips on a silo diagram. Then a classic dictionary with an A–Z rail down the side.
Fifteen words explain most pages. Click one on the map to jump to it.
The docs pages of an experiment. The underscore keeps it out of the URL.
Example:
baseline/ is the
page /prototypes/
An experiment's code: components, rules, decisions. The dash hides it from the router.
Markdown for people, like the status page.
See also _docs.
The running prototype or feature. Reserved for nothing else.
Example: /prototypes/
Where sources disagree, the one answer an experiment uses. Numbered: D5 in Baseline, R7 in the receipt.
See Baseline's decisions.
Refuses a commit that imports across silos. It also finds unused code.
One part, built to work on its own. The receipt is a feature.
Neutral building blocks every experiment may import: UI, formatters, the docs shell.
src/
A whole site to click through. Baseline is one.
im-web as it is today, plus proposals. Read it, copy from it, never import it.
Each experiment is sealed off. It imports only itself and the platform.
Every page's title and description. Tabs, breadcrumbs and the nav are built from it.
Reuse means a copy in
-lib/, with the
source commit noted.
The business rules experiments start from. Baseline keeps its own copy.
A deck to learn the words: each card shows a tiny picture of the idea; tap to flip to the definition. Built for a newcomer's first hour, not for looking things up.
Guess first, then tap to flip.
Full list: the glossary · Where they come from: How routing works
Something went wrong. Start from what you see, end with what to do.
The page opens on the exact message you got, in a terminal, with tabs for the four ways a commit is refused. Below: what it means, how to fix it, how to check, in three columns.
For people testing the prototype, not coding it. A fishbone of the four usual causes leads into an accordion of symptoms, each opening to cause and fix.
It's usually one of four things. Find your symptom on a bone, or in the list.
Only private buyers see it. You are in a company workspace.
Switch to Kari in the flask menu: Alt Shift P. D15
Aftenposten has no plan. It's the "no plan" case on purpose.
View as Bergens Tidende (quota) or Stavanger Aftenblad (subscription). D38
A box is unticked. The button always works and points at what's missing.
Tick the license terms. Private buyers also tick the waiver. D8
An old copy, shared through a tunnel. This was fixed on 8 October.
Ask whoever shared the link to update and restart. R5
Checkout isn't made for phones in this round.
Test on a laptop. D31
It isn't designed yet.
Start from search instead. Status
Still stuck? Ask in #im-web-prototypes with a screenshot and the customer you viewed as.
Two cases of the same thing, side by side: what's shared, what differs, and the rule behind each difference.
A Venn diagram is the whole story at a glance; a rule-by-rule table under it gives the proof, with the differing rows tinted. On a phone the Venn becomes three stacked boxes and the table becomes cards.
Most of checkout is the same for both. Three things differ. The workspace decides which one you are.
| Rule | Company | Private | Source |
|---|---|---|---|
| Prices include VAT | ✓ | ✓ | D5 |
| Totals: subtotal, VAT (25 %), total | ✓ | ✓ | D3 |
| Buyer type from the workspace, not chosen | ✓ | ✓ | D13 |
| One box accepts the license terms | ✓ | ✓ | D15 |
| Waive the right of withdrawal | – | ✓ | D15 |
| "Ordered by" line with name and email | ✓ | – | D19 |
| Invoice reference or PO number, optional | ✓ | – | D20 |
✓ applies · – does not · tinted rows differ. Try both: view as Aftenposten or view as Kari.
A poster-like face-off: the two checkouts as real mock-ups, left and right of a big VS, with numbered yellow marks on what differs and a switch that fades everything that's the same.
Same images, same prices, same total. Only the yellow parts differ.
Company viewing as Aftenposten AS
Aftenposten AS
Org. no. 912 345 678
Akersgata 55, 0180 Oslo
Ordered by Ingrid Haugen, ingrid@aftenposten.no
Ski jumper · Northern lights · Sailing boat
Not shown to companies
Private viewing as Kari
Kari Nordmann
Storgata 1, 0155 Oslo
kari@example.no
Ski jumper · Northern lights · Sailing boat
Not shown to private buyers
Before 8 October, companies saw prices without VAT. Now both see 4 514 kr incl. VAT (D5).