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:

  1. try slug match - if found, serve rendered HTML view
  2. try name match - if found, serve raw file with Content-Type
  3. 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.xml or /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, .jsoncapplication/json
  • .js, .mjsapplication/javascript
  • .html, .htmtext/html
  • .csstext/css
  • .md, .markdowntext/markdown
  • .yaml, .ymltext/yaml
  • .csvtext/csv
  • .xmlapplication/xml
  • .txt, .log, .ts, .py, .sh, and other code files → text/plain
  • images, audio, video → appropriate media types
  • unknown extensions → application/octet-stream