Content Seeders
The bridge that pushes committed content into the live database.
PipelinesLiveNode.jsSupabaseVoyage embeddings
82seeds
What it is
Blog, research and projects content is Supabase-driven. The seeders upsert committed seed sources into the main project so content reaches the live site, then rebuild the semantic search index. Auto-runs on merge.
Take it with you
The real, committed source behind this system — copy it or download the file. Plus a portable spec of everything on this page.
seed-projects.excerpt.mjsjavascript30 lines
The content→row transform at the heart of the seeders (excerpt) — how a committed entry becomes an upsert row.
// Excerpt of scripts/projects/seed-projects.mjs (lines 50–77) — the full file is listed in the spec download.
function slugFromHref(href) {
if (!href) return null;
const parts = href.replace(/\/$/, '').split('/');
return parts[parts.length - 1] || null;
}
function toRow(entry, collection, position) {
if (!entry) return null;
const id = entry.id ?? slugFromHref(entry.href) ?? entry.name;
const extras = {};
for (const k of Object.keys(entry)) {
if (!['id', 'name', 'sub', 'desc', 'tags', 'href', 'date'].includes(k)) {
extras[k] = entry[k];
}
}
return {
collection,
id,
name: entry.name ?? null,
sub: entry.sub ?? null,
description: entry.desc ?? null,
tags: Array.isArray(entry.tags) ? entry.tags : [],
href: entry.href ?? null,
date_published: entry.date ?? null,
extras: Object.keys(extras).length ? extras : null,
position,
};
}
Where it lives
- scripts/enrichment/seed-supabase.mjs
- scripts/research/seed-audits.mjs
- scripts/projects/seed-projects.mjs
See it in action
Blog →FAQ
Why do seeders matter?
Editing a seed source in the repo does not change the live site until the rows are upserted into Supabase. The seeders are what make committed content go live.
Part of these stacks
Related systems
Want a system like this built for you?Work with me →