- Svelte 60.8%
- TypeScript 28.4%
- JavaScript 8.2%
- CSS 2.1%
- HTML 0.2%
- Other 0.2%
| .forgejo/workflows | ||
| scripts | ||
| src | ||
| static | ||
| .dockerignore | ||
| .gitignore | ||
| .npmrc | ||
| .releaserc.cjs | ||
| CHANGELOG.md | ||
| components.json | ||
| Dockerfile | ||
| LICENSE | ||
| openapi.json | ||
| package.json | ||
| pnpm-lock.yaml | ||
| README.md | ||
| renovate.json | ||
| svelte.config.js | ||
| tsconfig.json | ||
| vite.config.ts | ||
skinhub-ui
SvelteKit UI for skins.sulej.net. The backend lives at skinhub/skinhub-api.
Stack
- SvelteKit 2.x + Svelte 5 (runes)
- Tailwind 4 + bits-ui
- CodeMirror 6 (JSON editor)
@lucide/svelteicons@sveltejs/adapter-node(SSR)
Local dev
Requires Node 24 and pnpm (managed by corepack, which ships with Node):
corepack enable # one-time: activates the pnpm pinned in package.json's "packageManager"
pnpm install
pnpm sync-types # pull the committed openapi.json from skinhub-api, regenerate src/lib/api-types.generated.ts
pnpm dev # vite dev server on :3000
pnpm sync-types fetches the openapi.json that skinhub-api's CI commits to the matching branch and runs openapi-typescript; pnpm sync-types:local dumps the spec straight from the sibling ../skinhub-api working tree instead (co-dev without a backend push). Run one of them whenever the backend's API shape changes and commit both the vendored openapi.json and the regenerated types — CI's check-types fails on any diff.
The lockfile is pnpm-lock.yaml; there is no package-lock.json (.npmrc sets package-lock=false).
Deployment
CI on push to main/beta builds + pushes git.sulej.net/skinhub/skinhub-ui, bumps the pinned tag in skinhub/deploy, and Komodo redeploys the stack (skinhub-ui, or skinhub-ui-beta for the beta branch).
Traefik routes everything under skins.sulej.net (except /api/*) → the UI container on :3000.
License
Licensed under AGPL-3.0-only. The LICENSE file was added in 2026; all prior versions, releases, and container images (which predate the LICENSE file in the source tree) are also offered under AGPL-3.0 at the discretion of the copyright holder.