Paper holds the story.
Warm, quiet surfaces frame the book. Image and caption belong to print. Controls stay outside that promise.
A shared language for one collective book. The artwork gets the stage. The interface makes the next move clear.
Warm, quiet surfaces frame the book. Image and caption belong to print. Controls stay outside that promise.
Dark surfaces bring proposals, people, balances and conversations together. Content, not chrome, provides the colour.
Blue moves you forward. Neutral actions navigate and support. Red stays expressive, with explicit words when it means danger.
Inter speaks to people. JetBrains Mono labels the book, the clock and the numbers. Warm neutrals connect the physical object to its digital workspace.
Room for the image. A reason to remember it.
Open the bookProposals turn a shared idea into a place in print.
Explore proposalsThe dotted canvas adds structure behind the interface. Its color follows the selected light or dark theme.
Back the images you believe belong in the book. Your Ink joins everyone else's.
PAGE 041 / 100 · 25 INKsrc/lib/shared/design-system/tokens.csssrc/lib/features/tfti/tfti.csssrc/lib/features/mobile/mobile.cssPrimary actions commit or advance. Secondary actions support that decision. Navigation stays neutral. A disabled action explains what is missing nearby; loading prevents a second submission.
Use the product's verb. State the cost at the point of commitment.
Round controls belong to spatial navigation. Utility controls do not compete with the main action.
Red is part of TFTI's voice. Danger also needs an unambiguous label and a safe way out.
Add an image and a reason before taking a page.
Touch controls have at least a 44px target. Text can wrap; narrow screens never clip the action.
src/lib/shared/ui/Action.sveltesrc/lib/shared/design-system/controls.cssEvery field has a persistent label. Hints explain the requirement before submission. Errors stay beside the value that needs attention.
We send a one-time link. No password to remember.
10–40 characters, printed with your image.
Use letters, numbers or underscores. No spaces.
This field is unavailable while your account is being updated.
Dollars describe payment. Ink describes participation. The rate and the actual available presets come from the billing feature.
src/lib/shared/ui/TextField.sveltesrc/lib/shared/ui/CustomAmountField.sveltesrc/lib/features/billing/components/DepositAmountPicker.svelteThe same dialog becomes a bottom sheet on a phone. The title says what happens here, the context survives dismissal, and keyboard focus stays with the task.
Toasts confirm a completed action. Important errors also stay in the affected screen.
src/lib/shared/ui/Dialog.sveltesrc/lib/shared/ui/dialog.tssrc/lib/shared/ui/Feedback.sveltesrc/lib/shared/ui/AppToaster.svelteThe six-step introduction uses the current onboarding artwork. Big ideas get short sentences. The final blue action hands the visitor to the book.
So we’re printing one. 100 pages, ten days. Then it’s over.
Tell everyone why it belongs in the 2026 snapshot. No reason, no page.
Every take costs 1 Ink more than the last. Get in before you can’t.
Pool your Ink with everyone who agrees. Take the page together.

Printed once. Nobody can delete it.
Whatever gets defended is what 2026 looks like. Clock’s running.
src/lib/features/arrival/components/Walkthrough.sveltesrc/lib/features/arrival/components/steps/StepVisual.sveltesrc/lib/features/arrival/data/steps.tsThe image leads. The live price, holder and remaining balance frame the decision. The printed caption and the consequences are stated before the blue commitment action.
src/lib/features/tfti/components/ClaimForm.sveltesrc/lib/features/tfti/components/ConfirmSheet.sveltesrc/lib/features/tfti/components/confirm-sheet-copy.tssrc/lib/features/tfti/components/CropModal.svelteThe available balance is the main fact. Buying Ink is the next action. Missing data is shown honestly, with a recovery path instead of an invented zero.
Every page is priced in Ink. 1 Ink costs $1.
Every page is priced in Ink. 1 Ink costs $1.
src/lib/features/wallet/components/WalletBalance.sveltesrc/lib/features/wallet/components/WalletView.sveltesrc/lib/shared/ui/Screen.svelteShow what the pool has, what it still needs, and what the next contribution changes. A head start is distinct from contributed Ink.
Proposals · pool your Ink · take any page
Pitch the image you want, seed the pool with a little Ink, and let everyone who wants it add more. The moment the pool reaches the page price, the image takes the page.
Pool Ink with your friends, your server, your whole corner of the internet, and take the pages nobody could take alone.
One proposal, two compositions. List rows lead with the author and pitch; cards lead with the image and the Ink still needed. Gold marks a pool at least 80% funded. These are the app components with illustrative data; preview actions do not spend Ink.
8 of 20 INK pooled · 12 still needed
+1 INK from you
Newest first · swipe up for older versions
Illustrative targets. Selection is neutral; the blue confirmation in the revive dialog commits the choice.
The striped area previews the next contribution; it is not yet part of the pool.
2 INK pooled · 8 INK head start · 20 INK goal
The marked segment explains why this pool is already halfway to the page. A head start is not a wallet deposit.
Opening a pool uses 1 proposal credit. You have 4.
Proposal credits are spent when the pool opens and are not refunded, even if it expires. If the pool expires, your Ink stake is refunded in full.
You're out of proposal credits.
Proposal credits are spent when the pool opens and are not refunded, even if it expires. If the pool expires, your Ink stake is refunded in full.
One Ink buys 10 proposal credits.
Illustrative balances and exchange rate. The app reads these figures from the wallet.
src/lib/features/tfti/components/PoolProgress.sveltesrc/lib/features/tfti/components/ChipInSheet.sveltesrc/lib/features/tfti/components/ProposalCreditLine.svelteThe kit is a living reference, not a separate mockup. Change a shared component, then check it in the product before calling the change complete.
Colour, type and geometry come from shared tokens. Actions, fields, dialogs and navigation render their production components here. Product patterns inherit them.
Use “Ink” for participation, dollars for payment, and “proposal credit” in full. Explain pending, failed and empty states without pretending a result is known.
Test keyboard focus, touch targets, reduced motion, errors, long content and zoom. Colour supports meaning; it never carries meaning alone.
Before changing Figma or shipping code, compare the same component states at phone, tablet and desktop widths. Record deliberate exceptions in the rollout log.
tfti-plan/v2/work/design-system-rollout.mdtfti-plan/v2/work/design-system-progress.md