Architect layer
Design
The name, addresses, meta and appearance of this project. Saved settings are read at runtime — a change shows on the next page load, with no rebuild.
Blocks
Every block this project can build a page from, drawn by the real renderer. Grouped by what the block is for.
A block is the unit a page is made of. A page here is not a laid-out file — it is a LIST OF BLOCKS. The renderers are already compiled; the page says which kinds stand on it, in what order and with what text. That is why every page in the project looks like one product rather than like the work of five different people.
A working screen rather than a page to read: a menu on the left, content on the right. Dashboards and project tools are built from this — the layout is taken from the architect layer that already runs on it, not invented here. On a phone the left column becomes a drawer that opens to 90% of the width and closes on any click. Menu entries are links only when they carry an address; without one they are plain marks, because a dead link in a catalogue is worse than no link.
Languages
Which languages the site speaks. Enabling one later is a setting, not a rebuild of the way the site works.
Add one language at a time
Each language is its own set of prerendered pages. Adding them one by one keeps a build failure attributable to a single change.
A language costs pages, not speed
Serving a prerendered page is the same work regardless of how many languages exist beside it — but every language multiplies what has to be generated.
Saving is not applying
The language set lives in the environment file and is baked in at build time. Until the project is rebuilt, the site keeps serving the previous set.
Enabled languages
This is the part a project fills with whatever it needs: fields, a table, an island. The block gives the frame and the rules; the content is yours.
- English — the base language
- Russian — the owner’s translation
The same kind with the optional top row of sections — the second case, and it is a FIELD rather than a second kind. The drawing is identical; only `tabs` appears. Two kinds would have drifted apart on the first theme change, exactly as a quote with a lead would have.
Blocks
The catalogue of what pages are built from. The type answers what to put here; the kind answers what draws it.
The catalogue is closed
A kind not declared in the set does not exist for the application, and the build refuses. That is the whole reason two pages of one site cannot drift apart.
Below the row goes whatever the section is about — here a catalogue, on a dashboard a chart, in a tool its own controls.
A run of messages as a section of the page: the feed of the project chat tool, without an input field. Take it to show a conversation — with a person, with an assistant, with a bot. Six kinds of attachment fit under a message: audio, image, video and document, which the library recognises by media type, plus a place and a calendar event, which are ours. A working chat is put in place by a consumer that owns the state.
Chat
One implementation of a conversation for the whole project — and everything a message can carry.
Sending the voice note and the photo from the site.
Got both. The photo is shown as a preview, the voice note as a row — the library decides that by media type, not by us.
Here is the walkthrough and the offer.
And this is where we meet.
The place and the event are ours: the library has neither, and both are drawn in the same row shape so a message keeps one list of attachments rather than two.
Forwarded messages keep the line above the text — who wrote it, when, and where it came from.