Build log
Building this site as an asset, not a landing page
The decisions behind onesebdel.com: why the orange was chosen with a contrast calculation rather than by eye, why TypeScript 7 was rejected, and why the agents folder ships deliberately empty.
4 min read
- The problem
- A personal brand with no site of its own depends on platforms it does not control, and cannot be cited as a source.
- Human gate
- Positioning, published copy, and any claim about results. None of that is automated.
Update, September 18, 2026: this article records the original decisions. The official identity subsequently supplied by my creative director replaces the original orange with #FF8A00 and #EA6B00, with #B45300 for accessible text on white, and introduces the final logo and monogram. The measurements below describe the first version.
A personal brand with no site of its own depends on platforms it does not control. Profiles rank by someone else's algorithm, content disappears into a feed, and above all: it cannot be cited. When someone, or an answer engine, asks what "AI-native company" means, there is no stable URL that answers.
This is the record of how onesebdel.com was built, with the decisions that cost something and the ones that were rejected.
The orange was not chosen by eye
The brand called for "neon orange" over black and white. The problem is that neon and accessible pull in opposite directions, and there were two real constraints.
First: Daleki Trade already uses #FF7800 as its official colour. The SEBDEL YouTube banners used an orange sampled at roughly #FF8A01. Practically the same tone. If the personal brand and one of the companies share a chromatic signature, the group's brand system stops reading: you cannot tell who is speaking.
Second: contrast. Twelve candidates were measured against the canvas black and against white. The result that settled it:
#FF5C00on#0A0A0A→ 6.39:1, passes AA as text.#FF5C00on white → 3.10:1, does not pass AA as text.- Black on
#FF5C00→ 6.78:1, passes AA. - White on
#FF5C00→ 3.10:1, fails.
Out of that came a rule of the system that is not negotiable: an orange button carries black text, never white. It is the easiest trap in this colour, because white on orange looks right.
And since the site has light sections, a second orange was needed: #C43F00, which gives 5.17:1 on white. It is not a decorative variant: it is the only orange that works as text there.
None of this lives in anyone's head: tests/contrast.test.ts reads app/globals.css and re-measures the ratios on every verification. If someone changes a hex six months from now, the test fails before the deploy does.
TypeScript 7 was rejected
TypeScript 7.0.2 is the latest stable release and ships the native Go compiler, with far faster builds. It was tempting.
It was not used. The typescript@7 package no longer includes lib/typescript.js, the JavaScript Compiler API, and Next.js 16 needs it to detect TypeScript: with TS 7 installed, Next reports that TypeScript is not installed. Support exists, but behind experimental.useTypeScriptCli.
The decision was to pin typescript: ^5. The reasoning is not "new things are scary": it is that compile speed was not this project's bottleneck, and an experimental flag at the foundation of an asset meant to last years is paid back with interest.
The agents folder ships empty
The project uses a three-layer operating model (Workflows, Agents, Tools) and the obvious temptation was to create a file for every agent mentioned: an SEO one, a QA one, an editorial one.
.claude/agents/ is empty, with a README explaining why.
Today there are two real agents: the one that implements and the one that audits. A subagent earns its place when the work is read-heavy, independently verifiable, and context-polluting. With six pages, auditing the whole site's SEO is faster read directly than briefed out to a subagent.
The same happened with the workflows. The model called for five; four were written. Schema validation has no trigger of its own: it is a test and a step inside the SEO quality workflow. Build-log publishing is the content workflow with a different entry type. Giving them their own files guaranteed two documents that drift apart within a month.
Satisfying a naming scheme by creating empty abstractions is the cleanest way to make an operating model stop meaning anything.
What was not built
No database, no authentication, no API, no component library, no error tracker, no analytics beyond the platform's own. No legal pages, because the site collects nothing: a privacy policy for a site that stores no data is copied fiction.
And no empty routes. /ideas and /frameworks do not exist yet because there is no content for them. Their types are defined, to fix the vocabulary before there are indexed URLs to rename. A test checks both directions: there can be no content without a route, and no route without content.
What stayed in human hands
Positioning, published copy, and any claim about results.
This site publishes no revenue figures, savings, or automation percentages. Not because they don't exist, but because they cannot be shown verifiably, and a claim nobody can check is not an argument, it is noise formatted as data.
What can be verified is one click away: five companies with public sites, each in a different industry.