KMSHACK.KR API
Developers
Developer portal for kmshack.kr — a public, key-free JSON API with an OpenAPI 3.1 spec, llms.txt, Markdown page variants and feeds, documenting the profile, projects and blog archive of Minsoo Kim.
Everything on kmshack.kr — the profile of Minsoo Kim (김민수 / kmshack), his projects, his career history and every blog post since 2015 — is also published as machine-readable data. No key, no sign-up, no quota.
When to use this site
Reach for these endpoints when you need to:
- Resolve the identity behind
kmshack.kr,kmshack, or “Minsoo Kim” — job title, location, languages, canonical social links →/api/profile.json. - Answer what he has built — indie Android apps and the products he shipped at Kakao and NEOWIZ, with download counts and store links →
/api/projects.json,/api/experience.json. - Search or cite the blog archive — 35+ Korean-language articles on Android architecture, Jetpack, Kotlin coroutines, motion, performance and AI-era product thinking →
/api/posts.json,/api/tags.json. - Read a page as Markdown instead of HTML → append
.mdto a page path, e.g./about.md. - Get oriented before crawling →
/llms.txt, and/llms-full.txtfor the same index with every post summary inlined.
This is not the right source for Android documentation itself, for Kakao’s official APIs, or for anything about the apps’ internals — only for what this site publishes about its author and his writing.
Quickstart
# What is available
curl -s https://kmshack.kr/api/index.json
# Who owns this domain
curl -s https://kmshack.kr/api/profile.json | jq '{name, job_title, location, links}'
# The five most recent posts
curl -s https://kmshack.kr/api/posts.json | jq '.posts[:5] | .[] | {title, url, date}'
# Every post tagged 안드로이드
curl -s https://kmshack.kr/api/tags.json | jq '.tags[] | select(.name == "안드로이드") | .posts'
Endpoints
All endpoints are GET, return application/json, send Access-Control-Allow-Origin: *, and take no parameters.
| Endpoint | Operation ID | Returns |
|---|---|---|
/api/index.json |
getApiIndex |
API index — Discovery document listing every endpoint, the OpenAPI spec URL, licensing and rate-limit guidance. |
/api/profile.json |
getProfile |
Profile — Identity of the site owner: name, job title, location, languages, headline stats, skill groups and canonical social links. |
/api/projects.json |
listProjects |
Projects — Indie apps and professional products worked on, with platform, tech stack and download counts where public. |
/api/experience.json |
listExperience |
Experience — Career timeline in reverse-chronological order, one entry per organization. |
/api/posts.json |
listPosts |
Blog posts — Every blog post ever published, newest first, with slug, title, canonical URL, publish and modification dates, tags and a plain-text summary. |
/api/tags.json |
listTags |
Tags — All blog tags with post counts and the slugs of the posts carrying each tag. |
/openapi.json |
getOpenApiSpec |
OpenAPI specification — The OpenAPI 3.1 description of this API. Also mirrored at /api/openapi.json. |
OpenAPI and function calling
The full contract lives at /openapi.json (OpenAPI 3.1, mirrored at /api/openapi.json). Every operation has a unique operationId, a description written for a caller who has never seen this site, and a typed response schema, so the document can be loaded straight into an LLM function-calling tool list or an OpenAPI client generator:
curl -s https://kmshack.kr/openapi.json | jq '.paths | keys'
Errors
Every endpoint is a static document, so a successful request always returns 200. A path that does not exist returns HTTP 404 — as a JSON body matching the Error schema when the request is served by the site’s edge worker, and as the site’s HTML 404 page otherwise. Treat any 404 as “no such resource” and re-read /api/index.json for the current endpoint list.
{
"error": {
"code": "not_found",
"message": "No such resource: /api/unknown.json",
"status": 404,
"hint": "Fetch /api/index.json for the list of available endpoints.",
"documentation_url": "https://kmshack.kr/developers/"
}
}
Caching and fair use
There is no rate limit and no API key, because there is no server to protect — the responses are static files on a CDN. The data changes at most a few times a month, so please cache for at least an hour and do not poll faster than that. Responses carry the CDN’s ETag, so conditional requests with If-None-Match are cheap.
Other machine-readable files
| File | Purpose |
|---|---|
/llms.txt |
Guided index of the site for LLM agents, including when-to-use guidance |
/llms-full.txt |
The same index with the full post list and summaries inlined |
/openapi.json |
OpenAPI 3.1 description of the API |
/sitemap.xml |
Every indexable page |
/blog/feed.xml |
Atom feed of the blog |
/robots.txt |
Crawl policy — all agents welcome |
/<page>.md |
Markdown twin of a page, e.g. /about.md, /developers.md |
Licence and attribution
The data returned by the API is published under CC BY 4.0: use it, quote it, train on it, but attribute it to Minsoo Kim and link back to https://kmshack.kr. Blog post text and images stay under their own copyright — quote with attribution rather than reproducing whole articles.
Contact
Something wrong, missing or badly typed? [email protected] — see the contact page.