{"id":50664749,"url":"https://github.com/ghwmelite-dotcom/open-build","last_synced_at":"2026-06-08T05:03:57.390Z","repository":{"id":363012816,"uuid":"1261623500","full_name":"ghwmelite-dotcom/open-build","owner":"ghwmelite-dotcom","description":"OHWPStudios — a livestream show where real Ghanaian problems get built into small, copy-pasteable tools live with Claude Code, and the community votes on what's built next. Hub site + a shared vote backend on Cloudflare Workers + Durable Objects.","archived":false,"fork":false,"pushed_at":"2026-06-07T01:35:14.000Z","size":109,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-07T03:38:19.541Z","etag":null,"topics":["civic-tech","claude-code","cloudflare-pages","cloudflare-workers","community-voting","durable-objects","ghana","ghana-tech","livestream","open-build","single-file","typescript","vanilla-js","vitest"],"latest_commit_sha":null,"homepage":"https://open-build.pages.dev","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ghwmelite-dotcom.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-07T00:04:28.000Z","updated_at":"2026-06-07T01:35:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ghwmelite-dotcom/open-build","commit_stats":null,"previous_names":["ghwmelite-dotcom/open-build"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ghwmelite-dotcom/open-build","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghwmelite-dotcom%2Fopen-build","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghwmelite-dotcom%2Fopen-build/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghwmelite-dotcom%2Fopen-build/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghwmelite-dotcom%2Fopen-build/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ghwmelite-dotcom","download_url":"https://codeload.github.com/ghwmelite-dotcom/open-build/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghwmelite-dotcom%2Fopen-build/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34048707,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["civic-tech","claude-code","cloudflare-pages","cloudflare-workers","community-voting","durable-objects","ghana","ghana-tech","livestream","open-build","single-file","typescript","vanilla-js","vitest"],"created_at":"2026-06-08T05:03:56.448Z","updated_at":"2026-06-08T05:03:57.376Z","avatar_url":"https://github.com/ghwmelite-dotcom.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpenBuild — OHWPStudios\n\n\u003e **Real problems, built live, simple enough to build yourself.**\n\nOpenBuild is the home of **OHWPStudios** — a livestream show where the community\nnames a real Ghanaian problem, we scope it small, **build it live with Claude\nCode**, ship a beginner-friendly guide so anyone can rebuild it, and then the\ncommunity **votes on what gets built next**.\n\nIt's not generic coding content. Every build is a Ghana-rooted civic or everyday\ntool, and each one is deliberately designed so a beginner — even on the free\nClaude.ai web tier — can follow along or recreate it from a single prompt.\n\n\u003e **Naming note:** the studio is **OHWPStudios**. The show name is being decided\n\u003e (leading candidate: **Nnoboa** — the Akan tradition of communal mutual help).\n\n---\n\n## Table of contents\n\n- [What this is](#what-this-is)\n- [The loop (how the show works)](#the-loop-how-the-show-works)\n- [Repository structure](#repository-structure)\n- [The hub (`index.html`)](#the-hub-indexhtml)\n- [The build slate](#the-build-slate)\n- [Shared vote backend](#shared-vote-backend)\n- [Local development](#local-development)\n- [Testing](#testing)\n- [Deploying](#deploying)\n- [Design system \u0026 brand](#design-system--brand)\n- [Guardrails](#guardrails)\n- [Roadmap \u0026 status](#roadmap--status)\n- [Contributing](#contributing)\n- [License](#license)\n\n---\n\n## What this is\n\n| | |\n|---|---|\n| **Studio** | OHWPStudios |\n| **Format** | Community names a problem → scope it small → build live with Claude Code → ship a novice guide → community votes on what's next |\n| **Core promise** | *Real problems, built live, simple enough to build yourself* |\n| **Audience** | Ghanaian builders \u0026 viewers, many on the free Claude.ai tier |\n| **Stack** | Single-file web apps (HTML/CSS/JS) + a small Cloudflare Workers backend |\n| **Hosting** | Cloudflare Pages (hub) + Cloudflare Workers/Durable Objects (vote backend) |\n\n**Why single-file?** Claude Code requires a paid plan, but the free Claude.ai\nweb tier includes Artifacts. So **every build is a single, copy-pasteable\n`index.html`** wherever possible — no build step, no dependencies, offline-capable\n— which keeps it replicable by free-tier viewers. Exceptions (e.g. tools that\nneed Python or live data) are flagged explicitly, and free users use the deployed\ntool instead of rebuilding.\n\n---\n\n## The loop (how the show works)\n\n```\n   short vertical clips  ──►  new viewers + new suggestions\n          ▲                              │\n          │                              ▼\n   the live build         the host curates 3 pre-scoped options\n   produces clip moments ◄── LIVE BUILD ◄── this week's shared VOTE\n          ▲                              │\n          └──── ship it + credit the ────┘\n                suggester on the wall\n```\n\nEach turn deepens investment because the viewer's fingerprint is on the outcome:\ntheir suggestion, their vote, their name on a shipped tool. The host keeps subtle\ncontrol by owning the **option set** — every choice on the ballot is a pre-scoped,\ngreen-lit brief, so *every path the community can pick is one worth shipping*.\n\nFull design: [`docs/superpowers/specs/2026-06-06-engagement-architecture-design.md`](docs/superpowers/specs/2026-06-06-engagement-architecture-design.md).\n\n---\n\n## Repository structure\n\n```\n.\n├── index.html              # The hub — a single self-contained site (no build step)\n├── PROJECT_BRIEF.md        # Source-of-truth brief for the whole project\n├── docs/\n│   └── superpowers/\n│       ├── specs/          # Design specs (engagement architecture)\n│       └── plans/          # Step-by-step implementation plans\n└── vote-backend/           # Cloudflare Worker + Durable Object for shared voting\n    ├── src/\n    │   ├── types.ts        # Shared interfaces (single source of truth)\n    │   ├── poll-do.ts      # PollDO Durable Object — all poll state \u0026 rules\n    │   └── worker.ts       # HTTP edge: routing + CORS, forwards to the DO\n    ├── test/poll.test.ts   # Behaviour suite (Vitest, Workers pool)\n    ├── wrangler.toml       # Worker + DO binding + SQLite migration\n    └── vitest.config.ts    # Vitest Workers-pool config\n```\n\n---\n\n## The hub (`index.html`)\n\nA single self-contained site (works offline, no dependencies). Sections:\n\n1. **Hero** — pre-launch messaging and a live build counter.\n2. **Builds grid** — cards for builds #001–#005. Each opens a modal step-by-step\n   guide, where every step has a copy-paste Claude Code prompt, flagged \"clip\n   moments,\" and an honest disclaimer. Flip a card to `live` (with its URL) after\n   shipping; the counter switches from *builds planned* → *builds shipped*.\n3. **How it works** — the 5-step method.\n4. **Build Brief Forge** — an offline generator: pick a build type, fill fields,\n   and get a clean Claude Code prompt + scope box + buildability check.\n5. **Live Vote** — three pre-screened options on a ballot, tap-to-vote, animated\n   result bars, a \"Leading\" badge, and an optional countdown. Counts come from the\n   [shared vote backend](#shared-vote-backend) when configured, with a graceful\n   fall back to a per-browser `localStorage` preview when it isn't.\n6. **Community / Suggest** — entry point for problem suggestions.\n\nTo preview locally, just open `index.html` in a browser, or serve the repo root:\n\n```bash\npython -m http.server 8080   # then visit http://localhost:8080\n```\n\n---\n\n## The build slate\n\nPhase 1 builds (sequenced to vary the *feeling* each episode):\n\n| # | Name | What it is | Single-file? | Notes |\n|---|------|-----------|:---:|-------|\n| 001 | Accra Flood-Risk Map | Flood-prone areas from elevation data | ❌ (Python) | Civic. Prototype, **not** an official warning — follow GMet/NADMO. |\n| 002 | Which Trotro? | Start + destination → route + approx fare | ✅ offline | Everyday. Fares are community-maintained; confirm with the mate. |\n| 003 | MoMo Fee Calculator | Enter amount → fee + what lands | ✅ offline | Money. Fees vary by network; check official rates. |\n| 004 | NSMQ/BECE Quiz Trainer | Drill past questions, track score | ✅ offline | Education. Study aid; cross-check official syllabi. |\n| 005 | Galamsey Watch | Map galamsey impact from public data | ❌ (map/data) | Civic. **Awareness only** — never accuse individuals; public data only. |\n\n---\n\n## Shared vote backend\n\nThe live vote needs counts that are **shared across all visitors** and hard to\ntamper with. KV is eventually-consistent (a live counter that lags or jumps looks\nbroken), so the backend is a **Cloudflare Durable Object** — a single\nauthoritative instance per poll with atomic increments.\n\n**Architecture:** one Cloudflare Worker routes `/api/poll/:id/*` to a `PollDO`\nDurable Object instance (one per poll id, via `idFromName`). The DO owns all state\n— options, counts, deadline, and the set of voter tokens that have voted — in\nSQLite-backed DO storage. Because a DO is single-threaded per instance, increments\nare naturally atomic.\n\n### API\n\n| Method \u0026 path | Auth | Purpose |\n|---|---|---|\n| `GET /api/poll/:id` | — | Snapshot: `{ id, options, counts, total, deadline, closed }` |\n| `POST /api/poll/:id/vote` | — | Body `{ optionId, voterToken }`. Increments once per token (idempotent). |\n| `POST /api/poll/:id/init` | `Authorization: Bearer \u003cADMIN_SECRET\u003e` | Admin-only: create/reset a poll with options + optional deadline. |\n| `OPTIONS /api/poll/:id` | — | CORS preflight (204). |\n\n**Integrity model:** one vote per device (server-side token dedup), server-enforced\ndeadline, admin-secret-gated `init`. It's \"good enough, not tamper-proof\" — for a\nhigh-stakes count the host can also run the platform-native poll (YouTube/X) in\nparallel. IP rate-limiting is intentionally deferred.\n\n**Graceful degradation:** if the backend is unreachable, the hub falls back to the\nexisting `localStorage` preview so the page never looks broken.\n\n---\n\n## Local development\n\n### The hub\n\n```bash\npython -m http.server 8080   # serve the repo root, open http://localhost:8080\n```\n\nThe hub ships with `VOTE.api.base = \"\"`, so it uses the offline `localStorage`\npreview by default. Set `base` to a running Worker origin to use real shared counts.\n\n### The vote backend\n\n```bash\ncd vote-backend\nnpm install\nnpm run dev        # wrangler dev on http://localhost:8787\n```\n\nSeed a poll and cast a couple of votes:\n\n```bash\n# (PowerShell)\ncurl -Method POST \"http://localhost:8787/api/poll/current/init\" `\n  -Headers @{ Authorization=\"Bearer test-secret\"; \"Content-Type\"=\"application/json\" } `\n  -Body '{\"options\":[{\"id\":\"trotro\",\"name\":\"Which Trotro?\"},{\"id\":\"momo\",\"name\":\"MoMo Fee Calculator\"}],\"reset\":true}'\n\ncurl -Method POST \"http://localhost:8787/api/poll/current/vote\" -Headers @{ \"Content-Type\"=\"application/json\" } -Body '{\"optionId\":\"trotro\",\"voterToken\":\"dev-1\"}'\ncurl \"http://localhost:8787/api/poll/current\"\n```\n\n\u003e Local secrets live in `vote-backend/.dev.vars` (gitignored). Copy\n\u003e `vote-backend/.dev.vars.example` to `.dev.vars` and set `ADMIN_SECRET`.\n\n---\n\n## Testing\n\nThe backend has a full behaviour suite (init/auth, vote, dedup, deadline, snapshot,\nCORS, input validation) running inside the Workers runtime via\n`@cloudflare/vitest-pool-workers`:\n\n```bash\ncd vote-backend\nnpm test            # 14 tests\nnpx tsc --noEmit    # type-check (strict)\n```\n\n---\n\n## Deploying\n\n```bash\ncd vote-backend\nnpx wrangler login\nnpx wrangler secret put ADMIN_SECRET   # set a long random string\nnpm run deploy                          # -\u003e https://ohwp-vote.\u003csubdomain\u003e.workers.dev\n```\n\nThen lock CORS to the hub origin (set `ALLOWED_ORIGIN` in `wrangler.toml` and\nredeploy), point the hub's `VOTE.api.base` at the deployed Worker, and deploy the\nhub to Cloudflare Pages. Full steps:\n[`docs/superpowers/plans/2026-06-06-shared-vote-backend.md`](docs/superpowers/plans/2026-06-06-shared-vote-backend.md).\n\n---\n\n## Design system \u0026 brand\n\n- **Theme:** dark, near-black background with Ghana national colours — green\n  (`#0a8f56` / `#006B3F`), gold (`#FCD116`), red (`#CE1126`).\n- **Type:** serif headings (Georgia), mobile-first.\n- **Accents:** kente ribbon, Adinkra motifs, Akan/Ewe proverbs.\n- **Voice:** warm, confident, honest about limitations — always with a clear\n  disclaimer on anything touching safety, money, or sensitive civic topics.\n- **Accessibility:** AA contrast minimum, 44px touch targets, focus states,\n  `prefers-reduced-motion` respected.\n\n---\n\n## Guardrails\n\n- **Single-file, no-dependency, offline-capable** web builds by default; any\n  exception is flagged.\n- **Always add an honest disclaimer** on anything touching safety, money, health,\n  or civic accusation (flood = \"prototype, not an official warning\"; galamsey =\n  \"awareness from public data, not accusation\").\n- **No browser storage in artifacts meant to run inside Claude.ai** (localStorage\n  fails there) — use in-memory state. The deployed hub *may* use localStorage.\n- **Local data accuracy matters most** (fares, fees): real values are supplied and\n  corrected by the host; AI guesses are placeholders only.\n\n---\n\n## Roadmap \u0026 status\n\n- ✅ Hub site (`index.html`) with builds grid, Forge, and live vote UI.\n- ✅ Shared vote backend (Cloudflare Worker + `PollDO` Durable Object) — built,\n  tested (14 passing), and wired into the hub with `localStorage` fallback.\n- ⏳ Deploy the Worker + connect the hub to production (Cloudflare).\n- ⏳ Suggester credit on shipped build cards (`suggestedBy` / `votePct`).\n- ⏳ In-build \"flash poll\" micro-votes (reuse `PollDO` with ephemeral poll ids).\n- ⏳ Suggestion intake hooked to a real form; clip → funnel pass.\n\n---\n\n## Contributing\n\nThis is the live workspace for a streamed show, so the workflow is plan-first:\nspecs and step-by-step plans live in [`docs/superpowers/`](docs/superpowers/) and\nare implemented task-by-task. If you're following along to rebuild a tool, start\nfrom the relevant build card in the hub — each one is a self-contained, copy-paste\nprompt. Keep the [brand voice](#design-system--brand) and\n[guardrails](#guardrails) in mind for any tool that touches safety, money, or\ncivic topics.\n\n---\n\n## License\n\nReleased under the [MIT License](LICENSE) © 2026 OHWPStudios. The builds are\ndesigned to be freely replicable by viewers — fork it, rebuild it, ship it.\n\n---\n\n*Built live, in Ghana, with Claude Code. Nnoboa — we build together.*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fghwmelite-dotcom%2Fopen-build","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fghwmelite-dotcom%2Fopen-build","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fghwmelite-dotcom%2Fopen-build/lists"}