managarten/apps/uload
Till JS b737240ec1 feat(auth): add access tier system for phased app releases
Introduces a tiered access control system so apps can be released
gradually (founder → alpha → beta → public) without extra infrastructure.
Users are gated at the AuthGate level based on their tier vs the app's
requiredTier. All apps remain deployed and reachable, but only users
with sufficient tier can enter.

- Add accessTier enum + column to users schema (default: 'public')
- Add tier claim to JWT payload in better-auth config
- Add requiredTier field to ManaApp interface + all 25 apps
- Add hasAppAccess(), getAccessibleManaApps(), ACCESS_TIER_LABELS
- Update AuthGate with tier check + access denied screen
- Update getPillAppItems + Home page to filter by user tier
- Update all 22 app layouts to pass user tier to PillNav
- Add admin API: GET/PUT /api/v1/admin/users/:id/tier
- Document access tier system in CLAUDE.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 21:50:06 +02:00
..
apps feat(auth): add access tier system for phased app releases 2026-03-30 21:50:06 +02:00
packages/uload-database feat(uload): rewrite to local-first + Hono architecture 2026-03-29 09:16:04 +02:00
CLAUDE.md feat(uload): Docker setup, CLAUDE.md rewrite, bulk actions, link expiry & passwords 2026-03-29 15:14:45 +02:00
package.json feat(uload): rewrite to local-first + Hono architecture 2026-03-29 09:16:04 +02:00
README.md feat(uload): rewrite to local-first + Hono architecture 2026-03-29 09:16:04 +02:00

uLoad - URL Shortener & Link Management

A modern URL shortener and link management platform built with SvelteKit and PocketBase.

🚀 Production

Live: https://ulo.ad
Admin: https://ulo.ad/_/

🛠 Tech Stack

  • Frontend: SvelteKit 2.0 + Svelte 5
  • Backend: PocketBase (embedded)
  • Styling: Tailwind CSS 4.0
  • Deployment: Docker + Coolify on Hetzner VPS
  • Database: SQLite (via PocketBase)

📦 Features

  • URL shortening with custom codes
  • QR code generation
  • Click analytics
  • User profiles (e.g., ulo.ad/p/username)
  • Link management dashboard
  • Real-time statistics

🏃 Development

# Install dependencies
npm install --legacy-peer-deps

# Start development server
npm run dev

# Start with PocketBase backend
npm run dev:all

# Run tests
npm run test

# Type checking
npm run check

🐳 Docker Deployment

# Build and run locally
docker-compose up --build

# Access at:
# Frontend: http://localhost:3000
# PocketBase: http://localhost:8090

📝 Documentation

🔧 Environment Variables

NODE_ENV=production
PORT=3000
ORIGIN=https://ulo.ad
PUBLIC_POCKETBASE_URL=https://ulo.ad/api
POCKETBASE_ADMIN_EMAIL=admin@example.com
POCKETBASE_ADMIN_PASSWORD=secure_password

See .env.example for all configuration options.

📂 Project Structure

uload/
├── src/               # SvelteKit application
│   ├── routes/       # Pages and API routes
│   ├── lib/          # Components and utilities
│   └── app.html      # HTML template
├── backend/           # PocketBase configuration
│   ├── pb_schema.json # Database schema
│   └── init-pocketbase.sh # Setup script
├── build/            # Production build output
├── static/           # Static assets
├── Dockerfile        # Multi-stage Docker build
├── docker-compose.yml # Local development
├── supervisord.conf  # Process management
└── CLAUDE.md         # AI assistant context

🚢 Deployment

The application is deployed on Hetzner VPS using Coolify with automatic deployments on push to main branch.

# Commit and push to deploy
git add .
git commit -m "Update"
git push origin main
# Coolify automatically deploys

Manual Deployment Steps:

  1. Set DNS A record to 91.99.221.179
  2. Add domain in Coolify
  3. Update environment variables
  4. Enable SSL certificate
  5. Deploy application

📊 Monitoring

🔐 Security

  • HTTPS enforced
  • Environment-based configuration
  • Secure admin authentication
  • Rate limiting on API endpoints
  • Regular security updates

🤝 Contributing

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

🐛 Troubleshooting

Common issues and solutions are documented in DEPLOYMENT_LESSONS_LEARNED.md

For support, check:

  • Application logs in Coolify
  • Health endpoint status
  • PocketBase admin panel

📄 License

Private - Memoro AI © 2024