- Go 77%
- Vue 16.5%
- TypeScript 3%
- HTML 1.6%
- CSS 0.9%
- Other 1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
CI / goreleaser-lint (pull_request) Successful in 8s
CI / format (pull_request) Successful in 1m33s
CI / lint (pull_request) Successful in 3m23s
CI / build (pull_request) Successful in 3m5s
CI / test (pull_request) Successful in 4m38s
CI / e2e (pull_request) Successful in 26m24s
playwright-go v0.5200.1 fetches its driver from playwright.azureedge.net and two sibling mirrors. Microsoft retired that CDN, so the e2e job died on a 404 before it ever reached a test. The replacement host serves no builds/driver zip for any version — 1.52 through 1.62 all answer 400 — so there is nothing to pin or mirror to. v0.6100.0 onwards pulls playwright-core from npm and Node from nodejs.org instead, and moves the module path back to github.com/mxschmitt/playwright-go. Take v0.6201.1, the latest. The Playwright 1.52 to 1.62 jump needs no changes beyond the import path. The CLI must match the module the tests link against, and the three places that ran it had already drifted apart: the workflow pinned v0.5200.1, the Makefile and scripts/e2e.sh asked for @latest. Both now read the version from e2e/go.mod, and the workflow calls make e2e-install. |
||
| .github/workflows | ||
| .readme | ||
| cmd/hako | ||
| devdata | ||
| docs | ||
| e2e | ||
| internal | ||
| scripts | ||
| webapp | ||
| .dockerignore | ||
| .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.