A workspace for developing and maintaining multiple Astro/Svelte content-driven websites. Started as a pattern library, evolving toward selective package sharing where it genuinely makes sense.
Astro Knots began as an experiment: could we codify shared patterns into a monorepo with @knots/* packages that sites copy from? The answer turned out to be "sort of." The monorepo is useful for co-locating sites and seeing patterns side by side, but maintaining abstracted, style-free component packages that every site copies from proved impractical with a small team. We gave up on @knots/* as true importable packages early on.
What survived and works:
context-v/ documents (specs, blueprints, prompts, reminders) that guide development across all sites@lossless-group/lfm (Lossless Flavored Markdown)What didn't work as planned:
@knots/* as imported dependencies — too much abstraction overhead for the valueThe current stance: This is a pseudo-monorepo evolving toward real package sharing where it's justified. Don't assume everything is a shared package. Don't assume everything is copy-paste. The right answer depends on the specific code: markdown processing pipelines genuinely benefit from a shared package; UI components don't.
| Site | Repo | Status | Notes |
|---|---|---|---|
| mpstaton-site | lossless-group/mpstaton-site | Active | Personal portfolio/CV, actively maintained without client constraints |
| hypernova-site | hypernova-labs/hypernova-site | Active | Client site |
| cilantro-site | lossless-group/cilantro-site | Active | Client site, strong reference implementation |
| twf_site | lossless-group/the-water-foundation-site | Active | The Water Foundation |
| dark-matter | lossless-group/matter-site | Active | Client site |
| banner-site | lossless-group/emblem-site | Active | Client site |
| cogs-site | In progress | ||
| coglet-shuffle | In progress | Nested astro-site |
All sites deploy independently via Vercel from their own repos.
These are real packages that sites install as dependencies:
Lossless Flavored Markdown — a shared remark/rehype pipeline for extended markdown processing.
pnpm add @lossless-group/lfm (requires .npmrc with GitHub Packages registry)packages/lfm/context-v/specs/Codifying-a-Comprehensive-Extended-Markdown-Flavor-and-Shared-Package.mdBundles unified, remark-parse, remark-gfm, remark-directive, and custom plugins (remark-callouts). One import:
import { parseMarkdown } from '@lossless-group/lfm';
const tree = await parseMarkdown(markdownContent);
Currently used by mpstaton-site for context-v document rendering. Will be adopted by other sites as the content rendering pipeline matures.
@knots/*)These are not published packages. They're workspace-local pattern references — source code you look at, copy from, and adapt. They exist for co-located development convenience and as a "cookbook" of patterns.
| Package | Purpose |
|---|---|
@knots/tokens |
Design token structure (colors, scales) |
@knots/icons |
SVG icon helper pattern |
@knots/astro |
Astro component patterns (Button, AstroMarkdown, CodeBlock, Callout) |
@knots/svelte |
Svelte component patterns |
@knots/brand-config |
Brand configuration type and CSS var helper |
@knots/tailwind |
Tailwind 3 preset/plugin (needs TW4 migration) |
The @knots/astro markdown components (AstroMarkdown, CodeBlock, Callout) are particularly useful as a starting point — mpstaton-site copied and adapted these for its content rendering.
The context-v/ directory contains project documentation organized by type:
Sites can fetch context-v documents from multiple repos using the Context-V fetcher system. mpstaton-site displays these as browsable "Rabbit Holes."
design-system-viewer/ — An internal tool (not deployed) for visualizing tokens, icons, and components across the workspace. Currently minimal scaffolding on Astro 6 + Tailwind 4. The aspiration is a shared micro-frontend that each site can embed, but this is an initiative waiting for bandwidth.
# Always use pnpm — npm/yarn will break workspace resolution
pnpm install
# Run a site
pnpm --filter mpstaton-site dev
pnpm --filter hypernova-site dev
pnpm --filter cilantro-site dev
# Build a site
pnpm --filter mpstaton-site build
# Run the design system viewer
pnpm --filter design-system-viewer dev
Note: @lossless-group/lfm is installed from GitHub Packages. If pnpm complains about auth, set GITHUB_TOKEN:
GITHUB_TOKEN=$(gh auth token) pnpm install
Sites are git submodules with independent version control:
# Initialize all submodules
git submodule update --init --recursive
# Update a submodule to latest
git submodule update --remote sites/cilantro-site
# Work inside a submodule (normal git workflow)
cd sites/cilantro-site
git checkout main
git pull
# ... make changes ...
git add .
git commit -m "Update site"
git push origin main
# Update parent to track submodule change
cd ../..
git add sites/cilantro-site
git commit -m "Update cilantro-site submodule reference"
See CLAUDE.md for detailed guidance. The key thing to understand: this project is in between states. It's not a true monorepo with shared packages everywhere, and it's not purely a pattern library. The answer to "should I import this or copy it?" depends:
@lossless-group/lfm)