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. d4457cc4f6
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
fix(e2e): move off the retired Playwright driver CDN
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.
2026-09-22 16:38:00 +02:00
.github/workflows fix(e2e): move off the retired Playwright driver CDN 2026-09-22 16:38:00 +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(e2e): move off the retired Playwright driver CDN 2026-09-22 16:38:00 +02:00
internal feat: add user administration API and UI 2026-04-02 10:33:36 +02:00
scripts fix(e2e): move off the retired Playwright driver CDN 2026-09-22 16:38:00 +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 fix(e2e): move off the retired Playwright driver CDN 2026-09-22 16:38:00 +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.