Docs
Everything about putting a site on Yuki Pages: the yp command, CI, the HTTP API and what your site can and can't do once it's live.
Quick start
- Install
curl -fsSL https://pages.yukichat.lol/install | sh
- Go to your site's folder and run
yp
The first time, yp opens your browser so you can approve it with your YukiChat account, then asks for a site name. After that, every yp in that folder updates the same site.
Prefer clicking? Upload a folder or zip on the dashboard.
Install
The installer puts a single bash script in /usr/local/bin or ~/.local/bin. It needs bash, curl and tar, which macOS, Linux and WSL already have.
curl -fsSL https://pages.yukichat.lol/install | sh
Or by hand:
curl -fsSL https://pages.yukichat.lol/_/yp -o ~/.local/bin/yp && chmod +x ~/.local/bin/yp
To update, run the same command again.
Commands
| Command | What it does |
|---|---|
yp | Deploys the current folder. Asks for a name the first time and remembers it in a .yukipages file. |
yp my-site | Deploys the current folder to pages.yukichat.lol/my-site/. |
yp -d public | Deploys a specific folder. |
yp login | Signs in through the browser. yp login yp_… saves a token you made on the dashboard. |
yp ls | Lists your sites. |
yp open | Opens this folder's site in the browser. |
yp rm my-site | Deletes a site. The name becomes free for anyone. |
yp logout | Forgets the saved token on this computer. |
Which folder gets uploaded
If the current folder has an index.html, that's it. Otherwise yp looks in dist/, build/, out/, public/, _site/, site/ and www/, in that order. Hidden files (.git, .env…) and node_modules are never uploaded.
Commit the .yukipages file if you want everyone on the project to deploy to the same name.
Paths and frameworks
/style.css points at pages.yukichat.lol/style.css, which isn't yours. Use relative paths like style.css or ./style.css.Most build tools have a setting for this:
| Tool | Setting |
|---|---|
| Vite | base: './' in vite.config.js, output in dist/ |
| Create React App | "homepage": "." in package.json, output in build/ |
| Next.js | output: 'export' and basePath: '/my-site', output in out/ |
| Astro | base: '/my-site', output in dist/ |
| Plain HTML | Nothing to do, just keep links relative |
Single-page apps
Use a hash router (#/about) and everything works. With history routing, copy index.html to 404.html so unknown URLs still load your app.
Custom 404
Put a 404.html at the top of your site and it's shown for any missing page inside it.
Deploy from CI
Make a token on the dashboard (or run yp login and copy ~/.config/yukipages/token), save it as a secret named YP_TOKEN, and run yp. With YP_TOKEN set it never asks anything.
GitHub Actions
# .github/workflows/pages.yml name: Deploy to Yuki Pages on: { push: { branches: [main] } } jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci && npm run build # skip for plain HTML - run: curl -fsSL https://pages.yukichat.lol/install | sh - run: ~/.local/bin/yp my-site env: YP_TOKEN: ${{ secrets.YP_TOKEN }}
Anything else
tar -czf - -C dist . | curl -fsS \ -H "Authorization: Bearer $YP_TOKEN" \ -H "Content-Type: application/gzip" \ --data-binary @- https://pages.yukichat.lol/api/sites/my-site
HTTP API
Base URL https://pages.yukichat.lol. Send your token as Authorization: Bearer yp_…. Responses are JSON; errors look like {"detail": "This name is taken"}.
| Request | What it does |
|---|---|
POST /api/sites/{name} | Creates or replaces a site. Body: a .tar.gz (Content-Type: application/gzip) or .zip (application/zip). Optional ?title=. Returns url, files, bytes, skipped. |
DELETE /api/sites/{name} | Deletes a site. |
GET /api/me | Your account, your sites and the limits. |
GET /api/check/{name} | Whether a name is free. No token needed. |
| Status | Meaning |
|---|---|
400 | Bad name, no index.html, too many files or sites |
401 | Missing or revoked token |
403 | Site disabled or account banned for breaking the rules |
409 | Name belongs to someone else |
413 | Over 50 MB |
429 | More than 60 deploys in an hour |
A token can do everything your account can on Pages. Revoke old ones on the dashboard.
How sites run
Every site runs in a browser sandbox, so no site can read another one's data or pretend to be the Yuki domain.
- Works: HTML, CSS, JavaScript and ES modules, images, fonts, audio, video, canvas, WebGL, WASM,
fetchto your own files and to public APIs, forms, popups. - Doesn't work: cookies,
localStorage,sessionStorage, IndexedDB, service workers. Keep state in memory or in the URL. - No server code: no PHP, Node or databases.
- HTTPS always. Files are cached for 5 minutes, so a deploy can take that long to show for people who already had the page open.
Limits
| Sites per account | 25 |
| Size per site | 50 MB |
| Files per site | 1,000 |
| API tokens | 10 |
| Deploys | 60 per hour |
| Names | 3 to 32 characters: a-z, 0-9, hyphens |
| File types | Web files: html, css, js, json, images, fonts, audio, video, wasm, glb, pdf, csv, txt and similar. Others are skipped. |
Everything on Pages follows the rules. Phishing gets a site removed and the account banned on the spot.