{title}
-+ + + +
{title}
+{description}
+ {href === "/sign-up" && user ? ( + + You're participating + + ) : ( + + {action} + + + )}diff --git a/README.md b/README.md index 4076131..02e8fc1 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Ideascape is an exploration-mode concept-validation platform for learning which - Route-level code splitting for non-home pages - Supabase row-level security and pgTAP coverage for profiles, ideas, media, categories, and interest signals -There is intentionally no live fundraising, checkout, crypto wallet connection, custody, or payment collection. The future design explores security-reviewed smart-contract escrow, milestone-based releases, self-custodied signatures, refund paths, and compliant fiat on-ramps. No chain, asset, governance model, or contract implementation has been selected. +There is intentionally no live fundraising, checkout, custody, or payment collection. Funding research is deferred and is not part of the current landing page, catalog, or pilot-readiness mission. ## Demo catalog @@ -66,7 +66,7 @@ Fresh databases contain these published concept previews: 20. [Model Commons Lab](https://ideascape-gamma.vercel.app/ideas/model-commons-lab) 21. [Flock Off Colorado Springs](https://ideascape-gamma.vercel.app/ideas/glass-box-sensor-network) -Each concept uses a stable UUID and slug, polished multi-paragraph copy, and a locally hosted SVG illustration so local resets and production verification remain reproducible. Every demo now uses the landing page's security-claim discipline: it names a concrete threat scenario, an authorization, privacy, safety, provenance, or fail-safe control boundary, and measurable proof required before the concept earns a larger test. The earliest five broad previews define bounded first tests, required permissions, privacy limits, measurable continuation evidence, and explicit stop conditions instead of assuming that backing or an operating program already exists. Those five concepts and Project Time Capsule also ask one focused, private-answer validation question so practical demand, permissions, and pilot capability can be evaluated as aggregate evidence rather than public member activity. Three previously generic previews are now sharp Colorado Springs campaigns: challenge the plate-reader dragnet through public records and lawful organizing, force a dangerous Academy Boulevard crossing into the engineering record, and turn Mountain Metro's own accessibility findings into five concrete stop fixes. +Each concept uses a stable UUID and slug, polished multi-paragraph copy, and a locally hosted SVG illustration so local resets and production verification remain reproducible. Every demo uses the same permission-first discipline: it names a concrete threat scenario, an authorization, privacy, safety, provenance, or fail-safe control boundary, and measurable proof required before the concept earns a larger test. The earliest five broad previews define bounded first tests, required permissions, privacy limits, measurable continuation evidence, and explicit stop conditions instead of assuming that backing or an operating program already exists. Those five concepts and Project Time Capsule also ask one focused, private-answer validation question so practical demand, permissions, and pilot capability can be evaluated as aggregate evidence rather than public member activity. Three previously generic previews are now sharp Colorado Springs campaigns: challenge the plate-reader dragnet through public records and lawful organizing, force a dangerous Academy Boulevard crossing into the engineering record, and turn Mountain Metro's own accessibility findings into five concrete stop fixes. ## Stack @@ -153,21 +153,11 @@ The database models categories, creator-owned ideas, ordered media, explicit lif - Draft and cancelled ideas reject interest writes. - Public profiles are readable by everyone, while authenticated members can update only their own profile fields. -## Planned funding and security model +## Landing-page product story -The landing page documents a future architecture rather than an active funding feature. A validated concept could eventually become a campaign with published goals, deadlines, milestones, evidence requirements, fees, and refund/dispute rules. A reviewed smart contract could then hold funds against those terms and release only an approved milestone tranche or follow the published refund path. +The landing page presents Ideascape as a public workshop for early ideas rather than a transaction product. It introduces all six catalog categories, explains the concept-validation flow, offers concrete ways to participate, and asks four proof questions before any idea expands: whose problem it is, what the smallest useful test is, what must stay protected, and what evidence would change the plan. -The threat-model preview includes concrete failure cases: premature milestone claims, tampered wallet prompts, compromised administrator keys, and post-deployment contract bugs. The proposed baseline includes: - -- No automatic release from creator-submitted evidence; use an independent review quorum and dispute window. -- Human-readable confirmation of chain, asset, amount, fees, and verified contract address before signing. -- Self-custody: Ideascape never requests wallet seed phrases or private keys. -- Separated roles, hardware-backed keys, least privilege, and multisig for privileged actions. -- Independent audits, reproducible deployments, testnet simulations, capped pilots, version pinning, and timelocked changes. -- Emergency pause and incident runbooks that protect new deposits while preserving release or refund paths. -- On-chain monitoring plus legal, tax, sanctions, privacy, and consumer-protection review. - -These are design requirements, not current guarantees. No custody or smart-contract code is live, and a security claim is not considered real until implementation, deployment configuration, tests, governance, and external review prove it. +The current experience accepts no payments or fundraising. Interest is a reversible signal, not a purchase, vote, or permission grant. Deferred funding research remains isolated in `PLAN.md` and requires a separate consequential product decision before implementation. ## Quality checks diff --git a/src/App.test.tsx b/src/App.test.tsx index 27fe2d0..9b17950 100644 --- a/src/App.test.tsx +++ b/src/App.test.tsx @@ -73,13 +73,17 @@ describe("App", () => { }), ).toBeInTheDocument(); expect( - screen.getByText(/concept-validation platform/i), + screen.getByText(/public workshop for early ideas/i), ).toBeInTheDocument(); expect(screen.getByText("Test the possibility")).toBeInTheDocument(); - expect(screen.getByText("Permission-first technology")).toBeInTheDocument(); - expect(screen.getByText(/evidence about demand/i)).toBeInTheDocument(); expect( - screen.getByText(/if funding is activated later/i), + screen.getByText("Practical ideas, clearer next steps"), + ).toBeInTheDocument(); + expect( + screen.getByText(/public interest and practical feedback/i), + ).toBeInTheDocument(); + expect( + screen.getByText(/assumptions, permissions, boundaries/i), ).toBeInTheDocument(); expect(screen.getByRole("link", { name: /sign in/i })).toHaveAttribute( "href", @@ -90,8 +94,10 @@ describe("App", () => { "/sign-up", ); expect( - screen.getByRole("link", { name: /start an idea/i }), - ).toHaveAttribute("href", "/ideas/new"); + screen + .getAllByRole("link", { name: /start an idea/i }) + .some((link) => link.getAttribute("href") === "/ideas/new"), + ).toBe(true); expect( screen.getByRole("link", { name: /explore ideas/i }), ).toHaveAttribute("href", "/ideas"); @@ -102,8 +108,10 @@ describe("App", () => { /testing whether people want a place like this/i, ); expect( - screen.getByRole("link", { name: /join the experiment/i }), - ).toHaveAttribute("href", "/sign-up"); + screen + .getAllByRole("link", { name: /join the experiment/i }) + .every((link) => link.getAttribute("href") === "/sign-up"), + ).toBe(true); expect(screen.getByText("Concept previews")).toBeInTheDocument(); expect( screen.getByText("Concept previews").nextElementSibling, @@ -126,30 +134,61 @@ describe("App", () => { ).not.toBeInTheDocument(); }); - it("spotlights a permission-first technology pathway", () => { + it("spotlights a mix of practical community ideas", () => { renderApp(); expect( - screen.getByRole("link", { name: /explore technology concepts/i }), - ).toHaveAttribute("href", "/ideas?category=technology"); + screen.getByRole("link", { name: /browse by category/i }), + ).toHaveAttribute("href", "#idea-terrain-heading"); expect( screen.getByRole("img", { - name: /owner-controlled devices.*isolated repair bench/i, + name: /library room with portable air cleaners/i, }), ).toBeInTheDocument(); expect( screen.getByRole("img", { - name: /read-only recovery station.*encrypted folder/i, + name: /storefront becomes an evening gallery/i, }), ).toBeInTheDocument(); expect( - screen.getByText(/permission-first technology/i), + screen.getByText(/practical ideas, clearer next steps/i), ).toBeInTheDocument(); expect( - screen.getByText(/owner-authorized device work/i), + screen.getByText(/cleaner air, safer streets, shared repair/i), ).toBeInTheDocument(); }); + it("presents broad community use cases without crypto-first framing", () => { + renderApp(); + + const main = screen.getByRole("main"); + expect( + within(main).getByRole("heading", { name: /ideas for everyday life/i }), + ).toBeInTheDocument(); + expect( + within(main).getByRole("heading", { name: /ways to take part/i }), + ).toBeInTheDocument(); + expect( + within(main).getByRole("heading", { name: /proof before scale/i }), + ).toBeInTheDocument(); + for (const category of [ + "Arts & Culture", + "Community", + "Education", + "Environment", + "Health", + "Technology", + ]) { + expect( + within(main).getByRole("heading", { name: category }), + ).toBeInTheDocument(); + } + expect(main).toHaveTextContent(/no payments or fundraising/i); + expect(main).not.toHaveTextContent( + /smart.contract|crypto wallet|multisig|on.chain|seed phrase|funding rail/i, + ); + }); + it("explains the current idea-validation flow", () => { renderApp(); @@ -177,60 +216,46 @@ describe("App", () => { ).toHaveAttribute("href", "/ideas"); }); - it("presents smart-contract funding as a planned, safety-reviewed layer", () => { + it("shows concrete participation paths without implying transactions", () => { renderApp(); - const fundingLayer = screen.getByRole("region", { - name: /planned smart-contract funding/i, + const participation = screen.getByRole("region", { + name: /ways to take part/i, }); - expect(fundingLayer).toHaveTextContent(/planned, not live/i); - expect(fundingLayer).toHaveTextContent(/no funds are accepted today/i); - expect(fundingLayer).toHaveTextContent(/milestone-based releases/i); - expect(fundingLayer).toHaveTextContent(/release or refund/i); - expect(fundingLayer).toHaveTextContent(/independent security review/i); - expect(fundingLayer).toHaveTextContent( - /chain, asset, and governance design have not been selected/i, - ); + expect(participation).toHaveTextContent(/current invitation/i); + expect(participation).toHaveTextContent(/no payments or fundraising/i); + for (const path of [ + "Bring a question", + "Signal what matters", + "Add grounded context", + ]) { + expect( + within(participation).getByRole("heading", { name: path }), + ).toBeInTheDocument(); + } }); - it("explains the planned custody threat model with concrete examples", () => { + it("explains the evidence and permission questions before expansion", () => { renderApp(); - const securityModel = screen.getByRole("region", { - name: /security before custody/i, + const proof = screen.getByRole("region", { + name: /proof before scale/i, }); - expect(securityModel).toHaveTextContent(/no custody is live/i); - expect(securityModel).toHaveTextContent( - /every seeded concept.*threat scenario.*control boundary.*proof required/i, - ); - expect( - within(securityModel).getByRole("heading", { - name: /a milestone is claimed too early/i, - }), - ).toBeInTheDocument(); - expect( - within(securityModel).getByRole("heading", { - name: /a wallet prompt is tampered with/i, - }), - ).toBeInTheDocument(); - expect( - within(securityModel).getByRole("heading", { - name: /an admin key is compromised/i, - }), - ).toBeInTheDocument(); - expect( - within(securityModel).getByRole("heading", { - name: /a contract bug is discovered/i, - }), - ).toBeInTheDocument(); - expect(securityModel).toHaveTextContent( - /no single operator controls funds/i, - ); - expect(securityModel).toHaveTextContent( - /never requests seed phrases or private keys/i, + expect(proof).toHaveTextContent(/interest is a starting signal/i); + for (const question of [ + "Whose problem is this?", + "What is the smallest useful test?", + "What must stay protected?", + "What result changes the plan?", + ]) { + expect( + within(proof).getByRole("heading", { name: question }), + ).toBeInTheDocument(); + } + expect(proof).toHaveTextContent(/nothing graduates automatically/i); + expect(proof).toHaveTextContent( + /never grants permission to use private data, property, accounts, or community identity/i, ); - expect(securityModel).toHaveTextContent(/independent audit/i); - expect(securityModel).toHaveTextContent(/timelocked upgrades/i); }); it("renders the sign-in route", async () => { diff --git a/src/App.tsx b/src/App.tsx index 14d0f52..7d3044c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,10 +1,17 @@ import { ArrowRight, + BookOpen, + Cpu, + GraduationCap, HeartHandshake, + HeartPulse, + Leaf, Lightbulb, + Palette, ShieldCheck, Sparkles, Users, + Wrench, } from "lucide-react"; import { lazy, Suspense } from "react"; import { Link, Route, Routes } from "react-router-dom"; @@ -58,21 +65,21 @@ const PilotPage = lazy(() => const principles = [ { icon: Lightbulb, - title: "Ideas worth building", + title: "Ideas worth testing", description: - "Share a clear vision and discover whether a community believes in it.", + "Turn an early thought into a clear concept that other people can understand, question, and improve.", }, { icon: Users, - title: "People-powered progress", + title: "People-powered learning", description: - "Turn early interest into collaborators, advocates, and evidence about demand.", + "Use public interest and practical feedback to learn who cares, what is missing, and what deserves a first test.", }, { icon: ShieldCheck, title: "Transparent by design", description: - "Keep validation evidence visible now, then publish goals, milestones, releases, and updates if funding is activated later.", + "Keep assumptions, permissions, boundaries, evidence, and updates visible from the first draft through any future pilot.", }, ]; @@ -96,69 +103,106 @@ const validationSteps = [ number: "03", title: "Turn signals into evidence", description: - "Use aggregate demand—not private member activity—to decide whether to refine, pause, or prepare a more rigorous proposal.", + "Use aggregate demand—not private member activity—to decide whether to refine, pause, or prepare a small, permission-based pilot.", }, ]; -const fundingSteps = [ +const ideaTerrains = [ { - icon: Lightbulb, - number: "01", - title: "Publish the terms", + icon: Palette, + title: "Arts & Culture", description: - "A validated concept becomes a proposed campaign with a goal, deadline, milestones, evidence requirements, and refund rules everyone can inspect.", + "Creative uses for overlooked spaces, shared stories, and neighborhood events.", + href: "/ideas?category=arts-culture", }, { icon: Users, - number: "02", - title: "Choose a funding rail", + title: "Community", description: - "A future flow could support a self-custodied crypto wallet and compliant fiat on-ramps, with the network, asset, fees, and destination shown before approval.", + "Practical ways for neighbors to move, prepare, connect, and care for a place.", + href: "/ideas?category=community", }, { - icon: ShieldCheck, - number: "03", - title: "Milestone-based releases", + icon: GraduationCap, + title: "Education", + description: + "Hands-on learning, skill sharing, and tools that make knowledge easier to keep.", + href: "/ideas?category=education", + }, + { + icon: Leaf, + title: "Environment", + description: + "Repair, reuse, cleaner infrastructure, and measurable local resilience.", + href: "/ideas?category=environment", + }, + { + icon: HeartPulse, + title: "Health", + description: + "Accessible, preventive ideas shaped around consent and everyday wellbeing.", + href: "/ideas?category=health", + }, + { + icon: Cpu, + title: "Technology", + description: + "Useful systems that respect ownership, privacy, safety, and human control.", + href: "/ideas?category=technology", + }, +]; + +const participationPaths = [ + { + icon: Lightbulb, + title: "Bring a question", description: - "A reviewed contract would hold campaign funds against published rules and unlock only the approved amount for each documented milestone.", + "Draft a problem worth understanding. You do not need a finished plan, a pitch deck, or an organization behind you.", + action: "Start an idea", + href: "/ideas/new", }, { icon: HeartHandshake, - number: "04", - title: "Release or refund", + title: "Signal what matters", + description: + "Explore concept previews and save the ones you would follow, use, support, or help test.", + action: "Explore concepts", + href: "/ideas", + }, + { + icon: BookOpen, + title: "Add grounded context", description: - "Successful milestones release a defined tranche. Cancellation, missed conditions, or a resolved dispute would follow the campaign's visible refund path.", + "Help creators spot prior work, affected groups, practical constraints, and better ways to measure progress.", + action: "Join the experiment", + href: "/sign-up", }, ]; -const securityExamples = [ +const proofQuestions = [ { number: "01", - title: "A milestone is claimed too early", - risk: "A creator submits incomplete evidence and asks the contract to unlock the next tranche.", - control: - "A creator upload never releases funds automatically. Evidence enters a review window, a separate approver quorum signs, and an open dispute pauses execution.", + title: "Whose problem is this?", + description: + "Name the people affected and involve them before treating assumptions as needs.", }, { number: "02", - title: "A wallet prompt is tampered with", - risk: "A malicious interface tries to substitute a different network, amount, asset, or contract address.", - control: - "The confirmation repeats the verified chain, asset, amount, fees, and destination before signing. Ideascape never requests seed phrases or private keys.", + title: "What is the smallest useful test?", + description: + "Define a reversible first step that can teach something without pretending to be a finished program.", }, { number: "03", - title: "An admin key is compromised", - risk: "One operator account is stolen and used to attempt a release, upgrade, or configuration change.", - control: - "No single operator controls funds. Separate roles, hardware-backed keys, multisig thresholds, least privilege, and on-chain logs limit the blast radius.", + title: "What must stay protected?", + description: + "Make consent, privacy, access, ownership, safety, and stop conditions explicit before testing.", }, { number: "04", - title: "A contract bug is discovered", - risk: "A vulnerability is found after deployment but before the campaign has completed.", - control: - "An independent audit, testnet simulations, version pinning, capped pilots, timelocked upgrades, and an emergency pause protect new deposits while preserving release or refund paths.", + title: "What result changes the plan?", + description: + "Publish the evidence that would justify refining, expanding, pausing, or retiring the concept.", }, ]; @@ -189,14 +233,14 @@ function HomePage() { grow.
- Ideascape is a concept-validation platform where creators test - demand, gather public interest, and learn what deserves deeper - work before funding begins. + Ideascape is a public workshop for early ideas. Creators make + their thinking clear, neighbors signal what matters, and useful + feedback shapes the next small step.
- The newest previews explore owner-authorized device work, - consent-based file recovery, verified cloud exports, and private - local AI. + Explore cleaner air, safer streets, shared repair, practical + learning, accessible tools, local culture, and technology that + keeps people in control.
A wider field of view
++ Ideascape is not built around one industry or one kind of + creator. It is a place to make a local problem legible, + compare possible approaches, and find the people who care + enough to keep learning. +
++ 21 concepts across 6 categories +
++ Each preview names a practical next step and the boundaries + that should remain in place. +
++ {description} +
+ + ), + )}- Start with proof of demand, not a checkout. The live product - is focused on learning what people actually want. + Start with a clear question, not a polished pitch. The live + product is focused on learning what people actually want.
-- If a concept earns a campaign phase, the goal is to move - from social proof to explicit, inspectable funding terms. No - funds are accepted today. + The live product is for learning together: drafting + concepts, discovering shared interest, and improving the + quality of a possible first test. There are no payments or + fundraising.
+ + + +
{description}
+ {href === "/sign-up" && user ? ( + + You're participating + + ) : ( + + {action} + + + )}- What the contract can—and cannot—do -
-- Smart contracts can make agreed rules and fund movements - easier to inspect. They do not replace identity, moderation, - real-world milestone review, dispute handling, or legal - responsibility. -
-- - Threat model preview + A + stronger concept
- No custody is live. Every seeded concept applies the same - claim policy by naming a threat scenario, control boundary, - and proof required before expansion. The examples below show - the failure paths a real funding design must handle before a - contract, wallet connection, or fiat rail can reach - production. -
-- Security claim policy -
-- A control is not a guarantee until code, deployment - settings, governance, tests, and external review all prove - it. + Interest is a starting signal, not permission to expand. + Every concept should become more specific about people, + evidence, boundaries, and stop conditions as it develops.
- {risk} -
-- Example control design -
-- {control} -
++ {description} +
))}- Non-negotiable baseline +
+ A concept can stop, change direction, or remain a useful + public record. Nothing graduates automatically, and + participation never grants permission to use private data, + property, accounts, or community identity.
-