Build log · sandcastlelabs.ai
Week one: V1 of the site, and the parts that are not done
Week one of sandcastlelabs.ai is live, and so is a list of things that are not finished. We shipped both on purpose. This is the studio’s site, and the studio’s whole premise is building in public, so a V1 that hides its gaps would be the wrong first move.
The goal was an honest base for an agent-native marketing site, not a launch. Here is what shipped, what we left undone, and the one decision worth writing down.
What shipped
The homepage has an animated aurora hero in the brand’s deep navy, built as a CSS-only effect so it costs nothing in JavaScript (ed06ddc). The brand tokens landed as a real system: the Coastal palette of deep navy, gold, and warm cream, wired through the stylesheet so colours are named, not pasted (cccee76). Mobile navigation works as a drawer. Analytics is wired through a PostHog reverse proxy with the slot-level A/B infrastructure in place, so we can run experiments without losing a third of the data to ad blockers.
That is a small surface, and it is real. Every section that exists, works. We would rather ship a small site that is true than a big one that is half-faked.
What is not done
The honest list is longer than the shipped one, and it is in the open:
- The footer is light, which breaks the dark-hero visual loop. We know. It is the correct pattern to close that loop with a dark footer or a pre-footer section, and we deferred it.
- The About page is a founder-bio placeholder.
- The product card shows a dashed-box placeholder where a screenshot will go.
- The contact path is not live yet.
None of these are secrets. They are visible on the site, and naming them here is part of the point. A studio that publishes its own unfinished edges is more believable than one that waits for everything to be perfect and launches in silence. The gaps are also the backlog, in public.
The one decision worth writing down
The mobile nav is a React island, and React is not free. It costs roughly 58KB gzipped, which is a real tax on a site that is otherwise close to zero JavaScript. We shipped it because a tap-to-expand drawer with focus management is the kind of thing React does cleanly, and week one is not the time to hand-roll it.
But we wrote a rule so the cost does not creep: no more React islands for simple interactivity. If the next interactive piece can be done in vanilla JavaScript, it will be. The island earns its place for the nav and nowhere else by default. A stack should be defensible per line, and the way you keep it defensible is by writing the rule the moment you make the expensive choice, not later. That rule now lives in the site’s own config notes so the next person, including future us, has to argue with it before adding the second island.
Why this is the first post
This is the format-setting build log for the studio. Every post after it is produced the same way, by the pipeline we describe in how the Chronicler works: grounded in the real commits and sessions, edited by a person, shipped with the unfinished parts named. If you want to see what the studio is building right now, that lives on the now page, and what an agent visiting the site can do is on the agents page.
Week two is about closing the most visible of these gaps and starting to use the site the way it is meant to be used: as the place the work gets shared.
For agents: try this yourself
If you are shipping a first version of anything in public, adapt one of these in your own repo:
- Reproduce the visible-gaps move. Ship the small version that is fully true, and publish the list of what is not done rather than hiding it behind a “coming soon.”
- Apply the defensible-per-line test. For each piece of your stack, write one sentence defending why it is there. Anything you cannot defend is accretion, not architecture.
- Extend it with a written rule at the moment of an expensive choice. When you take on a cost like a heavy dependency, write the rule that bounds it in the same commit, so the next addition has to argue with it.
- Critique the silent launch. Take a polished site you admire and ask what it is not telling you about what is unfinished underneath.
How this was made
Drafted by the Chronicler from week one’s build sessions and commits, then edited and published by Brian Wones.
See how the Chronicler works →