Skip to main content

Illustrated featured card for UI/UX Refinement Pass, showing the UI/UX category and the tags App, UI, and UX.
Illustrated featured card for UI/UX Refinement Pass, showing the UI/UX category and the tags App, UI, and UX.
Card illustration

Solo builder · AI-assisted

Skyler Halisky

Prompt Library

Prompts as reusable assets, not scattered text: organize, search, fill variables, run. Kept in your browser; each run goes straight to Anthropic with your key.

One network call

The prompt and user key go directly to Anthropic.

Live and evolving

Status
Live and evolving · no backend of mine
Role
Solo builder · AI-assisted
Year
2026

Tech

  • Next.js 15
  • TypeScript
  • Vitest
  • localStorage
  • GitHub Pages

Tags

  • ai
  • tools
  • local-first

The problem

A good prompt is a working asset, and mine were being treated as disposable text. The useful ones were scattered across chats, notes, and documents, so finding one meant scrolling, reusing one meant retyping, and improving one meant losing the version before it. I wanted a single place where a prompt could be found in seconds, filled in, run, and refined over time. I set one hard rule for it: no server of mine in the middle.

The approach

The library lives in the browser. Prompts, favorites, run history, and settings sit in localStorage; there is no account and no backend, and the site is a static export. A prompt can carry variables, so one template fills in differently each time, and a versioned JSON import and export moves a library between machines.

Inside the build

A closer look.

  • A prompt opened, with variables to fill and the copy control waiting.captured

Running a prompt is the one place data leaves the page, and I made that explicit rather than quiet: the browser sends the prompt and the user’s own Anthropic API key directly to Anthropic over HTTPS, and nothing passes through anything I operate. The client for that call is hand-built rather than an SDK. It streams the reply by parsing server-sent events itself, sorts failures into typed errors (bad key, rate limit, overloaded, network), counts down live when Anthropic asks for a retry, and lets a run be cancelled mid-stream.

The no-backend rule

The no-backend rule turned out to be the whole product discipline. There was nowhere to offload a hard decision, so every feature had to be scoped to run on the client and earn its place.

What shipped

Full-text search across the library, categories and tags, favorites, variable fields, per-prompt run history, and Markdown rendering through a small safe-subset parser instead of raw HTML. A choice of Claude models and a max-token setting. Light, dark, and system themes, and a documented set of keyboard shortcuts for search, running, saving, and switching prompts. Built against WCAG 2.2 AA, with screen-reader announcements on copy and run states and reduced motion honoured. Continuous integration runs typecheck, tests, and lint on every pull request, and GitHub Pages deploys from main. MIT licensed.

Where it stands

Live and evolving · no backend of mine

My role

The product idea and the privacy rule that shaped it were mine, along with the call to build the API client by hand so the only network request in the app is one I can read in full, and the wording that describes that request honestly. The agents wrote most of the implementation and the test suite. I use it for my own prompts, so a broken search or a lost run shows up quickly, and I re-read the one network call every time it changes.

Reflection

“No server” turned out to be the constraint that kept me honest: every feature had to earn its place with nowhere to offload the hard decisions.

I built this because my own prompts were scattered everywhere. I would keep the constraint and lose the notes app.


Skyler Halisky · Okanagan Valley, British Columbia

A Brief Account

Have something like this?
Write to me.

Send me an email

More work

Continue reading.