- Node.js >= 20.0.0
- pnpm (any recent version)
pnpm install| Command | Description |
|---|---|
pnpm dev |
Development mode with hot reload (uses abird.config.dev.json) |
pnpm dev:bare |
Development mode without config file |
pnpm start |
Run the built app |
| Command | Description |
|---|---|
pnpm lint |
Check code style (Biome) |
pnpm lint:fix |
Auto-fix lint issues |
pnpm format |
Format code (Biome) |
pnpm typecheck |
TypeScript validation |
pnpm check |
Run lint + typecheck together |
pnpm knip |
Find unused code and dependencies |
| Command | Description |
|---|---|
pnpm build |
Build for production (generates icons + schema + bundle) |
pnpm build:fresh |
Clean + build |
pnpm clean |
Remove out/ and release/ directories |
pnpm package:appimage |
Build + create AppImage (Linux) |
pnpm package:win |
Build + create NSIS installer (Windows) |
| Command | Description |
|---|---|
pnpm gen:schema |
Generate abird.config.schema.json for IDE autocomplete |
pnpm gen:icons |
Generate icons from SVG source |
ABird uses a JSON config file (abird.config.dev.json or ~/.config/abird/config.json).
# Run with custom config
pnpm dev -- --config path/to/config.json
# Run specific app from config
pnpm dev -- --app myapp
# Browser mode (direct URL)
pnpm dev -- https://example.com
# Kiosk mode
pnpm dev -- --app dashboard --kiosk Ctrl+Alt+KRun pnpm gen:schema to generate abird.config.schema.json. Add this to your config file for autocomplete:
{
"$schema": "./abird.config.schema.json",
"apps": { ... }
}# Electron DevTools open by default in dev mode
pnpm devAll console.log/error from main process appear in terminal.
- Right-click on navbar/panel → "Inspect Element"
- Or use menu: View → Toggle DevTools
Renderer logs appear in their respective DevTools.
# Check for unused exports
pnpm knip
# Full quality check before commit
pnpm checksrc/
├── main/ # Electron main process
│ ├── config/ # Config loading, validation, resolution
│ ├── core/ # App bootstrap, window, states, routing
│ ├── tabs/ # Tab lifecycle management
│ ├── views/ # UI overlays (NavBar, FindBar, etc.)
│ ├── services/ # Business services (downloads, partitions, deploy)
│ ├── input/ # Keyboard listener, app menu
│ ├── utils/ # Observables, platform utils, user-agents
│ └── handlers.ts # All IPC handlers
├── preload/ # Context bridge (window.abird.* API)
├── shared/ # Types, schemas, i18n
│ ├── config.schema.ts # Zod schemas (source of truth)
│ ├── types.ts # TypeScript types, IPC channels
│ └── i18n/ # 10 languages
└── ui/ # React overlays
├── shared/ # Shared hooks (useBirdState, useTranslations)
├── config/ # Configuration app (pages, components)
├── navbar/ # Navigation bar overlay
├── downloads/ # Downloads panel
├── findbar/ # Find-in-page overlay
├── notifications/ # Notifications overlay
└── watermark/ # Background watermark
- Types first — Define in
shared/types.tsorshared/config.schema.ts - State — Add observable in
core/states.tsif needed - Main logic — Implement in appropriate module
- IPC — Add channel in
IpcChannels, handler inhandlers.ts - UI — Update React component, use
window.abird.*API
// 1. shared/config.schema.ts — Add to schema
const AppConfigSchema = z.object({
// ...existing fields
myNewOption: z.boolean().default(false),
})
// 2. main/config/resolver.ts — Handle in resolution if needed
// 3. main/core/states.ts — Add observable if runtime state
// 4. src/ui/config/components/ — Add UI control// Get current effective config
config$.get()
// Get all tabs
tabs$.get()
// Get current visible content (tab or panel)
activeContentId$.get()
// Subscribe to changes
config$.subscribe((config) => {
console.log('Config changed:', config)
})The main process doesn't hot reload. Restart pnpm dev for main process changes.
Check that the config file path is correct. In dev mode, abird.config.dev.json in project root is used.
pnpm install # Rebuilds native modules for your Electron versionpnpm gen:icons # Regenerate from SVG source