A minimal, JSON-driven documentation resolver built with Flask. murmr lets you organize and serve structured API documentation through a simple file-based system — no database, no hosting, no overhead.
Documentation is structured into three levels:
- Title — the API or project name (e.g.,
IdentityAPI) - Topic — a category or feature within it (e.g.,
activation) - Point — a specific endpoint or item within the topic (e.g.,
activate)
JSON files live under base/<Title>/topics/ for documentation content, and base/<Title>/references/ for reusable references.
References follow the pattern @<file>#<key> and are resolved recursively at request time.
Start the server:
python app.pyThen query any documentation point:
GET http://127.0.0.1:5000/api/IdentityAPI/activation/activateTopic file entry:
{
"activate": {
"name": "Activate Account",
"description": "Activates a deactivated account.",
"request": {
"type": "DELETE",
"body": "@body#identity-serializer"
},
"response": {
"success": {
"status": "@status#204"
},
"failure": {
"status": "@status#400",
"body": "@body#errors-list"
}
}
}
}Resolved response:
{
"name": "Activate Account",
"description": "Activates a deactivated account.",
"request": {
"type": "DELETE",
"body": {
"key": "a string identifier in standard UUID format.",
"username": "a string between 4 and 12 alphanumeric characters.",
"password": "a string of at least 8 characters, not entirely numeric."
}
},
"response": {
"success": {
"status": { "value": 204, "phrase": "NO_CONTENT" }
},
"failure": {
"status": { "value": 400, "phrase": "BAD_REQUEST" },
"body": { "type": "list", "description": "A list containing error messages." }
}
}
}base/
└── IdentityAPI/
├── topics/
│ └── activation.json
└── references/
├── body.json
└── status.json