Static Files
Drop any file into app/public/ and it's served directly at its URL — images, fonts, CSS, JSON, WASM, anything.
How it works
Files in app/public/ are served at the root with the correct Content-Type automatically. No route file, no import, no config required.
file → URLbash
app/public/
├── favicon.ico → /favicon.ico
├── robots.txt → /robots.txt
├── logo.png → /logo.png
├── main.css → /main.css
└── fonts/
└── inter.woff2 → /fonts/inter.woff2Referencing public files
Use root-relative paths in your components. The leading / maps to app/public/:
app/pages/layout.tsxtypescript
import { useHtml } from 'nukejs'
export default function Layout({ children }: { children: React.ReactNode }) {
useHtml({
link: [
{ rel: 'icon', href: '/favicon.ico' },
{ rel: 'stylesheet', href: '/main.css' },
]
})
return (
<>
<img src="/logo.png" alt="Logo" width={120} height={40} />
{children}
</>
)
}Deployment behaviour
| Environment | How public files are served |
|---|---|
| nuke dev | Built-in middleware serves them before any routing |
| nuke build (Node) | Copied to dist/static/, served by the Node HTTP server |
| nuke build (Vercel) | Copied to .vercel/output/static/ — served by Vercel's CDN, zero function invocations |
Public files are free on VercelStatic files served from the CDN don't count against your function invocation quota. Put everything that doesn't need server logic in
app/public/.