Yuki Pages

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

  1. Install
    curl -fsSL https://pages.yukichat.lol/install | sh
  2. 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

CommandWhat it does
ypDeploys the current folder. Asks for a name the first time and remembers it in a .yukipages file.
yp my-siteDeploys the current folder to pages.yukichat.lol/my-site/.
yp -d publicDeploys a specific folder.
yp loginSigns in through the browser. yp login yp_… saves a token you made on the dashboard.
yp lsLists your sites.
yp openOpens this folder's site in the browser.
yp rm my-siteDeletes a site. The name becomes free for anyone.
yp logoutForgets 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

Your site lives in a folder, not at the root.A link to /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:

ToolSetting
Vitebase: './' in vite.config.js, output in dist/
Create React App"homepage": "." in package.json, output in build/
Next.jsoutput: 'export' and basePath: '/my-site', output in out/
Astrobase: '/my-site', output in dist/
Plain HTMLNothing 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"}.

RequestWhat 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/meYour account, your sites and the limits.
GET /api/check/{name}Whether a name is free. No token needed.
StatusMeaning
400Bad name, no index.html, too many files or sites
401Missing or revoked token
403Site disabled or account banned for breaking the rules
409Name belongs to someone else
413Over 50 MB
429More 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.

Limits

Sites per account25
Size per site50 MB
Files per site1,000
API tokens10
Deploys60 per hour
Names3 to 32 characters: a-z, 0-9, hyphens
File typesWeb 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.