9.8 KiB
Federated Computer — Hugo Site
A Hugo template for the Federated Computer site, laid out like
supermemory.ai: a sticky left rail (logo, the
site's pages, Start Now / Sign In, and an "On this page" index of the
current page's sections) beside a single narrow reading column. White
page, near-black ink, one electric blue (#0562ef), hairline rules,
square corners, no shadows. The product's four layers
(Federated Core → Software Library → Agent Sandbox → Data & Controls)
recur as stacked bars — in the blue hero "field", the layer-fit panels,
and the closing call to action.
Requirements
- Hugo (extended version). Tested on v0.123.7.
Running it locally
hugo server
Then open http://localhost:1313/.
Building for production
hugo --minify
Output goes to public/.
How pages are built
Every page's content lives in its front matter as a sections: list —
each section has a type (e.g. hero, text, layers, stats, quote,
table, checklist, features, steps, faq, callout, founder,
diagram, final-cta, divider, paths, matrix, split, app-directory, pricing, savings) plus whatever fields that type needs.
layouts/partials/render-sections.html loops the list and hands each
section to its matching partial in layouts/partials/sections/.
This keeps content and layout separate: to change copy, edit the
content/*.md files; to change how a section type looks, edit the one
partial in layouts/partials/sections/.
Common section options
Any section can take:
id: "some-id"— anchor for links (e.g./start-now/#pricing). Without one, the id is made fromtoc,kicker, orheadline.toc: "Short label"— the label for the rail's "On this page" index (defaults to the kicker, then the headline). Sections without any of these, plushero,divider, andfinal-cta, are left out of the index.
Every section opens on a hairline rule, so the older bordered, tinted,
and dark options are accepted but no longer change the look. final-cta
always renders as the dark closing plate.
Customer paths (Solutions)
The site speaks to four customer types, each with its own page under
content/solutions/, plus an overview with a side-by-side comparison:
| Page | Customer | Layers |
|---|---|---|
open-source-apps.md |
Wants open-source apps only | Core, Library |
apps-and-ai-development.md |
Wants the apps plus AI development | Core, Library, Data & Controls |
ai-for-your-apps.md |
Wants Federated AI on open-source apps they host themselves | Core, Data & Controls (Library: their own) |
full-stack.md |
Wants apps, AI development, and to run agents on Federated | All four |
Which layers a path uses is set with a fit map, e.g.
fit: { core: "yes", library: "own", sandbox: "no", controls: "yes" }.
States are yes (Included), own (Your own), and no (Add anytime).
Layer names, order, and links come from data/layers.yaml.
New section types:
paths— list of customer paths, each with its layer fit (home, Solutions).strip: truepins a four-layer strip above the list that lights up the hovered path's layers — and the rows of anylayerssection on the page (mouse devices only)matrix— capability-by-path comparison table; cells takeyes/own/noor free textsplit— two titled columns of short listsapp-directory— browsable app catalog;categories, each with anameand a list ofapps(name, optionaldescription, optionalurlwhich renders a "Learn more." link). Renders as collapsible<details>groups, no JS (Software Library)pricing— plan groups behind a CSS-only switch (e.g. "You host" / "We host"; up to four).groups, each with alabel, optionalid(so/pricing/#hostedopens that tab) andlede, plus any of:tiers(name,price,unit,note,intro,features),includes(headline,items,note),addons(headline,lede,itemsofname/price/unit/body),apps(headline,lede,itemsofname/category/body/price), andctas(Pricing)savings— a bar comparison (bars:name,amount,highlight) and a savings calculator (apps:name,cost,perSeat,selected; compared withfederatedAnnual) (Pricing)statsvalues that start with a number ("80%+", "100+") count up when scrolled into viewquotetakes onetext/cite, or several asitems. Withcards: true, items render as a two-column testimonial grid:text,name, optionalroleandphoto(initials show when there's no photo). Customer headshots live instatic/images/customers/(home page).savings:adds a compact savings calculator below the quotes: it picks the namedapps(and ticksselected) out of thesavingssection on the page atfrom(e.g./pricing), so app prices live in one place;morelinks to the full calculatorapp-directoryitems can also takepage:— the app's own page on this siteheroacceptslog:— a list of lines (tag+text;think: truefor a greyed reasoning step with a spinner and a pause;done: trueto close the run) typed out in a fixed-height console window that scrolls like a terminal, as an agent's activity log (home page). Without JS or with reduced motion, all lines show at once.logTitlesets the window's title;logImageputs a photo behind the console in place of the blue field (home: Pikes Peak,static/images/hero-pikes-peak.jpg), andlogCaptionadds a small credit in its cornerheroacceptsfit:to show the layer panel under the actions (in place of the blue field);bars: falsedrops the field;compact: truemakes the field shorter
Every section type now renders kicker, headline, and an optional lede
through partials/sections/head.html.
App pages and legal pages
Some pages are long-form Markdown rather than a sections: list:
content/apps/*.md— one page per app, rendered bylayouts/apps/single.html. Front matter holds the facts (eyebrow,headline,dek,replaces,plans,price,projectUrl); each setsurl:to keep the old site's address (e.g./jitsi/). Screenshots live instatic/images/apps/.privacy-policy.mdandterms-and-conditions.mduselayout: "legal"(layouts/_default/legal.html), witheffective:for the date.
Site-wide links live in hugo.toml: params.demoUrl (the booking page),
params.supportUrl (the help portal), and the footer_social / footer_legal menus.
The "Apps + AI" wall
The rail ends with a slowly scrolling grid of app tiles, pinned to the bottom
of the column on screens wider than 1000px and taller than 720px. Tiles come
from data/app_wall.yaml (name, url, optional icon). Icons are symbols
in the sprite static/images/app-icons.svg (from Simple Icons, CC0; DocuSeal
from its own repo). A tile without an icon shows its first letter. The
scroll pauses on hover and focus, and stops for reduced motion.
Adding a new page
- Create
content/your-page.mdwith asections:list in the front matter, following the patterns already incontent/*.md. - It will render through
layouts/_default/single.htmlautomatically, which just runsrender-sections.html. Add a link to it inhugo.toml's[[menu.main]](give it[menu.main.params] dropdown = "menu-name"to render a dropdown from another menu) (andfooter_*menus) if it should appear in nav. - If a page needs a layout the section system doesn't cover — like
sign-in.md, which uses a real<form>— setlayout: "your-layout"in its front matter and addlayouts/_default/your-layout.html.
Structure
content/
_index.md Home
product/
_index.md Product overview
federated-core.md
software-library.md
agent-sandbox.md
data-controls.md
solutions/
_index.md Solutions overview + comparison matrix
open-source-apps.md
apps-and-ai-development.md
ai-for-your-apps.md
full-stack.md
ai-privacy-advantage.md
pricing.md
start-now.md
about.md
sign-in.md
layouts/
_default/baseof.html Base HTML shell
_default/single.html Generic page (renders sections)
_default/sign-in.html Sign-in form page
index.html Home page (renders sections)
product/list.html Product overview (renders sections)
partials/
head.html, footer.html
header.html The rail (nav, actions, "On this page")
render-sections.html Dispatches each section to its partial
section-id.html Anchor id shared by sections and the rail index
sections/*.html One partial per section type
static/
css/style.css The whole design system
hugo.toml Site config + nav/footer menus
Design notes
- Layout:
.pageis a two-column grid — the rail (layouts/partials/header.html) and the column (main.col, which also holds the footer). Below 1000px the rail becomes a one-line top bar with a Menu toggle. - Type: Geist (reading) and Geist Mono (caps labels, numbers, buttons),
loaded from Google Fonts in
layouts/partials/head.html. - Color tokens are CSS custom properties at the top of
static/css/style.css(--ink,--ink-68,--rule,--paper,--blue, etc.) — change the palette there and it cascades everywhere. - Buttons: CTA
style: primaryis the solid blue button with an arrow tile,ghostthe pale blue one with corner ticks,texta quiet link. A trailing→in a label is dropped; the arrow is drawn for you. - JS is optional. A small inline script in
baseof.htmlfades sections in and highlights the current "On this page" entry. Without it everything still shows; the mobile menu, FAQ, and app directory use native<details>.