- Go 76.6%
- Vue 16.6%
- TypeScript 3%
- HTML 1.6%
- CSS 0.9%
- Other 1.3%
Add admin-only CRUD endpoints for user management under /api/v1/system/users with full frontend implementation including create, edit, change password, and delete operations with self-protection guards. - Extend AuthDomain interface with ListUsers, GetUser, UpdateUser, UpdateUserPassword, DeleteUser methods - Add List, Update, Delete methods to UserStore with shared scanUser helper - Create UserHandler with 5 endpoints protected by admin middleware - Complete Users.vue admin page with modals and error handling - Make CreateUser accept role parameter for atomic user creation - Fix auth middleware to use database role as source of truth instead of stale JWT claims, preventing privilege persistence after demotion - Fix pre-existing gofmt issues in yt_dlp.go and config.go |
||
|---|---|---|
| .readme | ||
| .woodpecker | ||
| cmd/hako | ||
| devdata | ||
| docs | ||
| e2e | ||
| internal | ||
| scripts | ||
| webapp | ||
| .gitignore | ||
| .golangci.yaml | ||
| .goreleaser.yml | ||
| Containerfile | ||
| docker-compose.yml | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| Makefile | ||
| README.md | ||
Hako
Hako is a self-hosted link archival service that automatically saves and preserves web content. Save URLs and let Hako archive them using multiple archival methods, extract content for full-text search, and organize your saved links with categories.
Features
- Link Archival: Save URLs and automatically archive web content.
- Multiple Archivers: Support for different archival methods depending on the site or content type.
- Content Extraction: Extract text content from PDFs and web pages for full-text search
- Rule Engine: Configurable rules that automatically select appropriate archivers based on URL patterns, hostnames, and content types
- Categories: Organize links in categories.
- Archive History: Track multiple archive versions for each link if archived multiple times.
- Full-Text Search: Search through archived content.
- Self-Hosted: Full control over your archived data
Tech stack
- Go
- Vue 3
- Bun
Screenshots
See docs/screenshots.
Running the Application
This project uses a Makefile for common tasks. Run make help to see all available commands.
Backend
To build and run the backend:
# Build the webapp (required for embedded frontend)
make build-webapp
# Run the server only (without building webapp)
make run-server
Frontend
The frontend is built with Vue.js and Vite, using Bun as the package manager:
# Run the webapp in development mode with hot-reload
make run-webapp
# Build the webapp for production
make build-webapp
Docker
Running with Docker Compose
To run Hako locally using Docker Compose:
# Build the docker binaries
make build-docker
# Start the container
docker compose up
# Or run in detached mode
docker compose up -d
The service will be available at http://localhost:8080.
Building Docker Images
To build Docker images using goreleaser (for production builds):
# Build Docker image locally (creates multi-arch images)
make build-docker
This will build Docker images for multiple architectures (amd64, arm64, armv7) using goreleaser.
Development
Development Commands
Common development tasks:
# Run linting (server and webapp)
make lint
# Run test suite
make test
# Run integration tests
make e2e
# Format code
make format
# Clean build artifacts
make clean
# Clear dev data (keeps config.yaml)
make clean-devdata
Run make help to see all available commands.