Thunderbolt

Skills feature: shipping in three phases

Thunderbolt hero background

Overview.

Thunderbolt is an open-source AI client launched by Mozilla. I designed the Skills feature, a way to save and reuse prompts that replaces the existing Shortcuts and Automation features.

My role
Design lead: design strategy, UI, UX
Team
Me, Product Manager, 3 Engineers, Product Designer
Status
v1 is in active build. Internal rollout begins [month]. The metrics at the end of this case study are the ones I'll be tracking.

Impact I Made.

Designed a data structure that engineering can build on, not rewrite.
Each version (v1 → v2 → v3 Direction 3) extends the foundation by addition, not redesign. Two table additions, zero schema migrations across three product releases. Less code to maintain, fewer bugs to chase, less engineering time spent on architectural cleanup.
Caught the cascading-deletion problem in v3 Direction 3 before it shipped.
Cannot remove a skill while other skills in the user's library depend on it. One rule for delete, uninstall, and remove a class of broken-state bugs prevented by structure, not by error handling.
Aligned the design with Thunderbolt's brand promise of “no vendor lock-in.”
A user's skill library now travels in either direction between Thunderbolt, Claude Code, Cursor, and Claude.ai. The portability claim isn't a marketing line; it's a design property.
Brought scope from a 6-month build down to a one-week v1 ship.
When the team's first direction (v3 Direction 1) was sized, it required document editing, version tracking, and revert UX. That was effectively a second app on top of Thunderbolt. I drove the team toward v3 Direction 3, which keeps the open-source positioning intact and makes v1 buildable in a week.

Final Design.

Skills settings page with the meeting-notes skill selected and the starter-skills welcome banner
Marketplace with the tast-triage skill detail panel openMarketplace grid view showing installable skills
Chat input with the slash skill picker openReorder skills modal above the chat input

Walkthrough.

Coming soon

Try the Prototype.

Click through the actual Skills feature: create a skill, pin it to the chat input, invoke it via slash, install one from the marketplace, and reference it from a custom skill. The prototype is a clickable Vercel deployment of the final design.

Skill feature: Live prototypethunderbolt-skill-feature.vercel.app
Open prototype →

Where It Started.

We had two features that solved overlapping problems in different places.

Automation
Automation was a settings page where users linked a prompt to a model. Hit play, and the prompt ran against the selected model, optionally on a schedule.
Shortcuts
Shortcuts was a row of buttons above the chat input. Press one, and its saved prompt filled the chat input, ready for the user to edit and send.

Same primitive (a saved prompt), two surfaces, two mental models, two pages of docs trying to explain the difference.

The PM ask

“Remove Automation and Shortcuts. Replace them with Skills. We want a Skills page in settings, a shortcut button row above the chat input, navigation to the Skills page from the side nav, the ability to edit skills, and eventually a marketplace where users can install skills authored by others.”

Defining the Solution.

I anchored the design on Anthropic's Agent Skills standard, an open format for packaging reusable prompts as folders with a SKILL.md manifest, already adopted by Claude Code, Cursor, and VS Code Copilot. Adopting it made portability a structural property of Thunderbolt's data model rather than a feature we'd need to build.

Business goal
  • Make Thunderbolt's anti-lock-in promise real, not just claimed
  • Open a path for third-party skill distribution (deepset/Haystack and others)
User goals
  • Stop retyping the same prompts
  • Bring an existing prompt library in from other AI tools without rebuilding it
  • Build skills that compose: a skill that calls another skill that calls another

We listed every feature we wanted to ship:

  • Create / edit / delete skills
  • Search and pin skills for faster access
  • Slash invocation in the chat composer
  • Pinned shortcut buttons above the chat input
  • Marketplace install / uninstall
  • Upload skills from local device
  • Capability-aware skill compatibility (“requires code execution”)

Breaking Down the MVP.

We broke the work into three phases so v1 could ship in one week without committing to surface no one had vetted.

v1
Skills as a single-file primitive. Create, edit, invoke. Foundation only.
v2
Marketplace + uploads + capability awareness. Skills become folders with multiple files.
v3 Direction 1
Composition with full editability. Users can install marketplace skills, edit them, and revert to original at any time.

There were a lot of design challenges, but lets focus on the biggest one

The Biggest Challenge.

v3's goal was to give users more control over the skills in their library, to install one from the marketplace and shape it to their own work, not just use it as-shipped. We were also merging Shortcuts and Automation into Skills and laying the marketplace foundation in v2, but v3 was where user control became the design question.

