After using Claude Code, WorkBuddy, and similar agent tools for a while, the number of skills I rely on kept growing. Some skill packages are large: hundreds of files, several hundred megabytes, sometimes more than a gigabyte. My old habit was simple: drop the skill folder into the relevant project and tell the agent, 'load xx skill and do xx.'
It sounded convenient at first, but problems showed up quickly:
- Scattered storage: skills ended up in project folders with no central place.
- Hard to find: a skill that felt useful at the time was easy to forget, and finding it again took a lot of digging.
- Duplicate downloads: the same skill had to be copied into different projects whenever it was needed.
So I started thinking: could I build my own skill repository, upload and record the good skills I use, and browse or download them whenever I need them? It did not need to be elaborate or polished—just useful for daily work and accumulation. That is how I vibe-coded a small Skill marketplace.
Design and features
UI
I started with a style document generated from an existing blog theme, then handed it to Claude Code and asked it to design the Skill marketplace around that style. The result is a warm, translucent frosted-glass look: large rounded cards, semi-transparent backgrounds, LXGW WenKai typography, and cards that softly glow in dark mode. It felt comfortable and simple, so I did not overhaul it later.

Homepage
The homepage opens with a search box, category tags, and a grid of skill cards. You can filter by category—development tools, debugging and diagnostics, deployment and operations, documentation and writing, AI, and others—or search directly by keyword. The category tags scroll horizontally and work well on mobile. Each card shows the title, category badge, download count, and version number, so the key information is visible at a glance.

Detail page
Clicking a card opens the detail page, which automatically renders the skill's README.md. Full Markdown syntax is supported: tables, code blocks, strikethrough, and task lists all display correctly. External images, such as screenshots hosted on GitHub, also load normally. A maximum width keeps them from stretching the card. Clicking any image opens a frosted-glass lightbox with the original image; press Esc or click the background to close it.

Uploading a skill
There are four upload paths: a single .md file, a .zip or .tar.gz archive, or selecting a folder directly in the browser. The folder option is zipped by the backend before upload, mainly because it makes extracting README content for the detail page easier.
After upload, the system extracts preview content intelligently. It looks for README.md in the root directory first; if that is missing, it searches subdirectories; if that still fails, it falls back to the first .md file. There is no need to specify the main document manually. Images inside archives are handled automatically too: they are extracted, uploaded to Qiniu Cloud CDN, and the image paths in the preview are replaced with direct links.

Category management
Categories can be managed from the backend at any time: create, rename, or delete. When a category is deleted, skills in that category automatically move to 'Other', so no data is lost.

Visitor and admin permissions
The project has no public registration. The admin account is preset in .env, and one person manages it. The main reason for splitting permissions is the limited free storage and traffic quota on object storage.
Visitors can browse the homepage, search and filter skills, open detail pages to view rendered README content, and click images to view them in the lightbox. If the admin supplied a GitHub URL during upload, visitors also see a 'Go to GitHub to download' button and can get the resource from the original repository.
Admins can upload skills as .md, .zip, .tar.gz, or folders; download original skill files; edit skill information; delete skills; and manage categories. All upload, delete, and download operations are written to a local log file.
Tech stack
The backend uses Go with Chi Router for routing, SQLite through modernc.org/sqlite (pure Go, no CGO) as the database, Go's standard html/template as the template engine, Goldmark for Markdown rendering, and Qiniu Cloud Kodo plus CDN for file storage and download acceleration.
The frontend uses no framework. CSS variables drive the frosted-glass style, dark mode, and responsive layout. JavaScript only pulls in Alpine.js for theme switching and the image lightbox. Authentication uses gorilla/sessions for cookie sessions. The admin account is preset in SQLite, with no registration flow. Logging is handled by a custom logger package that rolls by file size: each file is capped at 10 MB, up to five files are kept, and disk usage is hard-capped at 50 MB.
Core design decisions
Single-file deployment. The whole application compiles into a 24 MB binary with SQLite embedded, with no external service dependency. Copy it to a server, place .env, template/, and static/ beside it, and run ./skill_market.
Downloads do not use server bandwidth. The cloud server has only 3 Mbps of bandwidth, so downloading files through it is painfully slow. Skill files are uploaded directly to Qiniu Cloud Kodo, and the database stores only CDN links. When a user clicks download, the server returns a 302 Redirect to the Qiniu direct link, and the actual transfer is handled entirely by the CDN. The 3 Mbps connection only handles page requests, which is more than enough.
Smart preview extraction. When uploading a zip, tar.gz, or folder, the backend searches the archive for previewable content in priority order: root README.md → subdirectory README.md → first .md in the root → any .md file. Once found, the text is extracted and stored in the database, and the detail page renders it as HTML through Goldmark. Users do not need to specify which file is the documentation.
Automatic image path rewriting. If a Markdown file in an archive references a local image, such as , the image is extracted and uploaded to Qiniu Cloud during upload, and the path is replaced with a CDN direct link. That way the <img> tags rendered on the detail page point directly to the CDN, avoiding broken relative paths.
Size-rolling logs. Logs do not rotate by day; they rotate by file size. A single log file is capped at 10 MB, after which a new file is started. At most five files are kept, and the oldest is deleted when the limit is exceeded. Disk usage is hard-capped at 50 MB, which suits a small system disk.
Manageable categories. Categories are not hard-coded; the backend can add, remove, and rename them. When a category is deleted, skills under it automatically migrate to 'Other', so no orphaned data is left behind.
Deployment
I sent the GitHub link through Feishu to Hermes on the server. It handled the whole flow: pulling the code, installing dependencies, compiling and starting the app, writing a systemd unit for process supervision, boot autostart, and crash restart, configuring an nginx reverse proxy, and using certbot to obtain a Let's Encrypt certificate for HTTPS. A few small problems came up along the way, and Hermes patched the code and got it running. After I provided a GitHub personal access token, it also committed the changes back to my repository.

Final notes
The result is satisfying enough for now, and I hope to keep maintaining it. The project lives at skill.rawleycode.art. If you also use agent tools heavily and have accumulated a pile of skills, with the same kind of clutter, you can try this small project by configuring .env. It is a lightweight tool built around personal pain points, so there are certainly rough edges left to polish. Suggestions are welcome. The code is open source at https://github.com/xjwukk/skill_market.