diff --git a/i18n/de.json b/i18n/de.json index a0f2f63..ebbbf09 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -1,45 +1,31 @@ { - "solon": { - "title": "SOLON", - "tagline": "Bitcoin-natives Governance für das digitale Zeitalter", - "subtag": "Vollständig transparente Entscheidungen und Finanzierung für jede Organisation.", - "cta_primary": "Treasury erkunden", - "cta_secondary": "Live-Abstimmung ansehen", - "pillars": { - "transactions": "Transparenter Transaktionssystem", - "decisions": "Rahmenwerk für transparente Gesetze", - "marketplace": "Offener Service-Marktplatz", - "voting": "Offenes Abstimmungssystem" - }, - "pillar_desc": { - "transactions": "Alle Finanzen auf Bitcoin", - "decisions": "Signierte Entscheidungen mit KPIs", - "marketplace": "Transparente Beschaffung", - "voting": "Verifizierte, gewichtete Abstimmung" - }, - "ledger": { - "label": "Live Bitcoin-Treasury", - "live": "Live", - "public": "Öffentliches Hauptbuch", - "balance": "Treasury-Saldo", - "verified": "On-Chain verifiziert" - } + "solon": { + "title": "SOLON", + "tagline": "Bitcoin-native Governance für das digitale Zeitalter", + "subtag": "Transparente Entscheidungen und Schatzkammern für Organisationen aus Menschen und KI-Agenten.", + "cta_primary": "Live-Governance ansehen", + "cta_secondary": "Live-Abstimmung ansehen", + "bullets": { + "transparency": "Watch-only-Schatzkammern — Solon hält keine Schlüssel, keine Gelder", + "democracy": "Bitcoin-signierte Stimmen, von jedem überprüfbar", + "global": "Unveränderliches, öffentliches Audit-Protokoll" + } + }, + "home": { + "made_in": "Hergestellt in der Schweiz", + "pillars_section": { + "title": "Was Solon regiert", + "subtitle": "Schatzkammer, Abstimmung, Entscheidungen und Audit — als ein System entworfen, jede Aussage am laufenden System überprüfbar." + }, + "demo_section": { + "title": "Transparenz in Aktion", + "subtitle": "Jede Transaktion, Entscheidung und Abstimmung wird dauerhaft auf der Bitcoin-Blockchain festgehalten — vollständig prüfbar und öffentlich verifizierbar." }, - "home": { - "made_in": "Hergestellt in der Schweiz", - "pillars_section": { - "title": "Vier Säulen Bitcoin-nativer Governance", - "subtitle": "Vollständige Transparenz, kryptografische Demokratie und Bitcoin-native Finanzoperationen — als ein System konzipiert, nicht nachträglich aufgesetzt." - }, - "demo_section": { - "title": "Transparenz in Aktion", - "subtitle": "Jede Transaktion, Entscheidung und Abstimmung wird dauerhaft auf der Bitcoin-Blockchain festgehalten — vollständig prüfbar und öffentlich verifizierbar." - }, - "cta": { - "title": "Bereit, Ihre Organisation zu revolutionieren?", - "subtitle": "Werden Sie Teil der Zukunft transparenter Governance. Jede Entscheidung, jede Transaktion, jede Abstimmung — kryptografisch verifiziert und dauerhaft prüfbar.", - "primary": "Organisation starten", - "secondary": "Mehr erfahren" - } + "cta": { + "title": "Regieren im Offenen", + "subtitle": "Jede Entscheidung, jede Stimme, jeder Satoshi — signiert, protokolliert und von jedem überprüfbar.", + "primary": "Dashboard öffnen", + "secondary": "Funktionen ansehen" } -} + } +} \ No newline at end of file diff --git a/i18n/en.json b/i18n/en.json index dcc5fd0..de1baef 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -1,57 +1,31 @@ { - "solon": { - "title": "SOLON", - "tagline": "Bitcoin-Native Governance for the Digital Age", - "subtag": "Completely transparent decision-making and financing for any organization.", - "cta_primary": "Explore the Treasury", - "cta_secondary": "See Live Voting", - "pillars": { - "transactions": "Transparent Transaction System", - "decisions": "Law Transparency Framework", - "marketplace": "Open Service Marketplace", - "voting": "Open Vote System" - }, - "pillar_desc": { - "transactions": "All finances on Bitcoin", - "decisions": "Signed decisions with KPIs", - "marketplace": "Transparent procurement", - "voting": "Verified, weighted voting" - }, - "bullets": { - "transparency": "Radical Financial Transparency (Bitcoin blockchain)", - "democracy": "Cryptographic Democracy (Signed votes & decisions)", - "market": "Service Marketplace (Bitcoin-native procurement)", - "global": "Global by Design (No traditional banking)" - }, - "bitcoin": { - "treasury": "Bitcoin Treasury", - "balance": "Balance", - "transactions": "Transactions", - "signature": "Cryptographic Signature" - }, - "ledger": { - "label": "Live Bitcoin Treasury", - "live": "Live", - "public": "Public ledger", - "balance": "Treasury balance", - "verified": "On-chain verified" - } + "solon": { + "title": "SOLON", + "tagline": "Bitcoin-Native Governance for the Digital Age", + "subtag": "Transparent decision-making and treasuries for organizations of humans and AI agents.", + "cta_primary": "See the live governed state", + "cta_secondary": "See Live Voting", + "bullets": { + "transparency": "Watch-only treasuries — Solon holds no keys, no funds", + "democracy": "Bitcoin-signed votes anyone can re-verify", + "global": "Append-only audit trail, public by default" + } + }, + "home": { + "made_in": "Made in Switzerland", + "pillars_section": { + "title": "What Solon Governs", + "subtitle": "Treasury, voting, decisions, and audit — designed as one system, with every claim verifiable against the running platform." + }, + "demo_section": { + "title": "See Transparency in Action", + "subtitle": "Every transaction, decision, and vote is permanently recorded on the Bitcoin blockchain for complete auditability and public verification." }, - "home": { - "made_in": "Made in Switzerland", - "pillars_section": { - "title": "Four Pillars of Bitcoin-Native Governance", - "subtitle": "Complete transparency, cryptographic democracy, and Bitcoin-native financial operations — designed as one system, not bolted on as an afterthought." - }, - "demo_section": { - "title": "See Transparency in Action", - "subtitle": "Every transaction, decision, and vote is permanently recorded on the Bitcoin blockchain for complete auditability and public verification." - }, - "cta": { - "title": "Ready to Revolutionize Your Organization?", - "subtitle": "Join the future of transparent governance. Every decision, every transaction, every vote — cryptographically verified and permanently auditable.", - "primary": "Start Your Organization", - "secondary": "Learn More" - } + "cta": { + "title": "Govern in the open", + "subtitle": "Every decision, every vote, every satoshi — signed, recorded, and re-verifiable by anyone.", + "primary": "Open the Dashboard", + "secondary": "See the features" } -} + } +} \ No newline at end of file diff --git a/i18n/fr.json b/i18n/fr.json index bb448aa..0d0b4c6 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -1,45 +1,31 @@ { - "solon": { - "title": "SOLON", - "tagline": "Gouvernance native Bitcoin pour l'ère numérique", - "subtag": "Décisions et financements totalement transparents pour toute organisation.", - "cta_primary": "Explorer le Trésor", - "cta_secondary": "Voir le vote en direct", - "pillars": { - "transactions": "Système de transactions transparent", - "decisions": "Cadre de transparence des lois", - "marketplace": "Marché ouvert de services", - "voting": "Système de vote ouvert" - }, - "pillar_desc": { - "transactions": "Toutes les finances sur Bitcoin", - "decisions": "Décisions signées avec KPI", - "marketplace": "Approvisionnement transparent", - "voting": "Vote vérifié et pondéré" - }, - "ledger": { - "label": "Trésor Bitcoin en direct", - "live": "En direct", - "public": "Registre public", - "balance": "Solde du trésor", - "verified": "Vérifié on-chain" - } + "solon": { + "title": "SOLON", + "tagline": "Gouvernance native Bitcoin pour l'ère numérique", + "subtag": "Décisions et trésoreries transparentes pour des organisations d'humains et d'agents IA.", + "cta_primary": "Voir l'état gouverné en direct", + "cta_secondary": "Voir le vote en direct", + "bullets": { + "transparency": "Trésoreries en lecture seule — Solon ne détient ni clés ni fonds", + "democracy": "Votes signés Bitcoin, vérifiables par tous", + "global": "Journal d'audit public et immuable" + } + }, + "home": { + "made_in": "Conçu en Suisse", + "pillars_section": { + "title": "Ce que Solon gouverne", + "subtitle": "Trésorerie, vote, décisions et audit — conçus comme un seul système, chaque affirmation vérifiable sur la plateforme en marche." + }, + "demo_section": { + "title": "La transparence en action", + "subtitle": "Chaque transaction, décision et vote est enregistré de façon permanente sur la blockchain Bitcoin, pour une auditabilité complète et une vérification publique." }, - "home": { - "made_in": "Conçu en Suisse", - "pillars_section": { - "title": "Quatre piliers de la gouvernance native Bitcoin", - "subtitle": "Transparence totale, démocratie cryptographique et opérations financières natives Bitcoin — conçues comme un seul système, pas ajoutées après coup." - }, - "demo_section": { - "title": "La transparence en action", - "subtitle": "Chaque transaction, décision et vote est enregistré de façon permanente sur la blockchain Bitcoin, pour une auditabilité complète et une vérification publique." - }, - "cta": { - "title": "Prêt à révolutionner votre organisation ?", - "subtitle": "Rejoignez l'avenir de la gouvernance transparente. Chaque décision, chaque transaction, chaque vote — vérifié cryptographiquement et auditable en permanence.", - "primary": "Lancer votre organisation", - "secondary": "En savoir plus" - } + "cta": { + "title": "Gouverner au grand jour", + "subtitle": "Chaque décision, chaque vote, chaque satoshi — signé, enregistré et vérifiable par tous.", + "primary": "Ouvrir le tableau de bord", + "secondary": "Voir les fonctionnalités" } -} + } +} \ No newline at end of file diff --git a/i18n/it.json b/i18n/it.json index 100fff5..d627a68 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -1,45 +1,31 @@ { - "solon": { - "title": "SOLON", - "tagline": "Governance nativa Bitcoin per l'era digitale", - "subtag": "Decisioni e finanziamenti completamente trasparenti per qualsiasi organizzazione.", - "cta_primary": "Esplora il Tesoro", - "cta_secondary": "Vedi il voto in tempo reale", - "pillars": { - "transactions": "Sistema di transazioni trasparente", - "decisions": "Quadro di trasparenza delle leggi", - "marketplace": "Mercato aperto dei servizi", - "voting": "Sistema di voto aperto" - }, - "pillar_desc": { - "transactions": "Tutte le finanze su Bitcoin", - "decisions": "Decisioni firmate con KPI", - "marketplace": "Approvvigionamento trasparente", - "voting": "Voto verificato e ponderato" - }, - "ledger": { - "label": "Tesoro Bitcoin in tempo reale", - "live": "In diretta", - "public": "Registro pubblico", - "balance": "Saldo del tesoro", - "verified": "Verificato on-chain" - } + "solon": { + "title": "SOLON", + "tagline": "Governance nativa Bitcoin per l'era digitale", + "subtag": "Decisioni e tesorerie trasparenti per organizzazioni di persone e agenti IA.", + "cta_primary": "Vedi lo stato governato dal vivo", + "cta_secondary": "Vedi il voto dal vivo", + "bullets": { + "transparency": "Tesorerie in sola lettura — Solon non detiene chiavi né fondi", + "democracy": "Voti firmati Bitcoin, verificabili da chiunque", + "global": "Registro di audit pubblico e immutabile" + } + }, + "home": { + "made_in": "Realizzato in Svizzera", + "pillars_section": { + "title": "Cosa governa Solon", + "subtitle": "Tesoreria, voto, decisioni e audit — progettati come un unico sistema, ogni affermazione verificabile sulla piattaforma." + }, + "demo_section": { + "title": "La trasparenza in azione", + "subtitle": "Ogni transazione, decisione e voto è registrato in modo permanente sulla blockchain Bitcoin, per una verificabilità completa e pubblica." }, - "home": { - "made_in": "Realizzato in Svizzera", - "pillars_section": { - "title": "Quattro pilastri della governance nativa Bitcoin", - "subtitle": "Trasparenza totale, democrazia crittografica e operazioni finanziarie native Bitcoin — progettate come un unico sistema, non aggiunte come ripensamento." - }, - "demo_section": { - "title": "La trasparenza in azione", - "subtitle": "Ogni transazione, decisione e voto è registrato in modo permanente sulla blockchain Bitcoin, per una verificabilità completa e pubblica." - }, - "cta": { - "title": "Pronto a rivoluzionare la tua organizzazione?", - "subtitle": "Unisciti al futuro della governance trasparente. Ogni decisione, ogni transazione, ogni voto — verificato crittograficamente e sempre auditabile.", - "primary": "Avvia la tua organizzazione", - "secondary": "Scopri di più" - } + "cta": { + "title": "Governare alla luce del sole", + "subtitle": "Ogni decisione, ogni voto, ogni satoshi — firmato, registrato e verificabile da chiunque.", + "primary": "Apri la dashboard", + "secondary": "Vedi le funzionalità" } -} + } +} \ No newline at end of file diff --git a/src/app/(dashboard)/dashboard/page.tsx b/src/app/(dashboard)/dashboard/page.tsx index 1f06c22..e986982 100644 --- a/src/app/(dashboard)/dashboard/page.tsx +++ b/src/app/(dashboard)/dashboard/page.tsx @@ -1,9 +1,134 @@ -export default function DashboardOverview() { +import Link from "next/link"; +import { prisma } from "@/lib/db"; +import { sessionTally } from "@/lib/domain/voting"; +import { treasuryReport } from "@/lib/domain/treasury"; + +export const dynamic = "force-dynamic"; + +/** + * The overview is a real summary: latest voting session with its tally, + * treasury standing, and the most recent audit events — each linking to + * its full view. Every number is read live; empty states say so. + */ +export default async function DashboardOverview() { + let org = null; + let session: { id: string; status: string; proposalTitle: string; outcome: string | null } | null = null; + let tallyLine: string | null = null; + let treasuryLine = "No treasury source registered yet."; + let events: { id: string; eventType: string; createdAt: Date }[] = []; + let dbError = false; + + try { + org = await prisma.organization.findFirst({ orderBy: { createdAt: "asc" } }); + const s = await prisma.votingSession.findFirst({ + orderBy: { opensAt: "desc" }, + include: { proposal: true }, + }); + if (s) { + session = { + id: s.id, + status: s.status, + proposalTitle: s.proposal.title, + outcome: s.outcome, + }; + const t = await sessionTally(s.id); + tallyLine = `yes ${t.yes} · no ${t.no} · abstain ${t.abstain}`; + } + if (org) { + const report = await treasuryReport(org.id); + if (report.sources.length > 0) { + treasuryLine = + report.totalSats !== null + ? `${report.sources.length} source(s), ${report.totalSats.toString()} sats on-chain` + : `${report.sources.length} source(s) registered; balance currently unresolved`; + } + events = await prisma.auditEvent.findMany({ + where: { organizationId: org.id }, + orderBy: { createdAt: "desc" }, + take: 3, + select: { id: true, eventType: true, createdAt: true }, + }); + } + } catch { + dbError = true; + } + + if (dbError) { + return ( +
+

Overview

+

+ The governance register is currently unreachable. No live data can be shown. +

+
+ ); + } + return (
-

Solon Overview

-

Track your Bitcoin treasury, decisions, and active votes.

+

+ {org ? `${org.name} — Overview` : "Overview"} +

+ {!org && ( +

+ No organization is registered yet. Once one exists, its votes, treasury, and audit + trail appear here. +

+ )} + {org && ( +
+ +
+ Latest vote +
+ {session ? ( + <> +
{session.proposalTitle}
+
+ {session.outcome ?? session.status} + {tallyLine ? ` · ${tallyLine}` : ""} +
+ + ) : ( +
No voting session opened yet.
+ )} + + + +
+ Treasury +
+
{treasuryLine}
+ + + +
+ Recent activity +
+ {events.length === 0 ? ( +
No audit events yet.
+ ) : ( + + )} + +
+ )}
); } - diff --git a/src/app/(dashboard)/dashboard/treasury/page.tsx b/src/app/(dashboard)/dashboard/treasury/page.tsx index 45def7e..f02acf3 100644 --- a/src/app/(dashboard)/dashboard/treasury/page.tsx +++ b/src/app/(dashboard)/dashboard/treasury/page.tsx @@ -17,7 +17,7 @@ export default async function TreasuryPage() { return (

Treasury

-

+

{dbError ? "The treasury register is currently unreachable. No balance can be shown." : "No organization is registered yet, so there is no treasury to show."} diff --git a/src/app/(dashboard)/dashboard/voting/page.tsx b/src/app/(dashboard)/dashboard/voting/page.tsx index 0294cc7..cdcabc3 100644 --- a/src/app/(dashboard)/dashboard/voting/page.tsx +++ b/src/app/(dashboard)/dashboard/voting/page.tsx @@ -20,7 +20,7 @@ export default async function VotingPage() { return (

Voting

-

+

The voting register is currently unreachable. No session data can be shown.

@@ -31,7 +31,7 @@ export default async function VotingPage() { return (

Voting

-

+

No voting session has been opened yet. When one opens, registered members vote here by signing the canonical vote message with their own Bitcoin wallet.

diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx index 506335a..67e2b6b 100644 --- a/src/app/(dashboard)/layout.tsx +++ b/src/app/(dashboard)/layout.tsx @@ -1,26 +1,38 @@ +"use client"; + +import Link from "next/link"; +import { usePathname } from "next/navigation"; + +const TABS = [ + { title: "Overview", href: "/dashboard" }, + { title: "Treasury", href: "/dashboard/treasury" }, + { title: "Voting", href: "/dashboard/voting" }, +]; + export default function DashboardLayout({ children }: { children: React.ReactNode }) { + const pathname = usePathname(); + return (
-
@@ -29,4 +41,3 @@ export default function DashboardLayout({ children }: { children: React.ReactNod
); } - diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index e3f0cb2..b542cfb 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -1,94 +1,95 @@ import PageLayout from '@/components/ui/page-layout'; +import { ECOSYSTEM_PILLARS } from '@/lib/config/ecosystem'; +import { Eye, Vote, Bitcoin, Github } from 'lucide-react'; export default function AboutPage() { return ( - -
- +
+ {/* Mission Section */}
-

Our Mission

+

Why Solon exists

- Solon is building the future of organizational governance through radical transparency - and cryptographic democracy. We believe every organization deserves complete financial - transparency and democratic decision-making without the overhead of traditional systems. + Most governance runs on trust: trust the treasurer, trust the minutes, trust that the + vote was counted. Solon replaces that trust with verification. Votes are Bitcoin + signed messages anyone can re-check. Decisions are published as self-verifying + documents. The audit trail is append-only. The treasury is watch-only — Solon never + holds keys or funds.

- By leveraging Bitcoin's immutable blockchain and cryptographic signatures, we enable - organizations to operate with unprecedented transparency while maintaining security - and privacy where needed. + Solon is the governance pillar of a three-product stack, and it practices what it + ships: its first production organization governs the stack itself, with AI agents + from the sibling products registered as voting members and humans holding the red + lines.

- {/* Principles */} -
- + {/* Principles — each one is a design invariant in the codebase, not a slogan */} +
} /> } /> } />
- {/* Team Section */} + {/* Who runs it — the real, running answer */}
-

The Team

-
- - - -
+

Who runs it

+

+ Solon is operated as part of the OrangeCat stack and governed on its own rails. The + current voting members — including the sibling products' agents, The Cat and Loki — + and every policy they govern are public on the ecosystem page. +

+
    + {ECOSYSTEM_PILLARS.map((p) => ( +
  • + {p.name} + — {p.role}. + {p.description} +
  • + ))} +
- {/* Contact CTA */} + {/* CTA — real destinations only */}
-
-

Ready to Transform Your Organization?

+
+

See it running

- Join the future of transparent governance. Contact us to learn how Solon can - revolutionize your organization's operations. + The live governed state — members, policies, decisions — is public. So is the code.

- - + + Live governed state + + + Source code +
@@ -100,29 +101,13 @@ export default function AboutPage() { function PrincipleCard({ title, description, icon }: { title: string; description: string; - icon: string; + icon: React.ReactNode; }) { return (
-
{icon}
-

{title}

+
{icon}
+

{title}

{description}

); } - -function TeamMember({ name, role, bio, avatar }: { - name: string; - role: string; - bio: string; - avatar: string; -}) { - return ( -
-
{avatar}
-

{name}

-

{role}

-

{bio}

-
- ); -} \ No newline at end of file diff --git a/src/app/ecosystem/page.tsx b/src/app/ecosystem/page.tsx index 73d5d28..29e9cdb 100644 --- a/src/app/ecosystem/page.tsx +++ b/src/app/ecosystem/page.tsx @@ -102,14 +102,14 @@ export default async function EcosystemPage() { key={pillar.key} className={`rounded-xl border shadow-sm p-6 flex flex-col gap-3 ${ pillar.key === "solon" - ? "bg-[var(--navy)] border-[var(--navy)] text-white" + ? "bg-navy border-navy text-white" : "bg-white border-gray-200" }`} >

{pillar.name} @@ -117,7 +117,7 @@ export default async function EcosystemPage() { @@ -148,7 +148,7 @@ export default async function EcosystemPage() { href={pillar.url} target="_blank" rel="noopener noreferrer" - className="text-sm font-semibold text-[var(--solon-orange)] hover:text-[var(--solon-orange-dark)]" + className="text-sm font-semibold text-solon-orange hover:text-solon-orange-dark" > {pillar.url.replace("https://", "")} → @@ -160,7 +160,7 @@ export default async function EcosystemPage() { {/* How a decision travels */}
-

+

How a decision travels

    @@ -173,7 +173,7 @@ export default async function EcosystemPage() { "OrangeCat and FleetCrown are notified — and OrangeCat re-verifies every vote signature against its own pinned keys before acting. A decision is evidence, not authority.", ].map((step, i) => (
  1. - + {i + 1} {step} @@ -189,7 +189,7 @@ export default async function EcosystemPage() { {/* Live governed state */}
    -

    +

    What is governed here, live

    {dbError && ( @@ -210,14 +210,14 @@ export default async function EcosystemPage() {

    -

    +

    {org.name} — members

      {members.map((m) => (
    • - {m.displayName} + {m.displayName} {m.memberType} {m.system ? ` · ${m.system}` : ""} · {m.status} @@ -232,7 +232,7 @@ export default async function EcosystemPage() {
      -

      Active policies

      +

      Active policies

      {policies.length === 0 ? (

      No active policies.

      ) : ( @@ -243,7 +243,7 @@ export default async function EcosystemPage() { className="bg-white rounded-xl border border-gray-200 shadow-sm p-4" >
      - + {p.key} v{p.version} @@ -258,7 +258,7 @@ export default async function EcosystemPage() {
      -

      Recent proposals

      +

      Recent proposals

      {proposals.length === 0 ? (

      No proposals yet.

      ) : ( @@ -266,7 +266,7 @@ export default async function EcosystemPage() { {proposals.map((p) => (
    • - {p.title} + {p.title} {CATEGORY_LABEL[p.category]} ·{" "} {p.session?.outcome ?? p.session?.status ?? p.status} @@ -275,7 +275,7 @@ export default async function EcosystemPage() { {p.session?.outcome && ( self-verifying decision document → diff --git a/src/app/features/page.tsx b/src/app/features/page.tsx index 8083fff..5f02c08 100644 --- a/src/app/features/page.tsx +++ b/src/app/features/page.tsx @@ -3,56 +3,80 @@ import { Bitcoin, Vote, Eye, - Store, - Globe, + ScrollText, + Bot, Plug, Check, type LucideIcon, } from 'lucide-react'; +/** + * Every feature listed here exists in this repo today. If a capability is + * planned but not built, it does not belong on this page. + */ export default function FeaturesPage() { return ( -
      - - - - - - +
      +
      + + + + + + +
      + + {/* Where to go next */} +
      ); diff --git a/src/app/governance/audit/page.tsx b/src/app/governance/audit/page.tsx index 525a848..831b906 100644 --- a/src/app/governance/audit/page.tsx +++ b/src/app/governance/audit/page.tsx @@ -63,7 +63,7 @@ export default async function AuditPage() { {events.map((e) => (
    • - {EVENT_LABEL[e.eventType]} + {EVENT_LABEL[e.eventType]} diff --git a/src/app/governance/voting/page.tsx b/src/app/governance/voting/page.tsx index 0191272..4e1ae26 100644 --- a/src/app/governance/voting/page.tsx +++ b/src/app/governance/voting/page.tsx @@ -12,7 +12,7 @@ export default function VotingSystemPage() { >
      -

      How a vote works

      +

      How a vote works

      1. A voting session opens on a proposal. Its rules — who is eligible, the @@ -35,7 +35,7 @@ export default function VotingSystemPage() {
      -

      What this gives you

      +

      What this gives you

      • Cryptographic verification — a vote is @@ -56,7 +56,7 @@ export default function VotingSystemPage() {
        Go to live voting diff --git a/src/app/integration/page.tsx b/src/app/integration/page.tsx index d997a92..cbb6899 100644 --- a/src/app/integration/page.tsx +++ b/src/app/integration/page.tsx @@ -13,7 +13,7 @@ export default function IntegrationPage() { >
        -

        Cast a cryptographic vote

        +

        Cast a cryptographic vote

        A vote is a Bitcoin signed message. Sign the canonical vote message with the wallet that holds your registered member address, then POST the signature: @@ -40,70 +40,70 @@ export default function IntegrationPage() {

        -

        Live endpoints

        +

        Live endpoints

        • - + POST /api/proposals file a signed proposal
        • - + POST /api/proposals/[proposalId]/open open the voting session
        • - + GET /api/sessions/[sessionId] session, snapshotted rules, live tally
        • - + POST /api/sessions/[sessionId]/votes cast a signed vote
        • - + POST /api/sessions/[sessionId]/close close after the window and decide the outcome
        • - + GET /api/orgs/[slug] organization + public member roster
        • - + GET /api/orgs/[slug]/proposals all proposals with session state
        • - + GET /api/orgs/[slug]/policies/[key] policy version history
        • - + GET /api/orgs/[slug]/audit append-only audit stream
        • - + GET /api/orgs/[slug]/treasury live on-chain treasury balances
        • - + GET /api/v1/decisions/[sessionId] @@ -111,7 +111,7 @@ export default function IntegrationPage() {
        • - + GET /api/health service health diff --git a/src/app/security/page.tsx b/src/app/security/page.tsx index 7885086..b761210 100644 --- a/src/app/security/page.tsx +++ b/src/app/security/page.tsx @@ -1,72 +1,106 @@ import PageLayout from '@/components/ui/page-layout'; +/** + * The real security model, stated plainly. Every claim on this page maps to + * code in this repo — nothing aspirational, nothing borrowed from a future + * roadmap. The strongest claim Solon can make is what it does NOT have: + * no private keys, no custody, no way to rewrite history. + */ export default function SecurityPage() { return ( - -
          +
          -
          -

          Security Guarantees

          +
          +

          What this buys you

          -

          Financial Security

          -

          Multi-signature Bitcoin custody with enterprise-grade security practices

          +

          Nothing to seize

          +

          + Compromising Solon's servers yields no keys and no funds — only records that were + already public. +

          -

          Vote Integrity

          -

          Cryptographically verified voting with tamper-proof results

          +

          Nothing to forge

          +

          + A vote that doesn't verify against the member's Bitcoin address is rejected. Solon + cannot invent votes, and neither can an attacker. +

          -

          Data Immutability

          -

          Blockchain-anchored records that cannot be altered or deleted

          +

          Nothing to rewrite

          +

          + Decisions travel with their evidence. Consumers recount the tally themselves — + Solon's word is evidence, not authority. +

          + + {/* Where to verify the claims */} +
          +

          + Verify, don't trust:{' '} + + how voting works + + {' · '} + + the live audit trail + + {' · '} + + the source code + +

          +
          ); @@ -79,12 +113,12 @@ function SecurityFeature({ title, description, details }: { }) { return (
          -

          {title}

          +

          {title}

          {description}

            {details.map((detail, index) => ( -
          • - +
          • + {detail} @@ -93,4 +127,4 @@ function SecurityFeature({ title, description, details }: {
          ); -} \ No newline at end of file +} diff --git a/src/app/treasury/bitcoin/page.tsx b/src/app/treasury/bitcoin/page.tsx index cf612d0..9f6c3be 100644 --- a/src/app/treasury/bitcoin/page.tsx +++ b/src/app/treasury/bitcoin/page.tsx @@ -12,7 +12,7 @@ export default function BitcoinTreasuryPage() { >
          -

          The model

          +

          The model

          • Bitcoin-native — the treasury is a @@ -36,7 +36,7 @@ export default function BitcoinTreasuryPage() {
            View the treasury diff --git a/src/components/dashboard/bitcoin-treasury.tsx b/src/components/dashboard/bitcoin-treasury.tsx index 26d14b3..c5ed8f3 100644 --- a/src/components/dashboard/bitcoin-treasury.tsx +++ b/src/components/dashboard/bitcoin-treasury.tsx @@ -12,19 +12,19 @@ export default function BitcoinTreasury({ orgName, report }: { orgName: string;
            -

            Bitcoin Treasury

            +

            Bitcoin Treasury

            Organization: {orgName}

            On-chain balance (BTC){report.allSourcesResolved ? "" : " — some sources unavailable"}
            -
            {totalBtc ?? "unavailable"}
            +
            {totalBtc ?? "unavailable"}
            -

            Treasury sources (watch-only)

            +

            Treasury sources (watch-only)

            {report.sources.length === 0 ? (

            No treasury source registered yet. When one is, its balance renders here from a @@ -50,7 +50,7 @@ export default function BitcoinTreasury({ orgName, report }: { orgName: string; diff --git a/src/components/dashboard/voting-interface.tsx b/src/components/dashboard/voting-interface.tsx index 966666c..c517e35 100644 --- a/src/components/dashboard/voting-interface.tsx +++ b/src/components/dashboard/voting-interface.tsx @@ -32,6 +32,8 @@ export default function VotingInterface({ session, tally }: VotingInterfaceProps const [verdict, setVerdict] = useState(null); const [copied, setCopied] = useState(false); + const isOpen = session.status === "ACTIVE"; + const message = address ? voteMessage({ sessionId: session.id, choice, memberAddress: address }) : null; @@ -59,12 +61,27 @@ export default function VotingInterface({ session, tally }: VotingInterfaceProps

            -

            {session.title}

            +

            {session.title}

            {session.rules}

            Session: {session.status}
            + {!isOpen && ( +
            + )} + + {isOpen && (
            )}
            + )}
            -

            Tally (weighted)

            +

            Tally (weighted)

            diff --git a/src/components/marketing/four-pillars.tsx b/src/components/marketing/four-pillars.tsx index 4717703..f55de15 100644 --- a/src/components/marketing/four-pillars.tsx +++ b/src/components/marketing/four-pillars.tsx @@ -1,186 +1,114 @@ -'use client' +import { Bitcoin, Scale, Eye, Users, ArrowRight } from 'lucide-react' +import Link from 'next/link' -import { useState } from 'react' -import { Bitcoin, Scale, ShoppingCart, Users, ArrowRight, CheckCircle } from 'lucide-react' +/** + * What Solon governs — the four product areas, matching the repo canon + * (Treasury / Voting / Decisions / Audit Trail). Server component: there is + * nothing interactive here, and every feature listed exists in production. + * "Pillars" is deliberately NOT used for these — that word belongs to the + * three-product stack (see /ecosystem). + */ -export function FourPillars() { - const [activePillar, setActivePillar] = useState(null) - - const pillars = [ - { - id: 1, - icon: Bitcoin, - title: "Transparent Transaction System", - shortDesc: "All finances on Bitcoin blockchain", - description: "Every financial transaction is permanently recorded on the Bitcoin blockchain, ensuring complete transparency and auditability. No more hidden spending or questionable financial decisions.", - features: [ - "Real-time Bitcoin balance tracking", - "Immutable transaction history", - "Multi-signature wallet security", - "Automated budget enforcement", - "Cost reduction through Bitcoin efficiency" - ], - color: "from-orange-400 to-yellow-400", - bgColor: "bg-orange-50", - borderColor: "border-orange-200", - textColor: "text-orange-700" - }, - { - id: 2, - icon: Scale, - title: "Law Transparency Framework", - shortDesc: "Cryptographically signed decisions", - description: "Every organizational decision is cryptographically signed and tracked with effectiveness KPIs. Create transparent policies and measure their real-world impact.", - features: [ - "Cryptographic decision signatures", - "KPI effectiveness tracking", - "Decision origin traceability", - "Policy lifecycle management", - "Impact measurement dashboard" - ], - color: "from-blue-400 to-indigo-400", - bgColor: "bg-blue-50", - borderColor: "border-blue-200", - textColor: "text-blue-700" - }, - { - id: 3, - icon: ShoppingCart, - title: "Open Service Marketplace", - shortDesc: "Bitcoin-native procurement", - description: "Transparent service procurement with Bitcoin payments. Open bidding, fair evaluation, and automated contract execution through smart contracts.", - features: [ - "Open service request posting", - "Transparent bidding process", - "Bitcoin payment automation", - "Vendor performance tracking", - "Automated contract execution" - ], - color: "from-green-400 to-emerald-400", - bgColor: "bg-green-50", - borderColor: "border-green-200", - textColor: "text-green-700" - }, - { - id: 4, - icon: Users, - title: "Open Vote System", - shortDesc: "Cryptographically verified democracy", - description: "Democratic decision-making with cryptographic verification. Every vote is signed with Bitcoin keys and permanently recorded for complete auditability.", - features: [ - "Cryptographic vote verification", - "Real-time consensus tracking", - "Flexible voting mechanisms", - "Weighted voting by Bitcoin holdings", - "Complete audit trail" - ], - color: "from-purple-400 to-pink-400", - bgColor: "bg-purple-50", - borderColor: "border-purple-200", - textColor: "text-purple-700" - } - ] +const AREAS = [ + { + icon: Bitcoin, + title: 'Transparent Treasury', + shortDesc: 'Watch-only, on-chain, no custody', + description: + 'Treasuries are registered as watch-only Bitcoin addresses anyone can verify independently. Solon holds no keys and no funds — amounts are read from the chain and stored in satoshis.', + features: [ + 'Watch-only address registry', + 'On-chain balance reads', + 'Satoshis as integers, never floats', + ], + href: '/treasury/bitcoin', + linkLabel: 'View the treasury', + }, + { + icon: Users, + title: 'Democratic Voting', + shortDesc: 'Bitcoin-signed, one member one vote', + description: + 'Votes are Bitcoin signed messages verified against each member’s registered address. Humans and AI agents vote as equals where the rules allow — and agents are locked out of the red-line categories.', + features: [ + 'Signature recovery on every vote', + 'One vote per member per session', + 'Weighted by public member weight', + ], + href: '/governance/voting', + linkLabel: 'How voting works', + }, + { + icon: Scale, + title: 'Decision Making', + shortDesc: 'Signed proposals, snapshotted rules', + description: + 'Proposals are signed by their proposer and decided in sessions whose rules — electorate, threshold, quorum — are frozen at open, so a past decision stays explainable after the rules change.', + features: [ + 'Signed proposals', + 'Versioned, vote-approved policies', + 'Self-verifying decision documents', + ], + href: '/ecosystem', + linkLabel: 'See live decisions', + }, + { + icon: Eye, + title: 'Audit Trail', + shortDesc: 'Append-only, public, complete', + description: + 'Every governance event lands in an append-only log with no update or delete path in code. The public audit page shows the record itself — not a summary of it.', + features: [ + 'Append-only by construction', + 'Every step recorded', + 'Public audit page and API', + ], + href: '/governance/audit', + linkLabel: 'Browse the audit trail', + }, +] +export function FourPillars() { return ( -
            - {pillars.map((pillar) => { - const IconComponent = pillar.icon - const isActive = activePillar === pillar.id - +
            + {AREAS.map((area) => { + const IconComponent = area.icon return (
            setActivePillar(pillar.id)} - onMouseLeave={() => setActivePillar(null)} + key={area.title} + className="rounded-lg border border-slate-200 bg-white shadow-card hover:shadow-lg transition-shadow p-8 flex flex-col" > -
            - - {/* Header */} -
            -
            - -
            -
            -

            {pillar.title}

            -

            {pillar.shortDesc}

            -
            +
            + + + +
            +

            {area.title}

            +

            {area.shortDesc}

            +
            - {/* Description */} -

            - {pillar.description} -

            - - {/* Features */} -
            - {pillar.features.map((feature, featureIndex) => ( -
            - - {feature} -
            - ))} -
            +

            {area.description}

            - {/* CTA */} -
            - Learn more - -
            +
              + {area.features.map((feature) => ( +
            • + + {feature} +
            • + ))} +
            - {/* Bitcoin Integration Note */} -
            - -
            -
            + + {area.linkLabel} + +
            ) })} - - {/* Integration Note */} -
            -
            -
            -

            - Revolutionary Integration -

            -

            - Unlike traditional governance platforms, Solon doesn't just add transparency as an afterthought. - Every pillar is designed from the ground up to leverage Bitcoin's revolutionary properties: - decentralization, immutability, and cryptographic security. -

            -
            -
            -
            - 1 -
            -

            Decentralized

            -

            No single point of failure or control

            -
            -
            -
            - 2 -
            -

            Immutable

            -

            Permanent record of all activities

            -
            -
            -
            - 3 -
            -

            Cryptographic

            -

            Mathematically verifiable security

            -
            -
            -
            -
            -
            ) } diff --git a/src/components/marketing/solon-hero.tsx b/src/components/marketing/solon-hero.tsx index c4ce946..4415cfc 100644 --- a/src/components/marketing/solon-hero.tsx +++ b/src/components/marketing/solon-hero.tsx @@ -1,17 +1,8 @@ -"use client"; import en from "@/i18n/en.json"; import de from "@/i18n/de.json"; import fr from "@/i18n/fr.json"; import it from "@/i18n/it.json"; -import { - Bitcoin, - Scale, - ShoppingCart, - Users, - Check, - ShieldCheck, - type LucideIcon, -} from "lucide-react"; +import { Check } from "lucide-react"; type Lang = "en" | "de" | "fr" | "it"; @@ -21,29 +12,22 @@ export interface SolonHeroProps { language: Lang; } +/** + * The hero states the message once and sends visitors to real destinations. + * No badges claiming states the product isn't in; the pillar detail lives in + * the section below, not duplicated here. + */ export default function SolonHero({ language }: SolonHeroProps) { const t = dict[language]?.solon ?? dict.en.solon; - const pillars: { icon: LucideIcon; title: string; desc: string }[] = [ - { icon: Bitcoin, title: t.pillars.transactions, desc: t.pillar_desc.transactions }, - { icon: Scale, title: t.pillars.decisions, desc: t.pillar_desc.decisions }, - { icon: ShoppingCart, title: t.pillars.marketplace, desc: t.pillar_desc.marketplace }, - { icon: Users, title: t.pillars.voting, desc: t.pillar_desc.voting }, - ]; - - const bullets = [t.bullets?.transparency, t.bullets?.democracy, t.bullets?.market, t.bullets?.global]; + const bullets = [t.bullets?.transparency, t.bullets?.democracy, t.bullets?.global]; return (
            - {/* Message + CTAs */}
            - - - {t.ledger.verified} - -

            +

            {t.title}

            {t.tagline}

            @@ -52,7 +36,7 @@ export default function SolonHero({ language }: SolonHeroProps) {
            {t.cta_primary} @@ -64,8 +48,8 @@ export default function SolonHero({ language }: SolonHeroProps) {
            - {/* Bullets — the core claims, compact */} -
              + {/* Bullets — the core claims, each one true of the running system */} +
                {bullets.filter(Boolean).map((b: string) => (
              • @@ -75,22 +59,6 @@ export default function SolonHero({ language }: SolonHeroProps) {
            - - {/* Pillar strip — four governance pillars with real icons */} -
            - {pillars.map(({ icon: Icon, title, desc }) => ( -
            - - - -
            {title}
            -
            {desc}
            -
            - ))} -
            ); diff --git a/src/components/ui/footer.tsx b/src/components/ui/footer.tsx index b721b8d..1aa885d 100644 --- a/src/components/ui/footer.tsx +++ b/src/components/ui/footer.tsx @@ -13,32 +13,32 @@ export default function Footer() {
            -
            Platform
            +
            Platform
              -
            • Features
            • -
            • Security
            • -
            • Integration
            • +
            • Features
            • +
            • Security
            • +
            • Integration
            -
            Governance
            +
            Governance
              -
            • Voting
            • -
            • Audit Trail
            • -
            • Bitcoin Treasury
            • +
            • Voting
            • +
            • Audit Trail
            • +
            • Bitcoin Treasury
            -
            Ecosystem
            +
            Ecosystem
              -
            • Three Pillars
            • +
            • Three Pillars
            • {siblings.map((p) => (
            • {p.name} — {p.role} @@ -47,15 +47,15 @@ export default function Footer() {
            -
            Resources
            +
            Resources
              -
            • About
            • +
            • About
            • Source Code diff --git a/src/components/ui/logo.tsx b/src/components/ui/logo.tsx index 6e1beac..13caefa 100644 --- a/src/components/ui/logo.tsx +++ b/src/components/ui/logo.tsx @@ -39,7 +39,7 @@ export default function Logo({ className = '', size = 'md' }: LogoProps) {
            -
            +
            SOLON
            diff --git a/src/components/ui/navigation.tsx b/src/components/ui/navigation.tsx index 932b09f..a5e90ff 100644 --- a/src/components/ui/navigation.tsx +++ b/src/components/ui/navigation.tsx @@ -5,7 +5,9 @@ import Logo from './logo'; import Link from 'next/link'; import { NAV_ITEMS } from '@/lib/site-config'; -// Items are now sourced from shared site config +// Structure and copy both come from the site-config SSOT. There is no +// authentication in the product, so the header offers the dashboard +// directly instead of pretending to have a sign-in. export default function Navigation() { const [activeDropdown, setActiveDropdown] = useState(null); @@ -31,7 +33,7 @@ export default function Navigation() { > {item.children ? (
            diff --git a/src/components/ui/page-layout.tsx b/src/components/ui/page-layout.tsx index 4f0f819..2628a30 100644 --- a/src/components/ui/page-layout.tsx +++ b/src/components/ui/page-layout.tsx @@ -10,7 +10,7 @@ export default function PageLayout({ children, title, description, className = "
            -

            {title}

            +

            {title}

            {description && (

            {description}

            )} diff --git a/src/lib/site-config.ts b/src/lib/site-config.ts index 54b8978..fb3e9df 100644 --- a/src/lib/site-config.ts +++ b/src/lib/site-config.ts @@ -1,47 +1,59 @@ export interface NavChildItem { title: string; href: string; + description?: string; } export interface NavSection { title: string; + description?: string; children?: NavChildItem[]; href?: string; } // Only routes that actually exist belong here — a nav link to a 404 is a lie. +// Descriptions live here too (SSOT), not in the component that renders them. export const NAV_ITEMS: NavSection[] = [ { title: 'Platform', + description: 'What Solon is and how it works', children: [ - { title: 'Overview', href: '/' }, - { title: 'Features', href: '/features' }, - { title: 'Security', href: '/security' }, - { title: 'Integration', href: '/integration' }, + { title: 'Overview', href: '/', description: 'The platform in one page' }, + { title: 'Features', href: '/features', description: 'What runs in production today' }, + { title: 'Security', href: '/security', description: 'No keys, no custody, no rewritable history' }, + { title: 'Integration', href: '/integration', description: 'API and integration guides' }, ], }, { title: 'Governance', + description: 'Voting and the public record', children: [ - { title: 'Voting System', href: '/governance/voting' }, - { title: 'Audit Trail', href: '/governance/audit' }, + { title: 'Voting System', href: '/governance/voting', description: 'Bitcoin-signed votes, verified server-side' }, + { title: 'Audit Trail', href: '/governance/audit', description: 'The append-only record itself' }, ], }, { title: 'Treasury', - children: [{ title: 'Bitcoin Treasury', href: '/treasury/bitcoin' }], + description: 'Watch-only Bitcoin treasuries', + children: [ + { title: 'Bitcoin Treasury', href: '/treasury/bitcoin', description: 'On-chain, independently verifiable' }, + ], }, { title: 'Ecosystem', + description: 'The three-pillar stack Solon governs for', children: [ - { title: 'Three Pillars', href: '/ecosystem' }, - { title: 'OrangeCat', href: 'https://orangecat.ch' }, - { title: 'FleetCrown', href: 'https://fleetcrown.orangecat.ch' }, + { title: 'Three Pillars', href: '/ecosystem', description: 'Economy, engineering, governance — live state' }, + { title: 'OrangeCat', href: 'https://orangecat.ch', description: 'The economic pillar' }, + { title: 'FleetCrown', href: 'https://fleetcrown.orangecat.ch', description: 'The engineering pillar' }, ], }, { title: 'Resources', - children: [{ title: 'About', href: '/about' }], + description: 'About the project', + children: [ + { title: 'About', href: '/about', description: 'Why Solon exists and who runs it' }, + ], }, ]; @@ -52,7 +64,3 @@ export const THEME = { accent: 'var(--accent)', accentDark: 'var(--accent-dark)' }; - - - - diff --git a/tests/e2e/header-footer.spec.ts b/tests/e2e/header-footer.spec.ts index cf128ed..4cadc9e 100644 --- a/tests/e2e/header-footer.spec.ts +++ b/tests/e2e/header-footer.spec.ts @@ -9,7 +9,7 @@ test.describe('Header & Footer', () => { await expect(page.getByText('SOLON').first()).toBeVisible(); // At least one top-level menu button is visible await expect(page.getByRole('button', { name: 'Platform' }).first()).toBeVisible(); - await expect(page.getByRole('link', { name: 'Get Started' })).toBeVisible(); + await expect(page.getByRole('link', { name: 'Open Dashboard' })).toBeVisible(); // Footer // Pick the white footer (site footer), not any dark section footer