A lightweight, high-performance DAO interface for Cosmos blockchain. Built with React + TypeScript + Vite for speed and efficiency.
Phoenix DAOs is a complete rewrite of DAO DAO, optimized for performance and simplicity. While DAO DAO provides comprehensive DAO management features, Phoenix DAOs focuses on speed and essential functionality.
Not a replacement for DAO DAO, but a faster alternative for quick DAO management.
Want full features? Use DAO DAO.
Want speed? Use Phoenix DAOs!
Built upon the excellent foundation of DAO DAO:
- Type interfaces and protobuf definitions adapted from DAO DAO
- DApp integration patterns partially rewritten
- Core application completely rebuilt for performance
- β‘ Fast & Lightweight: Optimized bundle size with tree-shaking and code splitting
- π Proposal Management: Create, vote, and execute proposals with inline action editor
- π₯ Member Management: View members, stake/unstake tokens, manage voting power
- π° Treasury: View and manage DAO assets on Terra
- ποΈ Sub-DAOs: Hierarchical DAO structures with parent-child relationships
- π DApp Integration: Embedded apps library (Astroport, ERIS, Votion, Creda, etc.)
- π Wallet Integration: Keplr, Leap, and more via Shuttle
- π¨ Modern UI: Clean interface with dark/light mode
- Framework: React 18 + TypeScript + Vite
- State Management: Preact Signals (fine-grained reactivity)
- Blockchain: Cosmos SDK + CosmWasm
- Wallet: Shuttle integration
- UI: Radix UI + Tailwind CSS v4 + Lucide icons
- Code Editor: Monaco Editor (for JSON contract messages)
- Node.js 18+
- pnpm (recommended package manager)
pnpm installpnpm dev # Start dev server (port 5176)
pnpm build # TypeScript + Vite build
pnpm lint # ESLint
pnpm analyze # Bundle analyzer
pnpm preview # Preview production build- "Frontend: Dev" - Start development server
- "Frontend: Analyze" - Run bundle analyzer
src/
βββ components/ # UI components
β βββ ui/ # Base UI components (Radix + custom)
β βββ modals/ # Modal dialogs
β βββ custom/ # Feature-specific components
βββ lib/ # Core logic
β βββ action-types/ # Proposal action implementations
β βββ voting-modules/ # DAO voting adapters
β βββ signals.ts # Preact Signals utilities
βββ hooks/ # Custom React hooks
βββ config/ # Static configuration
β βββ assets.ts # Token/asset registry
β βββ chain-data.ts # Chain metadata
β βββ apps.ts # DApp marketplace config
βββ pages/ # Route components
β βββ dao/ # DAO pages (proposals, members, treasury, sub-DAOs)
β βββ LandingPage.tsx # Home/discovery page
βββ daodao/ # Cosmos/CosmWasm protobuf definitions
βββ wallet/ # Wallet integration (Shuttle + providers)
- Build-time hash versioning: Automatic cache-busting via
version.json - Tree-shaking: Selective chain-registry imports, avoiding barrel exports
- Code splitting: Dynamic imports for heavy components (Monaco Editor)
- Polyfills: Minimal Node.js polyfills (Buffer, process) for Cosmos SDK compatibility
- Bundle analysis: Built-in
pnpm analyzecommand for size audits
This project uses Preact Signals instead of useState/Context for data state:
import { signal, computed } from '@preact/signals-react';
const count = signal(0);
const doubled = computed(() => count.value * 2);
count.value = 5; // Auto-updates UIFor async data, use useAsyncSignal:
const { data, loading, error } = useAsyncSignal(
async () => chain.read.query(contract, msg),
[contract, globalReload.value],
);Actions (proposals) are plugin-style objects implementing the ActionType<T> interface. Each action has:
- Form editor component
- View component
- Type guard for validation
- Title generator
- Icon
To add a new action type:
- Create file in
src/lib/action-types/ - Export action object and register in
src/lib/action-types/index.ts - Order matters: Specific types before generic
See bank-send.tsx for a simple example or wasm-execute.tsx for complex forms.
Always store amounts in base units, display in decimals:
import { fromBaseUnits, toBaseUnits } from '@/hooks/useBalances';
const display = fromBaseUnits('1000000', 6); // "1.000000"
const base = toBaseUnits('1.5', 6); // "1500000"Voting modules use factory pattern + adapters for different DAO types (CW4, CW20 staked, etc.):
- Create proposals with multiple actions (bank send, wasm execute, staking, etc.)
- Vote on active proposals
- Execute passed proposals
- View proposal history and status
- View voting members and their power
- Search and filter members
- Export member list to CSV
- Stake/unstake tokens (CW20, native, NFT-based DAOs)
- View personal voting power
- Manage delegation (if supported)
- View all DAO-owned assets
- Filter by token type
- Display USD values (via price feeds)
- Multi-chain asset support
- Browse child DAOs
- Navigate hierarchical DAO structures
- View sub-DAO metadata
- Embedded DApp marketplace
- Chain-specific app filtering
- Quick access to DeFi protocols, automation tools, etc.
import { createVotingModuleAdapter } from '@/lib/voting-modules';
const adapter = await createVotingModuleAdapter(address, chain);
const { members } = await adapter.fetchMembers(limit, startAfter);Access blockchain via ChainService:
const chain = useChain(Chain.Terra);
const address = useAddress(chain.chainId);
await chain.read.query(contract, msg);
await chain.read.balances(address);To maintain Fast Refresh:
- Keep pure functions in
src/lib/orsrc/hooks/helpers/ - Components in
src/components/should only export React components - Use re-export pattern for utilities if needed
Never mutate directly. Use onUpdate with path array:
onUpdate(['bank', 'send', 'to_address'], newValue);- Feature folders over flat structure
- Index files for clean imports
- Separate utilities from components
See .github/copilot-instructions.md for comprehensive development guide including:
- Action registry details
- Voting module adapters
- Signal patterns
- Context providers
- UI conventions
See LICENSE