/* ─── Sterna landing components ─── */ const SternaLogo = ({ size = 38 }) => ( Sterna ); const Brand = ({ module = 'Nexus' }) => (
STERNA
{module &&
{module}
}
); /* ── Trial banner ── */ const TrialBanner = () => (
Trial release – Sterna is a proof-of-concept tool intended for feasibility evaluation only. Its features are still limited and subject to change. Share feedback →
); /* ── Top nav ── */ const Nav = ({ onSignIn, onRegister }) => ( ); /* ── Hero ── */ const HeroProductMock = () => ( ); const Hero = ({ headline, lede, onRegister }) => (
The Sterna Initiative

{lede}

Tool 1 of N
Sterna Nexus — available now
Built for
CFOs, Controllers, Group Reporting
Status
Trial release · feedback wanted

); /* ── Product overview ── */ const Product = () => (
Tool 1 · Sterna Nexus

Two reconciliation problems, one engine.

Nexus auto-matches transactions across ledgers and flags every discrepancy with a clear, auditable explanation. Drop in your files — Excel, CSV, bank extracts — and the engine figures out the column mappings on its own.

Intercompany matching

Pair receivables with payables across group entities. Nexus matches by invoice ID first, then falls back to fuzzy logic on amount, currency, and counterparty.

Bank vs ledger reconciliation

Compare any two statement sources — bank vs GL, broker vs treasury, sub-ledger vs consolidation. Suggested matches surface for review; auto-matches close themselves.

Mismatches, explained

Every flag carries a reason: amount delta, missing counterparty, FX inconsistency, date slip, orphan entry. Click through to the exact rows and export the report to Excel.

Workspaces & access

Each organization gets a private workspace. Invite teammates with one-time keys; admins manage roles. Your data never crosses tenant boundaries.

Field mapping memory

Nexus learns your column names — "Customer Ref", "Doc N°", "Amount" — and applies the same mapping next month, on the same files, automatically.

Multiple languages, one report.

Six languages are currently supported (EN, IT, FR, ES, DE, NL) but more can be added on request. Run analyses in your team's language and export reports your auditors can read without translation overhead.

); /* ── How it works ── */ const HowItWorks = () => (
In three steps

From two spreadsheets to a clean report — in minutes.

No setup project, no schema design. Drop your files in, run the analysis, review the exceptions. The tool handles the matching; you handle the judgment calls.

Step 01 — Upload

Drop your files into a workspace folder.

One file per company, or two statements to reconcile. Nexus reads Excel, CSV, and most accounting exports.

# /q3-2026-close/
alpha_ledger.xlsx    148 KB
beta_ledger.xlsx     121 KB
gamma_ledger.xlsx   183 KB
Step 02 — Match

Click Run. The engine handles the rest.

Auto-detects column mappings, matches by invoice ID and amount, and reconciles cross-currency entries.

78%
Reconciling 1,840 rows · 6 unmatched so far
Step 03 — Review

Approve, investigate, export.

Walk through the mismatches with one-click drill-down. Export the final report to Excel, ready for the close.

✓ Auto-matched238
⚠ Suggested4
✕ Needs action6
); /* ── Suite roadmap ── */ const Suite = ({ tools, onSignIn }) => (
The Sterna Suite

A growing toolkit for the office of the CFO.

Nexus is the first tool released for trial. More are in preparation — each one targeting a recurring, manual finance task that should already be automated.

{tools.map((tool, i) => (
{tool.status}
{tool.name}
{tool.desc}
{tool.live ? : {tool.eta} }
))}
); /* ── Feedback / Survey ── */ const FeedbackSection = ({ onSubmit }) => { const INIT = { role: '', work_type: '', scope: '', pain_interco: 0, pain_bank: 0, tool_support: '', tool_adequacy: 0, nexus_fit: 0, pmf: 0, must_do: '', suite_suggestions: '', email: '', additional: '', optin: false, }; const [form, setForm] = React.useState(INIT); const [errors, setErrors] = React.useState({}); const [sent, setSent] = React.useState(false); const [busy, setBusy] = React.useState(false); const [expanded, setExpanded] = React.useState(false); const set = (k, v) => { setForm(f => ({ ...f, [k]: v })); if (errors[k]) setErrors(e => { const n = { ...e }; delete n[k]; return n; }); }; const cancel = () => { setExpanded(false); setForm(INIT); setErrors({}); }; const RatingField = ({ field, error, lowLabel, highLabel }) => (
{[1,2,3,4,5].map(n => ( ))}
{lowLabel}{highLabel}
{error &&
{error}
}
); const needsToolAdequacy = form.tool_support === 'Partially' || form.tool_support === 'Fully covered'; const validate = () => { const e = {}; if (!form.role) e.role = 'Please select your role.'; if (!form.work_type) e.work_type = 'Please select how you work.'; if (!form.scope) e.scope = 'Please select your scope.'; if (!form.pain_interco) e.pain_interco = 'Please rate this.'; if (!form.pain_bank) e.pain_bank = 'Please rate this.'; if (!form.tool_support) e.tool_support = 'Please select one.'; if (needsToolAdequacy && !form.tool_adequacy) e.tool_adequacy = 'Please rate this.'; if (!form.nexus_fit) e.nexus_fit = 'Please rate this.'; if (!form.pmf) e.pmf = 'Please rate this.'; if (!form.must_do.trim() || form.must_do.trim().length < 8) e.must_do = 'Please share at least a few words.'; if (!form.email.trim()) e.email = 'Email is required.'; else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(form.email)) e.email = "That doesn't look like a valid email."; setErrors(e); return Object.keys(e).length === 0; }; const submit = async (ev) => { ev.preventDefault(); if (!validate()) return; setBusy(true); await fetch('/feedback', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(form), }).catch(() => {}); setBusy(false); setSent(true); onSubmit && onSubmit('Thank you — your responses have been recorded.'); }; if (sent) return (

Thank you for your input.

Your responses help shape the Sterna roadmap. We'll be in touch if you opted in.

); if (!expanded) return (
We're listening

Tell us what works — and what gets in the way.

A short questionnaire to help us understand real finance workflows and prioritise what to build next. It covers your current setup, pain points, and first impressions of Nexus. Under 3 minutes.

💡 For the most meaningful responses, we suggest trying Nexus first — but you're welcome to share your perspective at any stage.
); return (
We're listening

Tell us what works — and what gets in the way.

Under 3 minutes. All fields marked * are required.

{/* Section 1 */}
Section 1 — About you
{errors.role &&
{errors.role}
}
{errors.work_type &&
{errors.work_type}
}
{errors.scope &&
{errors.scope}
}
{/* Section 2 */}
Section 2 — Your current situation
{errors.tool_support &&
{errors.tool_support}
}
{needsToolAdequacy && (
)}
{/* Section 3 */}
Section 3 — Fit & intent