caliper uidocs

About template

Block

Who is behind the product, in the order buyers and candidates check: the belief, how you got here, the numbers, how you work, the people and the next step.

Installs components/ui/about-template.tsxDepends on lucide-reactMotion none in component source
pnpm dlx shadcn@latest add https://caliperui.site/r/about-template.json
Skip to content

About Halden

Finance teams should review, not search

We started Halden after watching good accountants spend the first week of every month matching bank lines by hand. We build the tool we wanted then.

finance teams close with Halden
1,900
median close, down from 6.4
1.8 days
matched in the last twelve months
€41bn
people in Lisbon and London
14

How we got here

Joana and Tom met at a freight company where the close took nine days. They wrote the first matching rules in a spreadsheet, then in a script, then in what became Halden.

We are funded by our customers and a small seed round, and we intend to stay independent. Every feature starts with a finance team that asked for it.

  1. 2022First rules in a spreadsheetBuilt for one freight company's close.
  2. 2023Halden opens to ten teamsXero and QuickBooks in both directions.
  3. 2024Lisbon officeCustomer team and engineering under one roof.
  4. 2026NetSuite two-way syncOur most requested feature, three years running.

How we work

The habits we hire for and hold each other to.

  1. A person answers

    Support is the people who build the product. No tiers, no bots, a reply within a working day.

  2. Never guess with money

    Halden suggests; people approve. Large entries always wait for a human.

  3. Write it down

    Decisions, incidents and pricing changes are public in our changelog and status page.

  4. Small on purpose

    Fourteen people, one product. We hire slowly and keep teams small enough to sit at one table.

Team

The people behind your close

Write to any of us directly. A person answers.

14 people in Lisbon and London. We are hiring a second support lead.

Work with us

We are hiring a second support lead.

Lisbon or London · four days a week in the office

When to use #

Use it for

  • An about or company page.
  • A careers page that leads with how the team works.

Skip it when

  • The product pitch; use the landing template.

Installation #

terminal
pnpm dlx shadcn@latest add https://caliperui.site/r/about-template.json

Adds its 9 files to components/ui/, each with its own stylesheet, and installs their packages. No account needed. The first part also adds Caliper UI’s tokens; import them once as in Installation.

Usage #

This is the code behind the preview above.

example.tsx
import { AboutTemplate } from "@/components/ui/about-template"
import { BlockEm } from "@/components/ui/block-concept"

const nav = (current: string) =>
  [
    { label: "Product", href: "#product" },
    { label: "Customers", href: "#customers" },
    { label: "Blog", href: "#blog" },
    { label: "About", href: "#about" },
    { label: "Contact", href: "#contact" },
  ].map((link) => ({ ...link, current: link.label.toLowerCase() === current }));

const signIn = { label: "Sign in", href: "#" };

const frame = "h-[720px] w-full overflow-auto rounded-[14px] shadow-[0_0_0_1px_var(--border)]";

const wait = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));

export function AboutDemo() {
  return (
    <div className={frame}>
      <AboutTemplate
        brand="Halden"
        nav={nav("about")}
        signIn={signIn}
        primary={heroes.primary!}
        intro={{ eyebrow: "About Halden", title: <>Finance teams should <BlockEm>review</BlockEm>, not search</>, lead: "We started Halden after watching good accountants spend the first week of every month matching bank lines by hand. We build the tool we wanted then." }}
        stats={[
          { value: "1,900", label: "finance teams close with Halden" },
          { value: "1.8 days", label: "median close, down from 6.4" },
          { value: "€41bn", label: "matched in the last twelve months" },
          { value: "14", label: "people in Lisbon and London" },
        ]}
        story={{
          title: "How we got here",
          body: (
            <>
              <p>Joana and Tom met at a freight company where the close took nine days. They wrote the first matching rules in a spreadsheet, then in a script, then in what became Halden.</p>
              <p>We are funded by our customers and a small seed round, and we intend to stay independent. Every feature starts with a finance team that asked for it.</p>
            </>
          ),
          milestones: [
            { year: "2022", title: "First rules in a spreadsheet", detail: "Built for one freight company's close." },
            { year: "2023", title: "Halden opens to ten teams", detail: "Xero and QuickBooks in both directions." },
            { year: "2024", title: "Lisbon office", detail: "Customer team and engineering under one roof." },
            { year: "2026", title: "NetSuite two-way sync", detail: "Our most requested feature, three years running." },
          ],
        }}
        values={[
          { title: "A person answers", detail: "Support is the people who build the product. No tiers, no bots, a reply within a working day." },
          { title: "Never guess with money", detail: "Halden suggests; people approve. Large entries always wait for a human." },
          { title: "Write it down", detail: "Decisions, incidents and pricing changes are public in our changelog and status page." },
          { title: "Small on purpose", detail: "Fourteen people, one product. We hire slowly and keep teams small enough to sit at one table." },
        ]}
        team={team}
        cta={{ ...ctas, eyebrow: "Work with us", title: "We are hiring a second support lead.", primary: { label: "See open roles", href: "#careers" }, reassurance: "Lisbon or London · four days a week in the office" }}
        footer={footers}
      />
    </div>
  );
}

API reference #

AboutTemplate

component
PropTypeDefaultDescription
brand *string—
navreadonly BlockNavLink[]—
signInBlockAction—
primaryBlockAction—
intro *{ eyebrow?: string | undefined; title: ReactNode; lead: string; }—
story{ title: string; body: ReactNode; milestones?: readonly AboutMilestone[] | undefined; }—A few paragraphs and the dates that mattered.
statsreadonly BlockStat[][]Figures with what they count, e.g. { value: "1,900", label: "finance teams close with us" }.
valuesreadonly AboutValue[][]
teamWithout<{ eyebrow?: string | undefined; title: string; lead?: string | undefined; people: readonly BlockPerson[]; footnote?: string | undefined; className?: …—
ctaWithout<{ eyebrow?: string | undefined; title: string; reassurance?: string | undefined; primary?: BlockAction | undefined; secondary?: BlockAction | undefin…—
footerTemplateFooter—
classNamestring—

Accessibility #

It is built on native elements and keeps aria-labelledby, aria-label and aria-hidden in step with state.

No custom key handling; Tab and the native activation keys do the work.

Motion #

It declares no animation in its component source. Any transition comes from its stylesheet, which uses the duration tokens that collapse to instant under prefers-reduced-motion.