Your team's developer tool shelf — organized, searchable, always within reach.
Manage your team's developer tools, internal links, and environment URLs in one place. Self-hosted on Cloudflare Workers. Deploy in 30 seconds.
Every team maintains a growing list of internal tools, dashboards, APIs, and services scattered across bookmarks, wikis, and Slack messages. DevShelf gives them a home.
- One place for all tools — No more "where's the link to staging?" in Slack
- Multi-environment URLs — Dev / Staging / Prod links for every tool, one click away
- Zero infrastructure cost — Runs on Cloudflare's free tier (Workers + D1 + KV)
- 30-second deploy — Click the button, get a running instance. No Docker, no VMs, no config files
- Own your data — Self-hosted, export to JSON anytime, no vendor lock-in
|
Full CRUD with categories, tags, and environment links. Organize hundreds of tools without losing track. Press Admin and User roles. Admins manage tools; users browse and favorite. First-run wizard creates the admin account. |
Every tool can have Dev, Staging, and Production URLs. One click to open the right environment. JSON formatter, Base64 encoder/decoder, URL parser, and more — right in your tool shelf. Admin can export all tools, categories, and tags as a single JSON file for backup or migration. |
- Light / Dark theme (follows system preference)
- Responsive design (desktop & mobile)
- Edge-deployed worldwide via Cloudflare Workers
- D1 database (SQLite at the edge, zero cold starts)
- User favorites and recently used tools
The fastest way to get DevShelf running. Automatically provisions Workers, D1 database, and KV namespace.
After deployment:
- Set the JWT secret:
wrangler secret put JWT_SECRET(useopenssl rand -hex 32to generate) - Visit your deployed URL
- Complete the setup wizard to create your admin account
- Start adding your team's tools
Click to expand step-by-step instructions
- Cloudflare account (free tier works)
- Node.js (LTS)
- pnpm
- Wrangler CLI:
npm install -g wrangler
# 1. Clone the repository
git clone https://github.com/Muluk-m/dev-shelf.git
cd dev-shelf
# 2. Install dependencies
pnpm install
# 3. Authenticate with Cloudflare
wrangler login
# 4. Create the D1 database
wrangler d1 create devhub-database
# Copy the database_id from the output and update wrangler.jsonc
# 5. Apply database migrations
wrangler d1 migrations apply DB --remote
# 6. Set the JWT secret
wrangler secret put JWT_SECRET
# Enter a strong random string (generate with: openssl rand -hex 32)
# 7. Deploy
pnpm run deployVisit your deployed URL and complete the setup wizard.
# Clone and install
git clone https://github.com/Muluk-m/dev-shelf.git
cd dev-shelf
pnpm install
# Configure environment
cp .dev.vars.example .dev.vars
# Edit .dev.vars and set JWT_SECRET=any-local-dev-secret
# Set up local database
pnpm run db:migrate:local
# Start dev server
pnpm run dev
# Open http://localhost:5173All available commands
| Command | Description |
|---|---|
pnpm run dev |
Start development server with hot reload |
pnpm run build |
Build for production |
pnpm run preview |
Preview production build locally |
pnpm run deploy |
Build, migrate, and deploy to Cloudflare |
pnpm run typecheck |
Run TypeScript type checking |
pnpm run lint |
Check code quality with Biome |
pnpm run lint:fix |
Auto-fix linting issues |
pnpm run cf-typegen |
Generate Cloudflare binding types |
pnpm run db:migrate |
Apply migrations to remote D1 |
pnpm run db:migrate:local |
Apply migrations to local D1 |
| Variable | Type | Required | Description |
|---|---|---|---|
JWT_SECRET |
Secret | Yes | Key for signing auth tokens. Generate: openssl rand -hex 32 |
API_BASE_URL |
Var | No | Public URL (auto-detected if empty) |
DB |
D1 Binding | Auto | Application database |
CACHE_KV |
KV Binding | Auto | Response cache |
Secrets are set via wrangler secret put. Vars are in wrangler.jsonc. Bindings are auto-provisioned by Deploy Button.
| Layer | Technology |
|---|---|
| Frontend | React 19, React Router 7, Tailwind CSS 4, shadcn/ui |
| Backend | Hono on Cloudflare Workers |
| Database | Cloudflare D1 (SQLite at the edge) |
| Cache | Cloudflare KV |
| Language | TypeScript 5.8 |
| Tooling | pnpm, Biome, Vite |
dev-shelf/
├── app/ # Frontend (React Router v7)
│ ├── components/ # UI components
│ ├── hooks/ # Custom hooks
│ ├── lib/ # Utilities & API client
│ ├── routes/ # Page routes
│ └── stores/ # Zustand state
├── workers/ # Backend API (Hono)
│ ├── middleware/ # Auth & RBAC
│ └── routes/ # API endpoints
├── lib/ # Shared code
│ └── database/ # D1 operations
├── migrations/ # D1 schema migrations
├── wrangler.jsonc # Cloudflare config
└── .dev.vars.example # Env var template
Contributions are welcome! Please feel free to submit a Pull Request.
