A high-performance, local-first utility platform designed for multi-tasking individuals at startups.
Live Service: https://zafrem.github.io/Desk-tools/
"I'm not actually a professional developer. But after working with various systems, I kept getting the itch to build my own little tools. They didn't start as big, formal projects—they just kind of evolved bit by bit. Since I didn't have a team of designers or engineers to lean on, I just did everything myself. That's how Desk-tools came to life."
Desk-tools is a comprehensive suite of 53+ utilities built for "hybrid professionals"—developers, designers, planners, and marketers who need a fast, privacy-focused workspace.
Built with Next.js 15 and React 19, it runs entirely in your browser. All data is stored locally using IndexedDB (via Dexie.js), ensuring your work stays private and never leaves your machine.
- 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
Find 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 (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 |
| AI | AI Chat (requires local Ollama) |
| Other | PDF Tools, Pomodoro Timer |
| 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] (53 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 am committed to constantly evolving this platform. If you have a tool request or found a bug, please open an issue on GitHub.
Created by zafrem
