A high-performance, local-first utility platform designed for multi-tasking individuals at startups.
Live Service: https://zafrem.github.io/Desk-tools/
I built Desk-tools for people who end up doing everything on their own: the frontend, the backend, the design, and the planning. With vibe coding taking off, I think there are a lot more of us now, and I'm one of them.
When you're the whole team, a normal day means jumping between totally different jobs, and each one sends you off to some other website. Format some JSON here, grab a color there, test a regex somewhere else, then go update your board. Most of those sites are slow and covered in ads. I got tired of it, so I put the things I actually use in one place.
Desk-tools is a set of 64+ small utilities that all live in one app, aimed at solo builders who have to wear every hat. It runs entirely in your browser, built with Next.js 15 and React 19. Nothing you type gets uploaded anywhere. Your data is saved locally in your browser (IndexedDB via Dexie.js), so it stays on your machine, and once the page has loaded it keeps working offline.
- Zero Server-Side Storage — Your notes, tasks, and settings are stored only in your browser via IndexedDB.
- Offline Capable — Once loaded, all tools work without an internet connection (PWA with service worker).
- Privacy by Design — No tracking, no data collection, no account required.
Available in English, Korean, Chinese (Simplified), and Japanese with automatic browser language detection.
| App | Description |
|---|---|
| Kanban Board | Drag-and-drop project management with flexible columns |
| Notepad | Persistent note-taking with markdown support and tagging |
| Daily Tasks | Recurring daily checklists with completion tracking |
| Whiteboard | Freeform drawing canvas for sketches, diagrams, and wireframes |
| Weekly Scheduler | Time-slot-based weekly planner |
| Terms Dictionary | Categorized term/definition management for consistent vocabulary |
| Bookmarks | Grouped URL bookmarks with drag-and-drop ordering |
Connect to a local Ollama instance for private LLM-powered assistance:
- Chat with local models directly in the workspace
- Multiple chat sessions with history
- No API keys needed — your data stays on your machine
Open a full terminal in the browser and connect to your servers over SSH:
- Live terminal powered by xterm.js
- Saved connections (host/port/username) stored locally — credentials are never persisted
- Works through a tiny local helper,
desk-tools-ssh-proxy
Because browsers can't open raw TCP sockets, SSH traffic is bridged by a local proxy that runs on your own machine — nothing is sent to any third party:
Browser (xterm.js) ──WebSocket──► desk-tools-ssh-proxy (127.0.0.1:8722) ──SSH──► your server
Start the proxy with either option (the tool detects it automatically and connects):
# Option 1 — download the prebuilt binary for your OS (no Node.js required)
# https://github.com/zafrem/Desk-tools-ssh-proxy/releases/latest
# Option 2 — run with Node.js 18+
npx desk-tools-ssh-proxyFind any tool instantly with Fuse.js fuzzy search across names, descriptions, tags, and categories.
Export and import all your data (notes, tasks, bookmarks, etc.) as JSON from the top navigation bar.
| Category | Tools |
|---|---|
| Encoder | Text Encoder, Base64 Converter, URL Encoder, HTML Entities |
| Converter | File Format (JSON/XML/CSV/YAML/TOML), JSON-CSV, Binary-HEX, Timestamp, Markup (Markdown/Wiki), Encoding Converter (mojibake fix) |
| Formatter | Code Formatter (Prettier, 12+ languages), Text Case Converter, SQL Formatter, Markdown Preview |
| Generator | JSON to Code, JSON Schema, Short URL, UUID, Password, QR Code, Slug, Robots.txt, Open Graph, Schema Markup, Sitemap |
| Calculator | Chmod, IP Subnet (IPv4/IPv6), Unit Converter, Date/D-Day, Salary/Tax, Loan, Compound Interest, Keyword Density, Meta Tag Checker, Reading Time, Word Counter, Canonical URL |
| Designer | Design Tools (Color Picker/Palette), Icon Generator, Background Remover, Image Filters, Pixel Art Editor |
| Security | JWT Decoder, Hash Generator (MD5/SHA), Encryption (AES-GCM/RSA-OAEP) |
| Developer | JSON Explorer (tree view), Cron Expression Builder, Regex Tester, Text Diff, Command Palette, REST API Client, CURL Builder, SSH Terminal |
| AI | AI Chat (requires local Ollama) |
| Games | Sudoku (play & solve), Ladder Game (Amidakuji random picker), Roulette (spin-the-wheel picker) |
| Other | PDF Tools, Pomodoro Timer, Iframe Viewer |
| Layer | Technology |
|---|---|
| Framework | Next.js 15 (App Router, Static Export) |
| Language | TypeScript 5 |
| UI | React 19, Tailwind CSS 3, shadcn/ui (Radix UI), Lucide React |
| Database | Dexie.js (IndexedDB) — 9 tables |
| Search | Fuse.js (client-side fuzzy search) |
| i18n | i18next + react-i18next (EN, KO, ZH, JA) |
| Drag & Drop | @dnd-kit |
| Drawing | Konva.js + react-konva |
| Charts | Recharts |
| Code Formatting | Prettier (JS, TS, HTML, CSS, SQL, YAML, GraphQL, Python, PHP, Java) |
| Crypto | Web Crypto API (AES-GCM, RSA-OAEP) + crypto-js (hashing) |
| pdf-lib | |
| AI | Ollama (local LLM integration) |
| Testing | Jest 29 + Testing Library |
| Deployment | GitHub Actions + GitHub Pages |
Browser (Client-Side Only)
├── Next.js 15 App (Static Export)
│ ├── App Router Pages
│ │ ├── / (Home)
│ │ ├── /kanban, /notepad, /daily-tasks, ...
│ │ └── /tools/[tool-id] (56 tool pages)
│ ├── Components
│ │ ├── AppShell (TopNav + ToolSidebar + Content)
│ │ ├── ToolLayout (tool page wrapper)
│ │ └── ui/ (shadcn/ui primitives)
│ └── Providers
│ ├── I18nProvider (i18next)
│ ├── ThemeProvider (next-themes)
│ └── SidebarProvider (context)
├── IndexedDB (Dexie.js)
│ └── 9 tables (ganttTasks, notes, terms, bookmarks, commands, preferences, dailyTasks, weeklySchedule, chatSessions)
├── Service Worker (offline / PWA)
└── Web Crypto API (AES-GCM, RSA-OAEP)
- Add an entry to
lib/tools-registry.tswith a uniqueid,category, andpath - Create
app/tools/[tool-id]/page.tsxas a client component ("use client") - Wrap content with
<ToolLayout title="..." description="..."> - Add helper functions to
lib/if needed
"use client";
import { ToolLayout } from "@/components/tool-layout";
export default function MyToolPage() {
return (
<ToolLayout title="Tool Name" description="Tool description">
{/* Tool UI here */}
</ToolLayout>
);
}-
Clone the repository:
git clone https://github.com/zafrem/Desk-tools.git cd Desk-tools -
Install dependencies:
npm install
-
Run the development server:
npm run dev
Open http://localhost:3000 in your browser.
-
Build for production:
npm run build
-
Preview static build locally:
npx serve@latest out
npm test # Run all tests
npm run test:watch # Run tests in watch mode
npm run test:coverage # Run tests with coverage report
npm run test:ci # CI mode with coverage (lcov + html)Tests are located in the __tests__/ directory and cover utility functions, components, and tool registry validation. Coverage reports are generated for SonarQube integration.
This project is configured for GitHub Pages with automatic deployment. Any push to the main branch triggers the GitHub Actions workflow which:
- Installs dependencies (
npm ci) - Builds the static export with
NEXT_PUBLIC_BASE_PATH=/Desk-tools - Deploys the
/outdirectory to GitHub Pages
I'm still adding to this whenever I hit something I need. If there's a tool you want or you run into a bug, open an issue on GitHub.
If you find this useful, consider buying me a coffee!
Created by zafrem
