Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
02e6d7b
feat: PR #0 — scaffold App Router + Tailwind v4 + theme system
sktbrd May 1, 2026
7d9e594
feat: PR #1 — dashboard
sktbrd May 1, 2026
c5cbe7d
feat: PR #2 — auction page (/auction/[id])
sktbrd May 1, 2026
98c796b
feat: PR #3 — proposals list (/proposals)
sktbrd May 1, 2026
ff9c033
feat: PR #4 — proposal detail (/proposals/[id])
sktbrd May 1, 2026
aca216c
feat: PR #5 — treasury (/treasury)
sktbrd May 1, 2026
30ee1d6
feat: PR #6 — members directory (/members)
sktbrd May 1, 2026
36664dc
feat: PR #7 — about page (/about) + remove unused PageStub
sktbrd May 1, 2026
197fe7d
docs: PR #8 — README rewrite + scope map + dao.config.ts polish
sktbrd May 1, 2026
e11449b
feat: PR #10 — dashboard live data
sktbrd May 1, 2026
fbd3849
feat: PR #11 — auction page live data
sktbrd May 1, 2026
b3f4408
feat: PR #12 — proposals list live data
sktbrd May 1, 2026
19fc1d7
feat: PR #13 — proposal detail live data
sktbrd May 1, 2026
4d49fb5
feat: PR #14 — treasury live data
sktbrd May 1, 2026
a8ea9c4
feat: PR #15 — members live data
sktbrd May 1, 2026
3203406
feat: PR #16 — labrat dao switching + theme/logo polish
sktbrd May 1, 2026
36345c2
fix: drop hardcoded mock-DAO data from runtime pages (audit cleanup)
sktbrd May 1, 2026
988fe41
fix: delete src/lib/mockData.ts entirely
sktbrd May 1, 2026
e0e8d5d
feat: any-DAO labrat CLI + markdown proposal descriptions
sktbrd May 1, 2026
e6c23bb
feat: PR #17 — polish wave 2 (treasury NFTs, ERC-20 holdings, ENS)
sktbrd May 1, 2026
416a21c
feat: Recharts treasury analytics
sktbrd May 1, 2026
ebc30e4
feat: PR #18 — real on-chain writes (vote casting + bid placement)
sktbrd May 1, 2026
b3a2b32
feat: PR #19 — real voting power resolution
sktbrd May 1, 2026
98b0c3e
feat: PR #20 — proposal create flow (/proposals/new)
sktbrd May 1, 2026
75e2a45
feat: settle-auction action + drop unused exports
sktbrd May 1, 2026
3c3f2d2
feat: OG images for dashboard / proposals / auctions + silence wagmi …
sktbrd May 1, 2026
73cd3f1
docs: README refresh — labrat CLI, on-chain writes, OG, treasury tokens
sktbrd May 1, 2026
6e827f6
Fix React Server Components CVE vulnerabilities
vercel[bot] May 2, 2026
27df1c8
Merge pull request #22 from sktbrd/vercel/react-server-components-cve…
sktbrd May 2, 2026
91f107b
clean up
sktbrd May 2, 2026
33f2f48
Merge remote-tracking branch 'origin/main'
sktbrd May 2, 2026
67637cd
fix: pass production formatting and lint
sktbrd May 2, 2026
f1ddba4
fix: remove hardcoded OG tagline override
sktbrd May 2, 2026
28bada1
fix: code quality improvements across data layer, config, and components
sktbrd May 2, 2026
04b23ae
feat: homepage UI/UX overhaul — auction hero, list proposals, charts
sktbrd May 3, 2026
55b81d1
fix: prettier formatting and react-hooks/set-state-in-effect lint errors
sktbrd May 3, 2026
5dd45a5
fix: restore ProposalCard grid layout, use ProposalRow for homepage list
sktbrd May 3, 2026
a8b94a1
fix: ENS names and avatars on members page no longer require Alchemy key
sktbrd May 3, 2026
cc921b9
feat: show settle auction button on homepage hero when auction has ended
sktbrd May 3, 2026
e848f74
chore: migrate to next 16 + react compiler + web3 mount-gate
r4topunk May 3, 2026
c8d6b54
fix: eager-load DaoAvatar above-the-fold images
r4topunk May 3, 2026
41e91a7
fix: AuctionHero image fills cell edge-to-edge
r4topunk May 3, 2026
51e0279
feat: AuctionHero state matrix page + subgraph 429 mitigations
r4topunk May 3, 2026
e106e7d
fix: design critique — drop dashboard treasury dup, polish copy (#23)
r4topunk May 4, 2026
bc1e1d9
docs: align README scope map with proposal #61
r4topunk May 4, 2026
193a8c4
fix: use || instead of ?? for siteUrl fallback to handle empty env st…
sktbrd May 7, 2026
60fa117
feat: /feed page with cards layout and bump @buildeross/* to 0.3.2 (#24)
r4topunk May 15, 2026
96f0751
feat: propdates thread on /proposals/[id] with EAS attestations (#25)
r4topunk May 15, 2026
7e54b4a
feat: /coins — Zora content coins paired with the DAO's clanker token…
r4topunk May 18, 2026
94865d3
feat: proposal detail page — decoded txs, votes list, queue/execute/c…
r4topunk May 18, 2026
9d2552d
feat: /members/[address] detail page (#29)
r4topunk May 19, 2026
a7a9a2c
refactor: route address surfaces through WalletPill + batch ENS (#30)
r4topunk May 19, 2026
11e49dd
feat: treasury-insufficient badge on proposal cards + detail (#31)
r4topunk May 19, 2026
fc22f72
feat: 3-tab wizard for /proposals/new (Details / Transactions / Previ…
r4topunk May 19, 2026
23240f4
feat: 0xSplits revenue split tx type in proposal wizard
sktbrd May 20, 2026
cda26e1
fix: harden proposal actions and routes (#33)
sktbrd May 21, 2026
b5fdd1c
fix: allow coin flow retries and validate dev buy (#34)
sktbrd May 21, 2026
3bb7189
fix: guard pinata upload api (#35)
sktbrd May 21, 2026
e1e1eef
feat: in-app buy/sell of Zora coins via V4 Universal Router (#36)
r4topunk May 21, 2026
4c50bdc
feat: balance/max + tx link in trade widget, dynamic pool fee label (…
r4topunk May 21, 2026
de19b4c
fix: update theme configuration for improved styling
sktbrd May 22, 2026
2e8ca7e
feat: ENS name+avatar in WalletPill, on-chain DAO description on About
sktbrd May 22, 2026
45970e1
fix: render DAO description as markdown on About page
sktbrd May 22, 2026
8dba382
feat: hide cancelled/vetoed/expired proposals by default
sktbrd May 22, 2026
10950a4
feat: token logos from Trust Wallet Assets (free, no API key)
sktbrd May 22, 2026
f21dc00
feat: treasury allocation redesign — donut chart, USD values, tx feed
sktbrd May 22, 2026
379f0ab
fix: decode ERC-20 transfers in treasury tx feed, fix NFT count
sktbrd May 22, 2026
f74855f
fix: remove duplicate ERC20_TRANSFER_SELECTOR declaration
sktbrd May 22, 2026
1e4ca0e
feat: typed transaction cards on proposal detail (#38)
r4topunk May 22, 2026
73aaaed
feat: treasury NFT gallery + transfer history + TweaksPanel apply-to-…
sktbrd May 23, 2026
efd5e85
feat: polish pass — error pages, OG, sitemap, live bids, mobile fixes
sktbrd May 23, 2026
5480cd5
feat: typed transaction cards on proposal detail (#38)
sktbrd May 23, 2026
6187ebd
feat: expand proposal transaction types — add 15 kinds, remove Revenu…
sktbrd May 23, 2026
165901c
feat: structured proposal transaction forms for every kind
sktbrd May 24, 2026
f2bae03
feat: auction price chart + sitemap optimization
sktbrd May 24, 2026
5e4d371
feat: UI polish + phishing token filter in treasury transfers
sktbrd May 24, 2026
144a01f
feat: dashboard activity feed pulls recent bids from feed events
sktbrd May 24, 2026
aaf9e19
feat: proposal forms hardening — feasibility, reputation, decoded sum…
sktbrd May 24, 2026
28fa758
feat: auto-prepend ERC-20 approvals — encodeDraft → Tx[]
sktbrd May 24, 2026
ef9ded6
chore: pnpm lint --fix pass + AuctionPriceChart React-compiler fix
sktbrd May 24, 2026
906f920
chore: trigger initial Vercel deploy
sktbrd May 28, 2026
9016801
feat: nouns.game-style dashboard — tinted hero, history strip, recent…
sktbrd May 28, 2026
e43cbbf
feat: surface bid comment in homepage Feed rows
sktbrd May 28, 2026
cb0e2db
fix: deep responsivity pass across all 14 routes + shared chrome (#40)
r4topunk May 28, 2026
9751d29
chore: lint-verifiable cleanups from post-merge audit (#39)
r4topunk May 28, 2026
1a0ddff
fix: home dashboard layout + tinted-hero contrast + ENS carousel (#42)
r4topunk May 29, 2026
9be791c
feat: optimistic onchain bridge for home auction (live settle, bid co…
r4topunk May 29, 2026
1ddb04c
feat: /dev/proposal state matrix + event-anchored proposal dates
r4topunk May 29, 2026
a79f645
fix: WalletPill shows ENS only, drops the address subline
r4topunk May 29, 2026
b0e2cbd
fix: drop the "Voting as" label in VotePanel
r4topunk May 29, 2026
7f9a370
fix: restore page-top padding + align header controls to title cap-he…
r4topunk May 29, 2026
9110050
feat: optimistic onchain bridge for proposal votes (live tally + "you…
r4topunk May 29, 2026
83818fe
feat: optimistic vote tally bump on submit (reconcile on mine, rollba…
r4topunk May 29, 2026
2f78547
Merge feat/proposal-state-matrix: proposal state matrix + optimistic …
r4topunk May 29, 2026
239cf29
feat: droposals page + unify /coins into a Content hub (#45)
r4topunk May 29, 2026
903f9ee
fix: hero art spinner + theme-aware text when no token image
r4topunk May 29, 2026
86d2c79
fix: wrong-chain guard reads the wallet's actual chain (#46)
r4topunk May 29, 2026
6e5e9f8
refactor(votes): confirmation-gate the vote echo (no optimistic UI) (…
r4topunk May 30, 2026
e9a08b8
fix: pre-upstream review pass — correctness, SSRF, fork-readiness, docs
r4topunk Jun 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: CI

on:
push:
branches: [main]
pull_request:

jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm

- name: Install
run: pnpm install --frozen-lockfile

- name: Type-check
run: pnpm type-check

- name: Lint
run: pnpm exec eslint .

- name: Test
run: pnpm test

# `pnpm build` is intentionally omitted: its `prebuild` runs `fetch-dao`,
# which resolves DAO config over the network and needs env that CI lacks.
13 changes: 12 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,20 @@ yarn-error.log*
*.tsbuildinfo
next-env.d.ts

# generated config files
# generated config files (resolved on-chain by `pnpm fetch-dao`)
/src/config/dao.json
/src/config/dao.ts

# generated icon
/public/icon.png
.env*.local

# local agent / editor tooling (not part of the template)
.claude/

# session-local running notes
implementation-notes.md

# local dev-only artifacts (not part of the template)
.vercel-deploy-trigger
/sandbox/
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
22
190 changes: 190 additions & 0 deletions CONFIG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
# Configuring a fork

Everything you need to point this template at *your* Builder DAO lives in
two places:

1. **`src/lib/dao.config.ts`** — UI, theme, treasury tokens, feature flags,
per-fork contract overrides.
2. **`.env.local`** — secrets, API keys, environment-specific URLs.

The on-chain addresses (`token`, `auction`, `governor`, `treasury`,
`metadata`) are populated automatically by `pnpm fetch-dao`. Don't edit
them by hand.

---

## `dao.config.ts` walkthrough

### Identity

```ts
name: ONCHAIN_CONFIG.name, // pulled from the DAO token contract
tagline: 'Powering Onchain Communities.',
image: ONCHAIN_CONFIG.image, // pulled from the on-chain image
```

Override `name`/`image` if you want the UI to show something different
from what's stored on-chain.

### Theme

```ts
theme: {
accent: '#2563eb', // primary brand color
radius: 12, // px, applied to most rounded corners
font: 'Geist',
displayFont: 'Geist',
defaultMode: 'system', // 'light' | 'dark' | 'system'
}
```

The dev Tweaks panel (gear icon, bottom-right in dev mode) lets you
preview changes live before committing them to `src/config/dao.theme.json`.

### Features

Flip either of these off if you don't want the corresponding UI:

```ts
features: {
bidComments: true, // 140-char on-chain comment field on BidForm
coins: true, // /coins + /droposals content hub and creator-coin proposals
}
```

### Treasury tokens

ERC-20 contracts surfaced on `/treasury` *and* as quick-picks in the
"Send ERC-20" / "Stream Tokens" / "Milestone Payments" / "Airdrop Tokens"
proposal forms.

```ts
import { BASE_COMMON_TOKENS } from './treasury-tokens'

treasuryTokens: [
...BASE_COMMON_TOKENS, // USDC, WETH, DAI on Base
{ symbol: 'SENDIT', address: '0xBa5B…', decimals: 18 },
]
```

For Ethereum mainnet swap `BASE_COMMON_TOKENS` for `ETHEREUM_COMMON_TOKENS`,
or list addresses by hand.

### Treasury NFT collections (new)

ERC-721 collections held by the treasury besides the DAO governance token.
These appear as quick-pick pills in the "Send NFT" proposal form.

```ts
treasuryNftCollections: [
{ symbol: 'BasePaint', address: '0xBa5e…' },
]
```

The DAO governance token is always available implicitly — you don't need
to list it.

### Contract overrides (new)

Per-fork overrides for the protocol contracts used by proposal forms.
Leave the field unset to use the template's built-in chain → address
mappings. Useful when:

- You're on a niche chain not in our mapping
- You need to point at a custom deployment

```ts
contractOverrides: {
disperse: '0xDeadBeef…', // Airdrop Tokens
escrowBundler: '0xDeadBeef…', // Milestone Payments
sablierLockupLinear: '0xDeadBeef…', // Stream Tokens (also fills the
// "Sablier LockupLinear contract"
// field when starting a new stream)
zoraNftCreator: '0xDeadBeef…', // Droposal: Single Edition (prefilled)
eas: '0xDeadBeef…', // Pin Treasury Asset + Nominate Delegate
}
```

If a form's underlying contract isn't supported on the current chain *and*
no override is provided, the form shows a warning banner and disables
submission.

### Socials

```ts
socials: {
twitter: '@yourdao',
farcaster: 'yourdao',
discord: 'https://discord.gg/…',
github: 'https://github.com/yourdao',
website: 'https://yourdao.com',
}
```

Surfaces in the footer and OG metadata.

---

## Environment variables

Put these in `.env.local` (not committed to git).

### Required for production

| Variable | What it does | Where to get it |
|---|---|---|
| `NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID` | Pairs the WalletConnect modal for wallet connect/disconnect. Required in production builds; dev builds warn but still run. | https://cloud.reown.com |
| `NEXT_PUBLIC_SITE_URL` | Canonical URL used by the sitemap, OG metadata, and robots.txt. Falls back to `VERCEL_PROJECT_PRODUCTION_URL` → `VERCEL_URL` → `localhost:3000`. | The domain you ship under |

### Optional integrations

| Variable | What it enables | Where to get it |
|---|---|---|
| `NEXT_PUBLIC_ALCHEMY_API_KEY` | Treasury transfer history feed on `/treasury`. Without it, the recent-transfers card hides itself. | https://dashboard.alchemy.com |
| `PINATA_API_KEY` | Server-side IPFS pin operations (used by the milestone metadata upload, droposal cover uploads, etc.). | https://app.pinata.cloud |

### Auto-populated by Vercel

`VERCEL_PROJECT_PRODUCTION_URL`, `VERCEL_URL`, `VERCEL_ENV` — used as
fallbacks if `NEXT_PUBLIC_SITE_URL` isn't set.

---

## Per-feature feature gating

Some proposal kinds depend on a contract that may not be deployed on the
chain your DAO lives on. The forms gracefully disable themselves with a
warning banner in those cases. Capability mapping:

| Kind | Requires | Supported chains (default) |
|---|---|---|
| `pin_asset` | EAS contract | Mainnet, Optimism, Base (+ testnets) |
| `delegate` (escrow) | EAS contract | Same as above |
| `milestone` | EscrowBundler | Mainnet, Optimism, Base, Zora (+ testnets) |
| `airdrop` | Disperse contract | Mainnet, Optimism, Polygon, Arbitrum, Base |
| `stream` | Sablier LL address (user-entered or via override) | All — chain-specific address required |
| `droposal` | Zora NFT Creator (user-entered or via override) | All — chain-specific address required |

To enable any of these on a chain we don't ship support for, set
`daoConfig.contractOverrides.<feature>` to the address of a compatible
deployment.

---

## Switching between DAOs

`pnpm switch-dao` retargets the local app at another Builder DAO. Pass a
built-in preset name, or a `0x` token address with an optional `--chain`
(chain id, default `8453` / Base) and `--network` (`mainnet` | `testnet`):

```bash
pnpm switch-dao gnars # a built-in preset
pnpm switch-dao 0xYourToken --chain 8453 # any DAO by token address
pnpm dev
```

It writes the target into `.env.local`, merges any theme overrides into
`src/config/dao.theme.json`, and then runs `pnpm fetch-dao` for you to
resolve the on-chain addresses + image into the generated (gitignored)
`src/config/dao.json` + `src/config/dao.ts`. `pnpm build` also runs
`fetch-dao` automatically.
Loading