A self-hosted link archival tool
  • Go 77%
  • Vue 16.5%
  • TypeScript 3%
  • HTML 1.6%
  • CSS 0.9%
  • Other 1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Felipe M. 4d1af76510
All checks were successful
CI / goreleaser-lint (pull_request) Successful in 10s
CI / format (pull_request) Successful in 1m30s
CI / lint (pull_request) Successful in 4m43s
CI / test (pull_request) Successful in 6m59s
CI / build (pull_request) Successful in 6m25s
CI / e2e (pull_request) Successful in 25m10s
ci: start containerd before dockerd in the e2e service
Retrying dockerd was a coin flip. containerd needs a little over ten
seconds to boot in the runner's container and dockerd waits exactly
ten, so every attempt loses that race when the host is busy: run 19
burned all five and the job waited three minutes for a daemon that
never arrived.

Starting containerd first and handing dockerd the socket removes the
timeout from the picture. Measured on the runner: ready in 30 seconds,
no retries.
2026-09-22 19:27:51 +02:00
.github/workflows ci: start containerd before dockerd in the e2e service 2026-09-22 19:27:51 +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 Merge origin/master into chore/upgrade-deps 2026-09-22 17:37:53 +02:00
internal feat: add user administration API and UI 2026-04-02 10:33:36 +02:00
scripts ci: migrate from Woodpecker CI to Forgejo Actions (#1) 2026-09-22 17:33:29 +02:00
webapp Merge origin/master into chore/upgrade-deps 2026-09-22 17:37:53 +02:00
.dockerignore ci: migrate from Woodpecker CI to Forgejo Actions (#1) 2026-09-22 17:33:29 +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: migrate from Woodpecker CI to Forgejo Actions (#1) 2026-09-22 17:33:29 +02:00
Containerfile ci: migrate from Woodpecker CI to Forgejo Actions (#1) 2026-09-22 17:33:29 +02:00
docker-compose.yml ci: migrate from Woodpecker CI to Forgejo Actions (#1) 2026-09-22 17:33:29 +02:00
go.mod deps: upgrade server dependencies 2026-09-22 12:08:04 +02:00
go.sum deps: upgrade server dependencies 2026-09-22 12:08:04 +02:00
LICENSE initial boilerplate 2026-01-03 11:43:21 +01:00
Makefile ci: run golangci-lint at the pinned version 2026-09-22 18:11:37 +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.