Homepage for Xtagger at https://xtagger.dev
- Astro 61.3%
- Svelte 16%
- MDX 13.8%
- CSS 5.6%
- JavaScript 1.9%
- Other 1.4%
|
|
||
|---|---|---|
| .forgejo/workflows | ||
| public | ||
| src | ||
| .gitignore | ||
| astro.config.mjs | ||
| Caddyfile | ||
| CloudronManifest.json | ||
| Dockerfile | ||
| package.json | ||
| pnpm-lock.yaml | ||
| README.md | ||
| tailwind.config.mjs | ||
| tsconfig.json | ||
xtagger-site
Marketing and documentation site for XTagger — the local-first tag layer for X.com.
Built with Astro + Svelte 5 + Tailwind CSS.
Docs follow the Diátaxis framework.
Self-hosted on Cloudron via Docker + Caddy.
Development
pnpm install
pnpm dev # http://localhost:4321
pnpm build # outputs to dist/
pnpm preview # preview the production build
Deploy
Deployment is fully automated via Forgejo Actions (.forgejo/workflows/deploy.yml).
Every push to main:
- Installs dependencies and builds the Astro site
- Builds a Docker image (Caddy serving
dist/) - Pushes the image to your container registry
- Calls the Cloudron API to hot-update the running app
Required Forgejo secrets
| Secret | Value |
|---|---|
REGISTRY_URL |
Your container registry URL, e.g. registry.example.com |
REGISTRY_USER |
Registry username |
REGISTRY_PASSWORD |
Registry password / token |
CLOUDRON_URL |
Your Cloudron base URL, e.g. https://my.cloudron.example.com |
CLOUDRON_API_TOKEN |
Cloudron → Account → API Access → Generate token |
CLOUDRON_APP_ID |
Cloudron → Apps → XTagger Site → Configure → copy the app ID from the URL |
First deployment (manual)
Before the Actions workflow can update an existing app, the app needs to exist on Cloudron:
# 1. Build and push the image manually (or let Actions do it once)
docker build -t registry.example.com/xtagger-site:latest .
docker push registry.example.com/xtagger-site:latest
# 2. In Cloudron: Apps → Install a custom app → enter image name
# Set domain to xtagger.dev
# Cloudron handles TLS via Let's Encrypt automatically
Content structure (Diátaxis)
src/content/
tutorials/ Learning-oriented — follow along to achieve something
how-to/ Task-oriented — concise goal-based recipes
reference/ Information-oriented — dry, precise, complete
explanation/ Understanding-oriented — why things work the way they do
Porkbun DNS → Cloudron
In Porkbun, add an A record for xtagger.dev pointing to your Cloudron server IP.
Cloudron will automatically provision a Let's Encrypt certificate when you assign the domain in the app settings.
xtagger.dev A <your-cloudron-server-ip>
www CNAME xtagger.dev