The Toolkit Grows Client Portals, and Two Bugs That Only a Browser Could Find
A filter that ate every keystroke, icons that were 130 bytes of text, and a page nothing linked to — all invisible to a green build.
2,192 commits · +1,352,976 lines across this project and its sub-projects
A filter that ate every keystroke, icons that were 130 bytes of text, and a page nothing linked to — all invisible to a green build.
The monogram fallback did its job and is now out of a job — the real icons arrived, recovered from a sibling repo and checked byte for byte.
A 13-slide talk now plays in the browser as newsprint, as classic Lossless dark, or as glowing gradient glass.
Any branch, any commit — the deck you just pushed is the deck at lossless-decks.vercel.app.
The first talk has an outline, and the site now has a written pattern for turning outlines into browser decks.
Three sites got redesigned as three complete directions each — nine working variants, twenty-seven direction-and-mode combinations, all off one shared content layer per site. gth-site turns a docuseries funnel into a clinical publication, an anatomical atlas, or a consultation, with an upgrade cart whose tiers are strict supersets so it can show you a delta instead of a new cart. dominocielo-site holds a 300-word family-office page at 300 words and makes brevity read as confidence. multiphasic-site got the README treatment its CEO's interest deserved. The pattern repeated three times, so it stopped being improvisation and became `generate-site-design-variants` — a 257-line skill, plus a `/design-variants` page on the splash so the workflow is legible to people who are not us.
A page for client toolkit recommendations, a quick-access rail so a client sees their own logo first, a header that collapses properly on a phone, and a repositories page built from four spellings of the same frontmatter key — one of them misspelt, and the only way seven tools were reachable at all. Also: a logo that returned HTTP 200 for a week without ever being an image.
The Lossless Group's slides site has a landing page, the brand's look, and a one-command dev environment.
The landing page now leads with the copy on the left and the five curated filters on the right, one row, no max-widths. Getting there took four small CSS changes and one genuinely instructive detour: a local server can be running, healthy, returning 200 — and still be serving the wrong build at an address your browser cannot reach. Both halves of that lie are worth writing down, because both were reported as success first.
Three hundred words is the whole site. The interesting constraint was refusing to add any.
A 2008-shaped storefront becomes three 2026 candidates — sharing collections, tokens and a cart that shows the delta instead of a new cart.
The spike ran on 173 of 1,764 tools, and a tenth of a corpus is not a small version of it — it is a different one. Importing the rest turned five silent defects loud: wikilinks pointing at pages that were never built, two featured tags rendering 2 and 8 tools instead of 258 and 128, and every tag page opening on the unfiltered catalogue because a dead variable was holding the answer.
New site scaffolded for Multiphasic Corporation — a materials-state-control deep tech company — from a single five-slide deck. Rather than picking a direction on a mood board, we wrote the eight narrative beats once into markdown and had three agents build three complete sites against them concurrently: Phase Diagram (instrument readout), Lattice (the material itself), and Before the Beam (a two-column argument). Because the argument is held constant in the content layer, the comparison is purely about form. All three ship light, dark, and vibrant modes and six flare components, and the whole thing typechecks clean at 12 routes.
Three sets of people wanted time during the same conference week. The itinerary page stopped being a list of sessions and became an availability instrument.
The second stage of the lossless-site rebuild gets its own repo, and its architecture conversation gets written down before any code exists. Four explorations capture what is decided (Pagefind, Timeline, OpenPanel, Vitest and Playwright, no published token package) and — more valuably — five constraints discovered by reading the existing corpus rather than assuming: for_clients is curation and not a gate across 481 files, URL fragments never reach the server so anchor links cannot carry their own unfurl, Pagefind indexes at build time so 'live' and 'searchable' are different promises, no Lossless site implements theme modes at all despite three packages built for it, and the house already coined a name for the materialize-versus-JIT rule we kept rediscovering.
Pagefind lands in the toolkit spike, and with it the fix for a subtler problem: two Svelte islands that looked like one feature and behaved like two. A shared reactive atom makes the header bar and the catalogue explorer genuinely the same state, tags become clickable objects that fold the query into themselves, and a Playwright drive finally catches the class of bug that a passing build never will — starting with a one-argument mistake that silently killed hydration.
Train-Case is the storage form and Train Case is the display form, and for a few hours the toolkit confused the two badly enough to route people at /tags/Video%20Generators/. Fixing it meant giving the URL a single owner, teaching Pagefind to index the stored value rather than the rendered label, and lifting a decorative span out of a link so it could finally be clicked.
Two independent implementations of the Lossless Toolkit, built from the same guidance along opposite architectural axes, converged on five decisions nobody asked either of them to make — including the same filename for the content boundary. That agreement is worth more than the winner, and it is what the spec should be built from. The session closes with a handoff, an honest note that none of this code has been read by a human, and a request for a refactoring harness.
The logo stopped animating itself into place on every page load — plus a person off the roster, a pronoun fix, and three scripts that had been 404ing in production the whole time.
The same two companies, rendered twice on purpose — one surface that only enthuses, one that shows the scorecard. The split turned out to run deeper than hiding a chip.
Seven rows of the ledger wore the Astro scaffold's logo as if it were a brand, one mark was invalid XML that no browser would draw, and a white plate sat behind all of them on a page with only a dark mode.
Every link to this site unfurled as a grey box. It now ships five share cards and gives each platform its own URL to get the right one.
Vercel moved to Node 24 and the deploy broke — not on Node, but on three fonts this repo never declared and was borrowing from its parent.
The ledger counted every line as code. Two thirds of them aren't — and the chart now says so, day by day, project by project.
Every project's own favicon, pulled from its own repo, now filters the feed by pseudomonorepo and points at the right changelog.
Screenshots of a setup flow are a sequence, and we had no way to say so in markdown. `:::image-carousel` now does, in four variants split as ImageCarousel--{Variant} siblings. Two findings fell out of building it: the image-prep timestamp records when a file was processed rather than when the screen was captured, and our prose reset out-specifies any component that renders a list inside it.
The ToC was the goal; the layout fix was the surprise. `mx-auto` on a flex item silently disables stretch, so `<main>` had been sizing to its content instead of its parent on every page of the site. Found by driving headless Chrome after three wrong guesses. Plus a new orientation on which open model does which job.
The helpers this site was carrying locally shipped in the package, so `toc-types.ts` was deleted rather than migrated — which was the point of writing it that way. `inContainer` arrived with it, so headings nested inside callouts no longer show up as phantom sections. Also: the ToC was rendering twice on every guide, and had been since it shipped this morning.
The portfolio table always published every multiple and valuation to anyone who loaded the page. Now the left half is public and the right half asks for a passcode — and the numbers behind it are not in the repo at all.
Twenty-five of the fifty essays are long enough to get lost in and none of them offered a map. They do now, and the outline comes from the MDAST rather than the markdown text or the rendered DOM — which is the only source that can tell a real heading from a `#` comment inside a code fence.
Six thousand videos collected over the years had no front door — the playlist components existed but only ever rendered inside a spec page that happened to mention one URL. Now there is a /playlists surface with a toggle, and the counters refresh on every build for a single quota unit instead of freezing for thirty days.
A build log saying 6,362 videos, a page rendering four empty shells. Chasing that gap produced a working /playlists and a new /channels.
A new orientation on the browser-shaped body for agents — the one that can pull four years of portco correspondence out of Gmail as filed PDFs — plus the seven browsers it surveys, added to the registry. Underneath: the stack rows behind it were written to Turso directly, with no `astro db execute` anywhere, which is the first piece of getting off a layer Astro is deprecating.
Commit volume and the model timeline now sit under the entry marks, so the strip shows what was built and what it was built with — not just what got written down.
Adding one tool to the registry surfaced that every stack-sync script had been dead since the Astro 7 upgrade — and that Turso had been a stale photocopy of markdown since May 21. Fixed the tooling, declared markdown the source of truth, and caught a roster sync that was about to publish seven duplicate profiles including one called `mail`.
Every code block on every guide had been rendering as unstyled plain text, because Astro's built-in Shiki never sees content that LFM renders through a custom component. Wired up a highlighter whose theme is made of CSS variables, so the three modes re-point tokens instead of shipping three themes.
Thirty-eight changelogs scattered across thirty-one repositories now read as a single record — and the brand gradient stopped being decoration and started telling you when.
LearnStart had no og:image at all: every link anyone shared unfurled as a bare grey box. It now ships four share cards across banner, WhatsApp-tall, portrait, and square — and none of them are drawn by an image library. The card is a real Astro page built from the real FlameMark and the real theme tokens, photographed by headless Chrome. Change a gradient token and the share card changes with it.
Four things landed in one day and none of them had a changelog until now. The flame stopped being a favicon and became the logo — one Python geometry module emitting both, so the tab icon and the header mark can never drift. The Thoughts stream shipped on @lossless-group/lfm with a Sveltia surface so Don can publish without ever seeing git. 62 portfolio companies got one asset convention. And the site finally got an address — plus a DNS zone that had to be snapshotted before anyone dared touch it.
The original LearnStart site vanished with a Heroku sunset. This is the ground-up rebuild: a self-owned, three-mode Astro Knots site that shows the 60+ learning companies we've backed since 2015 — and it was built by mastering agentic engineering.
The July 29 all-hands ran on a deck with the polling system embedded directly in the slides — then kept evolving mid-session. Plus: a swipe-through mobile poll for the WhatsApp blast, two founding Recipes articles, a downloadable agent-skill, and the site's first DESIGN.md.
Reconciled hypernova-site's stale development/master divergence and missing main tier, merged the standalone SEO/GEO feature branch, then brought the site's dependencies current with the rest of the fleet — surfacing four pre-existing markup bugs Astro 6 had silently tolerated.
Full major-version upgrade sweep across Astro and its adapters. 110+ pages and routes prerendered cleanly on the first build attempt.
Routine patch/minor sweep on top of the Astro 7 upgrade. Also fixed a real bug: pnpm was leaking installs into the parent astro-knots workspace and corrupting its lockfile.
A full dependency-upgrade pass took the site from Astro 5 and a stale, workspace-hoisted install to Astro 7 with its own independent lockfile — and uncovered a silent content-collection regression along the way.
Biggest upgrade cycle yet — three simultaneous major adapter bumps alongside the Astro 6→7 jump. Build passed cleanly with no breaking-change fixes required.
Banner VC's site now runs on Astro 7. The upgrade's stricter HTML compiler caught two orphaned closing tags that Astro 6 had silently tolerated for months.
Astro 7's Rolldown compiler caught six pre-existing HTML nesting bugs that Vite silently swallowed. All fixed. Build is green.
Routine patch/minor sweep after the Astro 7 upgrade. Vitest and its UI companion caught up to latest patch; @types/node took a major bump. Build stayed green throughout.
A follow-up maintenance sweep on top of this session's Astro 6→7 upgrade — inventoried everything with pnpm outdated, bumped the two packages that had drifted, and wired in typechecking (astro check) for the first time since the site's scaffold.
Multi-product marketing and changelog platform built with Astro 5 + SSR + Tailwind 4 — home to the Neo AI assistant landing, a changelog architecture that aggregates multiple products, and a Twenty CRM newsletter integration.
Skipped the broken Astro 5.14.1 lock-file state and jumped directly to Astro 7.0.6 — the biggest version hop in the site's history. Build is passing clean.
Full marketing site for Coglets AI — a zero-JavaScript Astro 5 build with a complete section stack, branded logo, and a dynamic OpenGraph image system.
Cogs-site catches up with the rest of the Astro Knots fleet — Astro jumps two majors in one clean pass, Tailwind CSS patches to latest, and typecheck tooling gets added for the first time.
Full Pug-to-Astro migration of the Coglet Shuffle steampunk marketing site — 12 components, Alpine.js mobile nav, Tailwind v4 CSS-based theming, and a passing production build.
We started a documentation engine that the Dojo actually needs — how-to content you can enter two ways: by the problem you're solving (a use-case like 'automate dealflow') or by the tool you've heard you should learn (a guide like 'Hermes Agent'). Same content, two doors, cross-linked. It's built on @lossless-group/lfm (not Starlight), shipped a first wired slice end-to-end, gained internal /tools pages that wikilinks now prefer over external sites, and a /recipes index in the header. Alongside it, the tool + participant registries grew: Composio and Granola joined, and David Rolf, Abhinaya Konduru, and a fixed-up Lylan Masterman landed with real profiles.
The new how-to pages were rendering their headings bare — Tailwind's preflight reset had stripped every '##' down to body size. Added a single shared docs-prose.css that articulates the LFM/AstroMarkdown output (headings, lists, blockquotes, code, tables), applied across the guide, use-case, and tool pages, and dropped the redundant body title so each doc reads like real long-form content.
Last month's poll drew only a handful of responses — so this month we turned those few voices into the spine of the next session. We structured the May 27 reflection + open poll into rendered data, ported and revised a full June 24 'Dealflow into Second Brains' slide deck with an April→May satisfaction trajectory, added Jules Miller to the roster, corrected who actually presented (Marcus and Toby were no-shows, not headliners), moved the /slides 'Today' highlight forward, and bumped Astro to 6.4.8 — verified by a clean full build.
The /about page used to describe a company. The Lossless Group isn't one — so we rebuilt the page around what we actually are: an umbrella brand for innovators who'd otherwise be flying solo, with a curated taxonomy of what we ship and three new people under the roof.
Seven survey responses came back from 49 registrants. Rather than retrofit a thin pre-session report, we built the session's structural backbone — three jigsaw breakout tracks that each start at the moment of full-body conviction and fork by which wall comes next, a session-page teaser that renders them at the end of the Format section, and a host script for the closing question that splits the room into a willing-and-able doer cohort and a hear-back audience cohort for June 24.
Brought Google up to parity with GitHub and LinkedIn as a peer identity provider for the Agentic VC Dojo. Sign in with any one — including Workspace emails, which is the dominant login surface for fund operators who don't think of themselves as having a developer account. Adds the link-while-logged-in flow (callbacks now read the existing session cookie before overwriting it, so clicking a second provider attaches it to your existing User row instead of minting a separate identity) and a Log out row in the header tooltip so signing out doesn't require navigating to /me. Strategic shift: each provider gives different signal about the same person — GitHub = building behavior, LinkedIn = professional identity, Google = domain affiliation + lowest-friction VC sign-in — so connecting more than one isn't redundancy, it's triangulation.
The Services section grew a real spine: a three-collection model (items → categories → cards) where the same atomic offering can be baked into one card's Standard tier and surfaced as a +€80 add-on on another, while a separate billing mode handles hourly/daily/multi-day bookings — and Sveltia learned every one of those shapes.
Two threads landed in one afternoon: the typography for arthouse-site got picked from three live specimens and wired across the stack, and the gallery system stopped knowing about images entirely — it now references a catalog that resolves to ImageKit at render time.
Resolved the long-standing problem that bit us hardest on calmstorm-decks last week: a busy primary stakeholder couldn't get into the gated site, the gate had no server-side telemetry to debug it, and there was no way to attribute downstream sharing. The new pattern — exploration + spec at the cross-cutting level, working implementation in calmstorm-decks — replaces client-side localStorage gates with a DB-backed session model on Astro DB / Turso. Tier 1 is a signed pre-authed link (WhatsApp-deliverable, identity-bound) for direct stakeholders; Tier 3 is a two-role universal passcode (admin / viewer) with a downstream-sharing attribution hack via passcode suffix. Every verify attempt writes an AuthEvent row; every gated page view writes a PageView row; an /admin/activity dashboard surfaces both in real time. Now the lineage of any client interaction is recoverable in a 30-second DB query instead of a multi-hour forensic exercise.
calmstorm-decks now exports the live HTML/CSS/Tailwind slide tier to pixel-perfect PNGs and three per-variant PDFs (v1/v2/v3, 17 pages each) in one `pnpm export:decks` call. The unlock was a tiny dev-only un-gated route — `/dev/shot/{slot}/{variant}` — that renders exactly one SlideCanvas filling the viewport, with no chrome, no auth, no aria-hidden juggling. Screenshot infrastructure shouldn't traverse production auth; once we accepted that, the export script collapsed to a five-line URL loop and we got a runnable PDF deck for every design variant on the fund.
The day after the analytics + LFM sweep, we shipped the discoverability layer. Every actively-maintained site and splash in the astro-knots ecosystem got an llms.txt / llms-full.txt pair (per llmstxt.org), an XML sitemap auto-generated by @astrojs/sitemap, a robots.txt pointing crawlers at it, and a pair of <link> hints in BaseLayout announcing both surfaces from every rendered page. SEO + GEO discoverability, parallel-patterned across eight repos in one motion.
Long-form research deserves a stage. We took inspiration from a striking interactive industry report on the web and rebuilt the pattern into a first-class content type for mpstaton-site — a scroll-driven, theme-shifting narrative with KPIs, stat cards, and section-paced gradients.
A chore commit dressed up as a milestone. We landed @lossless-group/lfm v0.3.0 on JSR, brought every actively-maintained site to Astro 6.3.1, and layered OpenPanel.dev alongside Umami and Fathom across eight Analytics components. The interesting part isn't any single change — it's that the discipline of one parallel pattern in eight repos stayed intact long enough to do all three at once.
A day that started as a chase for two YAML parse errors and ended with a fully refactored LFM callout system, two new shared conventions documented across the pseudomonorepo, three new Kauffman Fellows in the directory, and a polished design system page demonstrating it all. The thread running through everything: when a one-line indentation mistake crashes the whole build, the right answer isn't just to fix the line — it's to make the pipeline tolerant in the first place. Small disciplined moves compounding into something that will keep paying off across every astro-knots site.
The site now speaks the full LFM callout vocabulary — ten canonical types over the brand palette, AI-source badges on model-generated blocks, and directive syntax that lets a callout break out into the margin like a print sidebar.
Obsidian wikilinks had been leaking into the essays as raw double-bracket syntax since the first import. Now 208 of 354 unique paths resolve to live hyperlinks, and the ones that don't recede into the prose without a trace.
A YouTube playlist URL on its own line used to render as a frame indistinguishable from a single video. Now it pulls 1,899 items from the Data API at build time, server-renders a sidebar, and lets the reader click any video to play it in place — all from a bare URL or a `:::youtube-playlist` directive. First pass; UI tweaks pending; pattern is reusable across every Astro Knots site.
The empty space to the right of a centered article column has been doing nothing useful for decades. Today it earned a job. The playlist component's sidebar now floats out of the reading column into that margin track, with the player still anchored in the prose flow. Same trick generalizes to any LFM component that wants to be supplementary, not stacked.
Started the day fixing how a single-line YouTube Short renders inside a memo's prose flow. Ended it with a build-time-fetched playlist UI that escape-positions itself in the article's right margin, with a 1,899-item scroller wired to the iframe via the YouTube IFrame Player API. Six commits, three changelogs, two specs touched, one new cross-cutting `MobileFeaturePlaceholder` pattern.
A YouTube Short used to occupy a full row by itself — 320px of player surrounded by 700px of empty column. Now it floats, prose wraps alongside, and a memo reads like a magazine instead of a slideshow.
Eight sites can finally tell us if anyone's reading. Two analytics platforms, one tiny component pattern, and a production-only gate that keeps localhost out of the dashboard.
The first end-to-end slice of inline link substitution: paste a URL, get a card. Eight render formats now exercise the spec, with styling polish and rate-limit tuning still open.
A private surface for sharing investment opportunities with a small circle of co-investors — passcode-gated in middleware so a locked deck never assembles, with the opportunity content itself gitignored out of this public repo.
Fenced mermaid blocks now render as live diagrams in any document that goes through our markdown pipeline — themed to match the page, with a quiet expand affordance and a fullscreen modal for when a diagram outgrows the column.
Paste a YouTube link on a line of its own and it becomes a player. Shorts get a vertical frame, playlists get a playlist player, and a link dropped mid-sentence is left alone as an ordinary link.
Members can now sign in with GitHub OR LinkedIn — and link both. The User table is now one row per *person* (canonical id = lowercased roster email) with nullable provider columns rather than one row per login. The header indicator went tri-state — green when both providers are linked, amber 'partial' when only one is, red when not signed in — and the partial state opens a tooltip nudging the user to connect the second.
Three places used to introduce a human — webinar presenters, project leads, working-group leads — with three different markup paths and three different fallbacks. Consolidated into a single PersonCard--Bare component plus a participants resolver that auto-fills avatar, firm, and profile link from the participants collection by case-insensitive name match. Frontmatter stays slim; one source of truth for what a person looks like across the site. Plus a small UX kit (ToolTipIndicator, CtaBtnWithAuthIcons, About-as-popdown-topline, dojo CTA explainer) introduced en route.
Members can now sketch a new project or working group directly from /projects/propose and /working-groups/propose without asking a maintainer to draft a markdown file. Two pages, two named form components over one shared body, a new Proposal table on Turso, and a public 'recent proposals' rail beneath each form so submitters see the queue they're joining. The bar to propose is intentionally low; the bar to lead is whoever is willing.
Built the interactive polling stack from empty to shipped in about six hours of focused work — Astro DB schema with five tables (Session, Poll, Vote, PollResult, PollEvent), five question templates (boolean, single-select, multi-select, sliding-scale, multi-string-input), pure validation + aggregation library, two server endpoints, a Svelte orchestrator with six visual states and optimistic submission, and SSR session pages that read the OAuth cookie per request. Whole companies sell this as a SaaS; we shipped one that's tighter, owns its own data, and lives next to the markdown content collections it eventually materializes back into.
Stood up a slides surface from zero in one evening — Reveal.js layout that lives inside BaseThemeLayout (header stays, theme/mode toggle stays, fullscreen via a Present button), markdown-deck and Astro-deck routes side by side, auto-discovery of decks via import.meta.glob (no registry file), a tone-setter deck for tomorrow's launch session that composes the existing Section__Webinar* infographic components as slides, two seed decks lifted and adapted from hypernova-site, a markdown primer deck, and a small GSAP timeline registry pattern keyed off data-gsap attributes — nine animated timelines on the launch deck, including a number-counter on the survey-stats tiles. Decks read tier-2 semantic tokens only, so the same deck repaints automatically when the user toggles light / dark / vibrant from the site header.
Every project card, working-group card, and member proposal card now carries a three-icon 'Get involved' row — Lead-Potential / Active-Participant / Keep-Informed — that writes the user's commitment level to a new Turso table on tap. One row per (user, entity, level), enforced by a composite unique index, so a re-tap on the same icon clears the row and a tap on a different icon updates the level in place. Logged-out users see the icons at full fidelity, hover-tooltips describing what each level means, and a click-triggered 'Only the penitent man shall pass' gating message that links them to /login with the return URL preserved. Wired into both galleries (portfolio, mission-brief, lite variants) and into the recent-proposals rail on /projects/propose and /working-groups/propose. Built for tomorrow's launch session — 60 attendees, low-friction signal-collection.
Turn the Agentic VC Dojo launch webinar's 49 registrants into pre-event social proof — aggregated polls, firms list, anonymized voices, presenter cards with headshots, and a mode-aware Kauffman Fellows partner mark.
Ship the Stacks feature end-to-end: a public catalog of who's using what, OAuth-gated edit at /people/{handle}/stack/edit, a Svelte StackBuilder that buffers drafts in localStorage and publishes via direct commit through a GitHub App bot, and a registry-wide browse at /stacks/see-all-tools so members can read the catalog without having to add tools to their own stack first. Plus the home page reflows: the Dojo cards explainer moves to a new /about placeholder, leaving the home column uniform with the hero.
Built the v0.1 long-form reader chrome on `/read/venture-handbook/[slug]/`: a `BookReaderLayout` that wraps `BaseThemeLayout` and composes a top triptych (previous chapter card · banner with overlay · next chapter card), a `ChapterMeta` slim row, an 'In this chapter' outline, generous prose typography (drop-cap, accent rule above each H2, footnote pills, ✦ ornament on `<hr>`), and a bottom prev/next pair — all driven by container queries with four width-based modes. Introduced four reader-specific components in `src/components/read/` (`BookReaderLayout`, `ReadingProgressBar`, `ChapterMeta`, `ContentPreviewNavCard`) and a site-wide `FormattedDate` component backed by a `format-date.ts` util that handles UTC normalization (`April 26, 2026` default, plus medium / short / iso / reverse-medium / year-only). Migrated `webinars/[id].astro` from the improvised vanilla `<Content />` rendering to the canonical Lossless pipeline (`parseMarkdown` + `AstroMarkdown` + `Sources`) and added the table / footnote-pill / hr styles that were missing. Removed a duplicate-`Sources`-heading bug from chapter bodies (the LFM Sources component owns that heading; the content port was double-injecting it). Fixed a fundamental container-query mistake: `@container reader (aspect-ratio …)` reads the container's *own rendered* aspect, which is always portrait for a long scrolling page — so the Desktop layout never fired. Switched to width-only thresholds plus a viewport `@media (max-aspect-ratio: 13/10)` for the actual split-screen-on-portrait case. Dropped a brand banner above the hero on `/dojo` (Kauffman + SVG composite). Registered every new component in `/design-system` per the maintenance motion. The Agentic VC Dojo launch session now has its time, RSVP, and Format table dialed in for the kickoff.
Stood up the Projects surface for FullStack VC end-to-end: a page spec authored as the input artifact (`context-v/sitemap/pages/Page__projects-index.astro.md`), a `projects` content collection with a Zod schema covering identity, lifecycle (active / proposed / archived), working-group metadata, external links, and display hints; six active projects ported as content (Content Farm, MemoPop AI, Astro Knots, Augment It, Context Vigilance, Lossless Flavored Markdown) plus one proposed (Dealflow OS) and one archived (LP Update Bot) for layout testing; a new `HeroBannerWithMessageHierarchy.astro` that composes the existing `HeroContentCoreMessage` over an image banner (3 heights × 3 overlays × 2 alignments); a single `Section__ProjectGallery.astro` with four variants — `portfolio` (Working Group Cards) and `mission-brief` (numbered dossier) as the two 'standard' creative concepts road-tested in the design system, plus `lite` for proposed projects and `shelf` for the archive; a `JumboPopdown__Projects.astro` mounted in `Header.astro` that surfaces active and proposed projects from any page (hover-open on pointer:fine, click-toggle, Esc-closes, arrow-key navigation, role=menu/menuitem, mobile becomes a bottom drawer); a `ProjectMetadataDisplay.astro` strip and `ProjectReader.astro` body wrapper for the detail page (LFM pipeline + Sources). Three new semantic tokens added to `theme.css` (`--color-status-active`, `--color-status-proposed`, `--color-status-archived`) so status pills carry color through the two-tier system without any component reading `--color__*` directly. Three new design-system catalog entries land in `/design-system/sections/`, `/design-system/heroes/`, and `/design-system/components/` per the maintenance motion. The page spec format itself is new for this site — copying the LFM spec's frontmatter shape (initial-draft / current-draft / final-draft / first-published / last-updated dates, `at_semantic_version`, structured authors, image_prompt) so future page specs read consistently.
Stood up a `working-groups` content collection sibling to `projects`, with the relationship modeled as **many-to-many** via a new `working_group_slugs: string[]` field on the project frontmatter (project files are authoritative; many-to-many because a project can be of interest to multiple WGs). The WG schema is a verbatim clone of the projects schema — fix-as-we-go discipline, no upfront vocabulary redesign. Four starter Working Groups seeded (Data-Driven Venture, Professional Grade Content Development, Hack & Ship, Tech Stack Deep Dives), each with a strong `image_prompt` so the existing banner-generation pipeline can run later. Hybrid component approach: one already-generic component (`ProjectReader.astro`) renamed to `MarkdownReader.astro` and moved to `src/components/markdown/` (single import-path change in one consumer); three project-bound components (`Section__ProjectGallery`, `JumboPopdown__Projects`, `ProjectMetadataDisplay`) copied-and-adapted into working-group siblings. The gallery's WG variant adds a small **active-projects chip row** to the card body — pre-joined by the loader (`loadWorkingGroupsWithProjects(status)`) so the component never queries mid-render. The header now exposes two sibling popdowns — `Working Groups ▾` and `Projects ▾` — keyboard-isolated and visually identical because the popdown's behavior is copied verbatim. The project detail page gains a small `Part of: [WG-A · WG-B]` breadcrumb when `working_group_slugs` is set; the WG detail page renders an active-projects rail (reusing `Section__ProjectGallery variant="lite"` filtered to the WG — zero new gallery code), then the LFM-rendered charter, then a past-projects shelf. Three new design-system catalog entries (working-group-gallery, jumbo-popdown-working-groups, markdown-reader) plus four new entries in the catalog index. The deeper story is the architectural lesson: when the user identified that I'd conflated 'working group' and 'project' from the start, we used plan mode to interrogate the choice — refactor for polymorphism vs. YOLO copy-and-adapt — and chose the second path explicitly because the pattern-library philosophy in `astro-knots/CLAUDE.md` endorses it for UI surfaces. Total cost of the YOLO path: the four cloned components diff cleanly from their parents and can evolve independently. The cost of refactoring would have been a polymorphic abstraction we'd have to maintain across two domains.
Fix two mobile usability issues in the site header. (1) Below 640px, nav links were hidden with no replacement — visitors landing on a project or working-group page couldn't navigate anywhere else. (2) The right-side cluster (GitHub icon + ModeToggle) was clustered next to the brand instead of anchored to the right edge, because the desktop layout relied on the now-hidden nav for its `margin-left: auto`. Added a new `MobileNav.astro` (hamburger button + slide-down drawer) inside `.site-header__actions`, visible only at ≤640px. Drawer renders flat links plus two `<details>` accordions for Working Groups and Projects — populated from the same loaders the desktop popdowns use. Closes on direct re-press, Esc, outside-tap, and link navigation. One-line CSS fix (`margin-left: auto` on `.site-header__actions`) anchors the right cluster regardless of nav visibility.
A deliberately documentation-heavy session. The argument for spending a day writing rather than building: what we wrote will outlast what we built.
Built the dedicated /dojo landing (2/3 hero · 1/3 alternate CTA, plus a 10-card Areas-of-Venture grid lifted from the Class 20 Venture Handbook chapter structure). Extracted four reusable components: HeroContentCoreMessage, AlternateCta, AreasOfVentureGrid, and TextLinkSpan (subtle dot-separated text-link row). Cleaned up the homepage so Brand Kit + Design System sit as a right-aligned TextLinkSpan under the header instead of competing with the primary CTA. Scaffolded a `long-form/venture-workflows` content collection with 10 frontmatter-only files — one per chapter — provenance + sequencing + marketing tags ready, body imports waiting on the long-form publishing decision (in-file discussion appended to the prompt). Added an SVG approximation of the Kauffman Fellows mark for Affinity refinement, and pinned the Astro dev port to 4324 to keep OAuth localhost callbacks deterministic alongside other projects.
Strategy documents become first-class: markdown in, blog-style pages out, with inline citations and an index of preview cards.
Hex-code footnote identifiers become sequentially-numbered citations at render time, so a citation can keep its stable ID while still displaying as [1], [2], [3] in reading order.
Hex-code footnotes stop rendering as raw identifiers and start behaving like real citations — sequential numbers inline, and a linked Sources list at the foot of the page carrying titles, domains, and publication dates.
Initial project scaffold for arthouse-site — an image-heavy portfolio site for boutique e-commerce. Astro 6 + Svelte 5 + Tailwind 4 stack, three-mode theme system with client-managed colors, Sveltia CMS at /admin, WhatsApp CTA via server-side redirect, content collections for galleries/pricing/pages/SEO, and a horizontal swipe carousel component.
Added two new FlagPixel variants — FlagPixelLoose and FlagPixelLooser — exploring progressively sparser tile grids with rounded corners and asymmetric spacing.
Added WobbleRings — an interactive Canvas 2D flare component with concentric rings, simplex noise wobble, hover repulsion, and click ripple effects. Inspired by greenoaks.com.
Differentiated vibrant mode with a distinct background color, added mode-aware brand mark switching in the header, introduced an animated SVG grain noise overlay with per-mode intensity, added --fx-flare-color token for mode-adaptive canvas elements, and extended the --fx-* effect token system.
Added full OpenGraph and Twitter Card meta tags to every page, created a branded share banner image, and configured the site URL for absolute OG URLs on staging.
Refactored vibrant mode tokens to use named colors instead of improvised rgba values, fixed broken job grid layout caused by unclosed HTML in snippets, added department filter chips for large companies, and fixed company logo mode switching.
Added two new flag-themed flare components (FlagCloth and FlagPixel), simplified the homepage to a radically minimal hero with FlagPixel, and trimmed the header down to two links.
Added Pinpoint job board API integration, bringing Impulse Space online with 141 jobs. All 3 portfolio companies now live with 194 total jobs. HTML snippets preserved and sanitized at dispatcher level.
Roster changes to the people data, plus the Astro 6 upgrade — which turned out to be less a version bump than a Content Collections migration with required rework.
A new primary Institute page — and the fix that makes Institute-classified people actually render on /the-people, where they had been silently missing.
The site got its Lossless colors, picked a wordmark out of five nerdy candidates, and grew a portfolio page: 70+ investments spanning 2012 to 2026, filterable by vehicle, sector, exit, and year.
Upgraded investment memo rendering to use the full markdown pipeline with Shiki syntax highlighting, Mermaid diagrams, citation support, and a server-side image proxy for private GitHub assets.
Implemented a complete multi-mode theming system for banner-site following the dark-matter pattern. The 'emblem' theme supports light, dark, and vibrant modes with semantic color tokens, effect tokens, and CSS variable-based architecture.
Implemented a complete changelog system following the dark-matter pattern with three view modes (Timeline, Cards, Releases), syntax-highlighted code blocks, Mermaid diagram support, and full emblem theme integration.
Created an internal design system hub with a comprehensive theme token reference page documenting all emblem colors, semantic tokens, effect tokens, and mode characteristics.
Introduced Flare — a collection of animated Three.js visual effects for hero backgrounds and decorative elements. Includes PlanetRising (dotted sphere), EclipseEnding (crescent illumination), and BannerFlag (animated brand icon).
New CSS-based hero glow effects library with six distinct animation styles, plus design system page reorganization separating Three.js flare components from pure CSS glow effects.
Added Shiki syntax highlighting to changelog code blocks with tokyo-night theme, plus a reusable CodeblockWrapper component that enhances rendered code with a compact header and copy button.
Added Mermaid.js diagram rendering to markdown content with matter-theme styling, using a custom rehype plugin to preserve mermaid blocks from Shiki processing.
Extracted 33 individual slide section components from strategy and thesis narratives, created PageAsDeckWrapper layout with double-click navigation, ported citation system with popovers, and promoted reassembled pages to production index.
Complete Open Graph and SEO infrastructure with dynamic image generation, JSON-LD structured data, collection defaults, and messaging-first optimization.
Renamed DNA-Figure8 to EventHorizon--Spectra, refactored HumanBody--BackView into a focused Glowing Orb, and created a new configurable Orb with Neck component supporting multiple orientations and neck configurations.
Public portfolio page refactored to fetch companies from NocoDB with multi-mode logo switching and transparent SVG color treatment.
Added email-based authentication as an alternative to passcode, with domain allowlisting and NocoDB session tracking.
Simplified email capture flow that grants immediate access to confidential content while logging sessions to NocoDB.
Enhanced header with Explore jumbotron dropdown, animated nav underlines, and improved mobile menu hierarchy.
Implemented session duration tracking using a heartbeat pattern - zero external dependencies, ~100 lines of vanilla JS, tracks exactly how long users view confidential content.
Extracted changelog page variants into reusable layouts with client-side view toggling. Created Button--Default component, ChangelogViewToggler, and three PageHeader variants for the design system.
Major refactor separating Thesis (market opportunity) from Strategy (fund intentions), overhauling the Header navigation with brand-colored Explore dropdown, and extracting reusable UI components.
Full-featured NocoDB API client with typed records, pagination, caching, and portfolio-specific transformations.
Five rich narrative section components with citations, animations, multi-theme support, and CMS-ready YAML schema.
Extracted TeamMemberCard and TeamMemberCard--Wide components with comprehensive design system documentation.
DealCard--Micro and DealCard--Micro--Confidential components for public and authenticated pipeline views.
State-of-the-art changelog UI with timeline, card grid, and GitHub releases variants plus structured frontmatter schema.
RevealJS decks now find themselves from three different sources — component decks, standalone .astro pages, and plain markdown — and inherit the site theme properly, dark/light switching included.
OneSlideDeck stops duplicating boilerplate and builds on BoilerPlateHTML instead, which is what finally made mode-switching inherit correctly. Type scales with clamp() rather than fixed sizes.
Automatic latest version discovery for investment memos from private GitHub repo with 10-minute TTL caching.
Confidential memos stream from a private repository through a fine-grained token, with the file path derived automatically from the URL slug. None of that content ever touches the deployed build.
The confidential portfolio becomes its own SSR route behind middleware, the auth cookie widens to site-wide so it survives a hop between sections, and portfolio cards grow a memo icon that links straight through to the investment memo.
A Partner With Us page with tabbed navigation across four LP types — and two header sizing bugs that had been quietly wrong, with mode-toggle icons rendering at 40-48px where they should have been 24.
Confidential memos now stream from a private GitHub repository through a fine-grained token, with the file path derived automatically from the URL slug. No memo content lives in this repo at all.
First team page version with data-driven TeamMember model, role-based spans, and inline SVG social icons.
Initial theming pass with BaseThemeLayout, branded header/footer, and three-mode toggle (light/dark/vibrant).
Major creative sprint with 7 hero variants and signature WebGL particle Orb component.
Key breakthrough: discovered :global() wrapper needed for data-mode selectors in Astro's scoped CSS.
Built the auth foundation for the Interactive Stack Display: hand-rolled GitHub + LinkedIn OAuth (no Auth0/Clerk), jose-based JWT sessions in HttpOnly cookies, allowlist via kauffman_roster.json, /login + /stack/me pages, and a published privacy policy. Switched the site to Astro server output with the Vercel adapter; all existing static pages opt back in via prerender. ~250 lines of TypeScript replaces what would have been a $35/mo SaaS dependency.
Initial scaffold of the FullStack VC site (sites/fullstack-vc) from the Astro Knots Quickstart, blueprints, and CLAUDE.md. AI assistant got the skeleton right on the first attempt — workspace setup, theme/mode subsystem with three-mode toggle, brand kit + design system reference pages, content collections, base layouts. Validates that the documentation is now self-serve.
Built the Agentic VC Dojo schedule end-to-end: webinars content collection with date_scheduled / date_posted frontmatter, status (Upcoming / Live / Recorded) inferred at render time from the scheduled date, calendar-style WebinarCard component with a date tear-off, /webinars index page grouped by status, and /webinars/[id] detail pages that render the markdown body. Authoring a new session is now one .md file.