Loading repository data…
Loading repository data…
easytoolbox / repository
EasyHeadscaleAdmin is a modern self-hosted Headscale admin panel built on Next.js 15, TypeScript, Tailwind CSS, Prisma, and SQLite. The project prioritizes a production-ready MVP: utilizing a server-side proxy for the Headscale API, secure local storage for configuration, and clear module boundaries
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
EasyHeadscaleAdmin is a modern self-hosted Headscale admin panel built with Next.js 15, TypeScript, Tailwind CSS, Prisma, and SQLite. It focuses on a deployable MVP first, while keeping a clean structure for future extensions such as multi-instance support, RBAC, OIDC, and audit controls.
This project can take over the web registration approval flow used by the official Tailscale client when it is pointed at Headscale.
That means:
/register/<token> page, login, and approval flowThe current project implementation uses the Headscale registration endpoint that has been verified against the instance Swagger definition:
POST /api/v1/node/register?user=<username>&key=<token>If Headscale is already running behind a reverse proxy, you only need to forward the /register/ path to EasyHeadscaleAdmin:
location ^~ /register/ {
return 301 https://your-domain-name$request_uri;
}
Typical deployment pattern:
Headscale continues serving the control plane on its own internal address/register/* is redirected or proxied to EasyHeadscaleAdminImportant notes:
/register/* web approval pageapp/
(protected)/
api/
setup/
components/
layout/
shared/
ui/
features/
dashboard/
users/
nodes/
preauthkeys/
apikeys/
routes/
settings/
lib/
api.ts
env.ts
errors.ts
forms/
headscale/
server/
config-service.ts
crypto.ts
db.ts
prisma/
schema.prisma
migrations/
pnpm install
cp .env.example .env
Main variables:
DATABASE_URL: local SQLite database pathAPP_ENCRYPTION_KEY: encrypts the stored Headscale API keyAUTH_SESSION_SECRET: signs the admin session cookieADMIN_USERNAME: admin usernameADMIN_PASSWORD_HASH: admin password hashPORT: listen portNEXT_PUBLIC_BASE_PATH: optional base path for subdirectory deployments such as /admin or /registerpnpm db:deploy
pnpm auth:hash 'your-password'
To verify a password against the current .env hash:
pnpm auth:verify 'your-password'
pnpm dev
Then open http://localhost:3000.
pnpm build
pnpm start
This project supports deployment at the root path or under a subdirectory, but basePath is a build-time setting.
Root deployment:
./build.sh
Subdirectory deployment:
NEXT_PUBLIC_BASE_PATH="/register" ./build.sh
Notes:
NEXT_PUBLIC_BASE_PATH empty for root deploymentNEXT_PUBLIC_BASE_PATH requires a rebuildAPP_ENCRYPTION_KEY="replace-with-a-long-random-secret" docker compose up -d --build
docker build -t easy-headscale-admin .
docker run -d \
--name easy-headscale-admin \
-p 3000:3000 \
-e DATABASE_URL="file:./dev.db" \
-e APP_ENCRYPTION_KEY="replace-with-a-long-random-secret" \
-e AUTH_SESSION_SECRET="replace-with-another-long-random-secret" \
-e ADMIN_USERNAME="admin" \
-e ADMIN_PASSWORD_HASH="replace-with-output-from-pnpm-auth-hash" \
easy-headscale-admin
This project supports deployment in a Node runtime such as 1panel/node:25.8.0.
Build a runtime bundle:
./build.sh
The output directory is:
dist/1panel-node
Recommended 1Panel settings:
/appnode server.jsPORT value in .envOn first startup, the runtime wrapper will:
.env.db-deploy.donePOST /api/v1/node/register endpoint/setup/api/* endpoints