I worked through three design directions before landing on the one that ships. Each one came out of what the previous one got wrong.

Direction 1: Edit-and-revert, control through editing with a safety net

The first direction I designed delivered control through editing. Users could install a marketplace skill, edit it freely, and revert to the original at any point. The user model was familiar, closer to Google Docs. Edit anything, undo anything.

The cost lived in the data model

Revert required snapshots of the original at install time. Content-addressed storage so two users installing the same skill shared bytes. Ref-counted references so a marketplace skill couldn't be deleted while any user still depended on a snapshot of it. On top of that, the UI needed an in-app editor for skill folders, including markdown, prompts, possibly code.

It was two apps

One was Thunderbolt. The other was a document editor with version history, revert flows, and a snapshot system underneath. A multi-month build for three engineers already split across other work, sitting on top of an app that isn't a document editor.

The challenge

Deliver user control without committing the team to building a second app to support it. I needed a smaller version.

Direction 2: Edit-only, control through editing without the safety net

Revert was the most expensive feature in edit-and-revert. It was what forced the snapshot system, content-addressed storage, and ref-counted references. I cut it and redesigned around the constraint.

What was removed

Snapshot per install
Content-addressed storage
Ref-counted references
One-click revert UX

I stress-tested edit-only with Claude before committing to it. The pressure-test surfaced two problems I hadn't seen.

1. Both versions are still effectively second apps.
Even without revert, Direction 2 still requires document editing inside Thunderbolt, and Thunderbolt isn't a document editor. The skill files in v2 would be folders containing multiple files (markdown, prompts, possibly code). Letting users edit those folders in-app means we'd need a folder editor. The whole highlight of the product, open-source extensibility, gets buried under editor scope.
2. The data model demands migration.
Direction 1 needs snapshot storage and reference tracking. Direction 2 sheds some of that but still tracks per-install state. Both versions force a migration path from v1 to v2. Migration is where bugs live.

The conclusion was clear: Direction 1 and Direction 2 are both adding apps on top of an app. There had to be a simpler version that solved the same user problem.

Direction 3: Reference, control through composition instead of editing

Edit-and-revert and edit-only both demanded heavy engineering, and both were variations of the same shape. I stepped back from the screens and asked a different question: what's the simplest version of this that still solves the user problem?

The user's actual need was customization: “I want this skill, but slightly different.” I'd been assuming that meant editing. But editing is one of several ways to customize. Composition is another. Parameterization is a third. Editing was just the first one I'd reached for.

The shift: stop letting users edit marketplace skills at all. If they want a skill that does something different, they don't fork it; they author their own custom skill that references it.

How reference model works

1. Install

A user installs a skill from the marketplace. It enters their library as a read-only entry. Thunderbolt holds a reference to the marketplace version, not a copy of it.

Marketplace with the tast-triage skill detail panel open

2. Compose

Instead of editing the installed skill, the user creates a new skill that calls it. The custom skill references the marketplace skill by ID. The marketplace skill stays untouched.

Create Skill form referencing /product-strategy in the instructions

3. Update

When the marketplace publishes a new version, the user pulls it in cleanly. Their custom skill keeps working. No merge against an edited fork. No revert. No migration.

Skills settings showing the marketplace tast-triage skill with version 1.0.0

Why I Chose the Final Design.

Additive growth in the data model

Existing tables stay stable. New capabilities arrive as new tables.

v1Foundation
Skill
id
name
description
body
v2Marketplace + uploads
Skill
id
name
description
body
+source_type
+source_id
+required_capabilities
+MarketplaceSkill
id
author
version
source_url
v3-direction3Composition
Skill
id
name
description
body
source_type
source_id
required_capabilities
unchanged from v2
MarketplaceSkill
id
author
version
source_url
unchanged from v2
+SkillReference
parent_skill_id
referenced_skill_id
What additive growth avoids

Three product versions. Two table additions. Existing tables grow only by appending optional columns. No data restructuring, no destructive migrations. Engineering ships v2 and v3 by adding to the foundation, not by reopening it.

Three product versions. Two table additions. Zero schema migrations. The reference model lets us test the premise in weeks instead of months.

Three v3 schemas, side by side

The data model is where the cost of each direction becomes visible.

