every file and folder gets two types of URLs: a slug URL and a name URL.
slug URLs (default)
when you upload a file, tinydot generates a URL-friendly slug from the filename:
marketplace.json→/marketplace(extension stripped, rendered as HTML page)My Document.md→/my-document(lowercased, spaces become dashes)README.md→/readme
slug URLs serve rendered HTML views with the site template applied.
name URLs
files are also accessible by their original filename:
marketplace.json→/marketplace.json(raw JSON,application/json)SKILL.md→/SKILL.md(raw markdown,text/markdown)style.css→/style.css(raw CSS,text/css)
name URLs serve the raw file with the correct Content-Type header. no template, no rendering.
resolution order
when you visit a URL, tinydot resolves it in this order:
- try slug match - if found, serve rendered HTML view
- try name match - if found, serve raw file with Content-Type
- return 404
slug always wins. if a slug and a filename both match the same path, you get the rendered view.
folder paths
folder structure maps to URL paths for both slug and name resolution:
docs/intro.md→/docs/intro(slug) or/docs/intro.md(name).claude-plugin/plugin.json→/claude-plugin/plugin-json(slug) or/.claude-plugin/plugin.json(name)
intermediate path segments are resolved by folder name, so dot-prefix folders like .claude-plugin work in name URLs.
special URLs
these are handled before content resolution:
/rss.xmlor/feed.xml- RSS feed/sitemap.xml- sitemap/archive- archive view/raw/{path}- raw file access (legacy, works with both slug and name)/og.png- open graph image
Content-Type mapping
name URLs serve files with appropriate MIME types:
.json,.jsonc→application/json.js,.mjs→application/javascript.html,.htm→text/html.css→text/css.md,.markdown→text/markdown.yaml,.yml→text/yaml.csv→text/csv.xml→application/xml.txt,.log,.ts,.py,.sh, and other code files →text/plain- images, audio, video → appropriate media types
- unknown extensions →
application/octet-stream