DOOM INDEX is a Cloudflare-first generative art project. It turns live crypto market context into paintings, stores the resulting image on Arweave via ArDrive Turbo during recurring generation, and uploads the framed GLB plus NFT metadata only when a mint happens. D1 indexes the artwork and caches mint-time GLB refs for the web UI, archive, OGP, and mint flow.
- Frontend: Next.js 16 App Router
- Runtime: Cloudflare Workers via OpenNext
- Storage: Arweave for artwork assets, D1 for searchable metadata
- Generation inputs: CoinGecko, Fear & Greed, Tavily, Runware
- Minting: custom Doom NFT program on Solana
Historical items uploaded from the current DOOM INDEX Arweave address:
- Address:
w-0BSqoDiZoct2ISCa1uSCgjm374kFE9hJwKMzAKJ-s - ViewBlock: https://viewblock.io/arweave/address/w-0BSqoDiZoct2ISCa1uSCgjm374kFE9hJwKMzAKJ-s?tab=items
Install dependencies:
bun installCopy .example.vars to .dev.vars, then fill in the required values:
cp .example.vars .dev.varsMinimum local env:
NEXT_PUBLIC_BASE_URL=http://localhost:8787
RUNWARE_API_KEY=your_runware_api_key
ARDRIVE_TURBO_SECRET_KEY='{"kty":"RSA", ...}'Common optional env:
COINGECKO_API_KEY=your_coingecko_api_key
TAVILY_API_KEY=your_tavily_api_key
ARWEAVE_GATEWAY_BASE_URL=https://permagate.iobun run dev uses Next.js' native .env.local loading. Point .env.local at .dev.vars so Next.js and the Bun scripts share the same values:
ln -s .dev.vars .env.localRun the Next.js app:
bun run devRun the Cloudflare preview build:
bun run build:cf
bun run previewTrigger the cron loop locally:
bun run watch-cronGenerate a painting locally:
bun run generateGenerate the framed GLB directly:
bun run generate:framed-glb --image ./out/example.webp --out ./out/framed.glbUpload an explicit image + GLB bundle to Arweave:
bun --env-file=.dev.vars scripts/upload-metadata-ardrive.ts \
--token-id 1 \
--thumbnail ./out/example.webp \
--glb ./out/framed.glbUpload the built-in placeholder fixture bundle:
bun --env-file=.dev.vars scripts/upload-metadata-ardrive.ts \
--token-id 1 \
--fixtureGenerate and apply Drizzle migrations:
bun run db:generate
bun run db:migrateProduction migration and deployment commands:
bun run db:migrate:prod
bun run deploybun run lint
bun run typecheck
bun run testFocused test commands:
bun run test:unit
bun run test:integration