v3-direction1
Edit + revert
Skill
id
name, description, body
source_type
install_id →
SkillInstall
id
marketplace_id →
original_hash →
current_hash →
is_modified
SkillBlob
hash (pk)
content
ref_count
MarketplaceSkill
id, author, version
canonical_hash →
4 tables
Content-addressed storage. Ref-counted blobs. Snapshot per install. Per-install state.
v3-direction2
App Store model
Skill
id
name, description, body
source_type
install_id →
SkillInstall
id
marketplace_id →
installed_version
is_modified
MarketplaceSkill
id, author, version
source_url
3 tables
Per-install state tracking. No recovery from edits. App Store contract.
v3-direction3
chosen
Composition
Skill
id
name, description, body
source_type
source_id →
MarketplaceSkill
id, author, version
source_url
SkillReference
parent_skill_id →
referenced_skill_id →
3 tables
No per-install state. No content-addressing. Just a reference graph.
What the table count hides

v3-direction2 and v3-direction3 both have three tables. The difference is what those tables track. v3-direction2's third table tracks per-install state. Every install of a marketplace skill creates a new row recording version, modified flag, and lifecycle. v3-direction3's third table is a reference graph, a flat list of “this skill points to that skill,” with no per-install or per-user complexity. The same table count hides a meaningful difference in what the data model has to manage.

What the reference model unlocks

  • Updates without conflict. When the marketplace publishes a new version of a skill, the user pulls it in cleanly. There's no edited fork to merge against.
  • Skill authors debug their own folders. Marketplace skills stay maintained at their source: GitHub for marketplace skills, the original local file for uploads. Authors update where they author. Thunderbolt isn't trying to be the editor.
  • Simpler to build, without compromising goals. The user still gets reusable, composable skills. The business still gets portability and a marketplace path. Engineering ships in stages without architectural rework.

The reference model is what ships.

Serving the Original Goals.

Returning to where this started: three user hypotheses and two business goals. Here's how v3 Direction 3 maps back to each.

User hypotheses

Users retype the same prompts repeatedly and want a faster reuse path.

The pinned shortcut row and slash invocation in the chat composer cover this directly. A user can save a prompt once and reach it in two keystrokes from then on. v1 ships this.

Chat input with the slash skill picker open

Power users want skills that compose, not just standalone snippets.

v3 Direction 3's reference model lets a user build a skill that calls another skill, without forking, without editing the original. Composition arrives as a clean addition to the data model, not a retrofit.

Create Skill form referencing /product-strategy in the instructions

Business goals

Make Thunderbolt's anti-lock-in promise structural, not rhetorical.

Because the file format is the same one Claude Code, Cursor, and VS Code Copilot use, portability isn't a feature Thunderbolt has to maintain; it's a property of the format. The marketing claim and the engineering reality are the same thing.

Marketplace grid view showing installable skills

Open a path for third-party skill distribution.

The marketplace in v2 and the reference model in v3 Direction 3 together mean partners like deepset/Haystack can publish skills that users compose with their own work, without Thunderbolt mediating the relationship.

Marketplace grid view showing installable skills

What the design cut from the engineering bill

The shift from v3 Direction 1 to v3 Direction 3 didn't just produce a cleaner user experience. It removed work the team would otherwise have had to do:

No document editor.
v3 Direction 1 required an in-app folder editor for marketplace skills, a multi-week build for three engineers, plus ongoing maintenance. v3 Direction 3 removes the requirement entirely; marketplace skills are read-only inside Thunderbolt.
No version-tracking system.
v3 Direction 1 needed original_blob_hash, content-addressed storage, and ref-counted references to support revert. None of that exists in v3 Direction 3.
No schema migrations.
v1 → v2 → v3 Direction 3 is two table additions, zero migrations. Migration work, along with the bug surface that comes with it, was removed from the roadmap before it was scheduled.
No fork-merge logic.
When the marketplace publishes a skill update, v3 Direction 1 would have needed conflict-resolution UX for users who'd edited their copy. v3 Direction 3 has no forks, so the update flow is a clean replace.

The net: a feature that initially scoped to roughly six months of engineering ships its first version in a week, with v2 and v3 Direction 3 phased on top of the same foundation. The engineering capacity that would have gone to building a document editor is available for the rest of Thunderbolt's roadmap.

Explore my portfolio.

Design speaks louder than words. Check out the full Figma file to see the process, decisions, and iterations behind this project.

Check Out Figma
mozilla mockup
Contact 1
Contact 2
Contact 6
Contact 7

Let's make something users will love!

If you're looking for a product designer who can bridge the gap between design and code, I'm here to help!