A self-hosted link archival tool
  • Go 76.6%
  • Vue 16.6%
  • TypeScript 3%
  • HTML 1.6%
  • CSS 0.9%
  • Other 1.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Felipe M. 5fbd6788a4
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 13s
CI / format (pull_request) Successful in 3m4s
CI / lint (pull_request) Successful in 3m58s
CI / e2e (pull_request) Failing after 1m48s
CI / test (pull_request) Successful in 5m42s
CI / build (pull_request) Successful in 3m8s
fix(ci): combine DinD with Playwright install without --with-deps
DinD is required for testcontainers but breaks apt-based --with-deps;
install chromium only after the daemon is ready.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-19 15:28:08 +02:00
.github/workflows fix(ci): combine DinD with Playwright install without --with-deps 2026-08-19 15:28:08 +02:00
.readme docs: screenshots 2026-01-12 21:18:29 +01:00
cmd/hako feat: enhance build configuration and implement versioning 2026-01-03 13:49:17 +01:00
devdata feat: add server host and interface binding configuration 2026-01-29 12:57:10 +01:00
docs docs: screenshots 2026-01-12 21:18:29 +01:00
e2e fix(ci): mount Docker socket for e2e job on Forgejo Actions 2026-08-19 15:05:13 +02:00
internal feat: add user administration API and UI 2026-04-02 10:33:36 +02:00
scripts fix(ci): simplify e2e job and default testcontainers for CI 2026-08-19 15:23:04 +02:00
webapp fix: use all:dist embed directive to include dot-files 2026-04-07 18:26:06 +02:00
.dockerignore ci: migrate from Woodpecker CI to Forgejo Actions 2026-04-07 18:08:25 +02:00
.gitignore chore: add default config file for development 2026-01-29 12:52:15 +01:00
.golangci.yaml feat: search 2026-01-18 09:51:25 +01:00
.goreleaser.yml ci: align Forgejo Actions with migrated repo conventions 2026-08-19 14:45:50 +02:00
Containerfile ci: migrate from Woodpecker CI to Forgejo Actions 2026-04-07 18:08:25 +02:00
docker-compose.yml ci: migrate from Woodpecker CI to Forgejo Actions 2026-04-07 18:08:25 +02:00
go.mod deps: cleanup 2026-01-29 13:25:32 +01:00
go.sum deps: cleanup 2026-01-29 13:25:32 +01:00
LICENSE initial boilerplate 2026-01-03 11:43:21 +01:00
Makefile ci: increase test timeout to 5m for CI with race detector 2026-04-08 09:52:19 +02:00
README.md feat(e2e): add HTML report generation with embedded screenshots 2026-01-18 18:45:09 +01:00

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.