Perkeep 0.12 "Toronto" Released: A Major Update with Tailscale Integration

Software Development

After a five-year development cycle, Perkeep 0.12 "Toronto" introduces significant advancements including built-in Tailscale support for secure peer-to-peer server operation, extensive Go language modernization, a complete migration to a modern JavaScript UI, enhanced age encryption, and unified cloud storage configurations, alongside numerous bug fixes and infrastructure improvements.

The Perkeep project announces the release of version 0.12, codenamed "Toronto," marking a significant milestone after its previous release five years ago. This major update introduces substantial advancements across various aspects of the platform, addressing a long period of development and modernization.

A key highlight of Perkeep 0.12 is the integrated Tailscale support, leveraging Tailscale's tsnet library. This integration allows perkeepd servers to operate as peers within a private tailnet, eliminating the need for a public server and utilizing Tailscale for authentication.

Key Improvements in Perkeep 0.12:

Core & Infrastructure

  • Go Modernization: The Go version has been upgraded through multiple stages, from 1.15 up to 1.25. Legacy io/ioutil has been replaced with modern io and os packages, and +build tags have been updated to //go:build.
  • System Cleanup: Obsolete components such as AppEngine, GCE deploy, GopherJS publisher support, the setup wizard, and the make system have been removed.
  • Asset Embedding: Adopted go:embed for embedding assets.
  • Website Hosting: Migrated Perkeep website hosting to Fly.io.

Dependencies & Build

  • Dependency Updates: Project dependencies have been comprehensively updated, adopting modern replacements like modernc.org/sqlite and modernc.org/kv.
  • Docker Builds: Docker builds are now smaller, faster, and Go module–based.
  • Network Access: ca-certificates added to importers to resolve network access issues.

CI / Tests / Lint

  • Expanded CI: Continuous Integration (CI) now extends to macOS and Windows.
  • Code Quality: Strict vet/lint/staticcheck passes have been introduced, and linter errors across packages resolved.
  • Test Enhancements: Unified test helpers using T.TempDir, T.Setenv, and T.Cleanup. Race detection has been enabled in devcam, and integration tests now run outside GOPATH with GOMOD awareness.

Storage, Encryption & Indexing

  • Encryption: Migrated to age encryption, with added fingerprint support in pk-put and perkeepd configurations, and permission checks for key files. Permanode signatures are now verified, and encryption race conditions, along with armored keyring handling, have been improved.
  • Storage: diskpacked, blobpacked, and blobserver backends have been cleaned up and unified. Documentation for B2, S3, and GCS configurations has been standardized with unified examples. The B2 backend migrated to AWS SDK, and far-future caching headers were added for blob responses. I/O errors on missing blobrefs are now prevented, and S3 query performance on startup has been optimized.
  • Indexing: Index consistency has been improved using sorted.KeyValue. Signatures on permanodes are now verified, with added tests for out-of-order indexing. The deprecated SQL index has been removed, and an untagged search predicate added.

Web UI & Frontend

  • Modern JavaScript Migration: The user interface has undergone a complete migration from goui to modern JavaScript, impacting components like downloadbutton, aboutdialog, SelectAllBtn, ImportShare, DirChildren, ShareItem, and mapquery. The old goui build system is deprecated, index.js reorganized for frontend routing, and obsolete UI code removed.
  • Frontend Enhancements: map.js updated to use tile.osm.org, OpenStreetMap geocoding API added, and curl API query examples provided.

Server, Network & Tailscale

  • Tailscale Integration: Tailscale tsnet integration has been added to auth, webserver, and serverinit.
  • Network Subsystem Cleanup: Deprecated network subsystems (CamliNetIP, camnetdns, gpgchallenge) have been removed.
  • HTTP Improvements: HTTP utilities now support responses larger than 8 MB, and HTTP timezone headers have been fixed. Server panics on missing modtime or time metadata are resolved.
  • API Calls: Importers can now skip paid API calls.

Filesystem & FUSE

  • FUSE Support: macOS FUSE support has been dropped.
  • Bug Fixes: Panics and file truncation bugs in FUSE have been fixed, cache isolation in tests improved, and I/O errors on missing blobs prevented.

Schema, Importers & GC

  • Schema Clarity: CamliType type introduced for schema clarity, simplifying schema parsing logic.
  • Importers & GC: Linter issues in importer and GC packages fixed, and an option to skip paid API calls in importers added.
  • Documentation: Comprehensive documentation of environment variables added.

Documentation, Examples & Miscellaneous

  • Documentation Updates: All environment variables and new storage configurations are now documented.
  • Schema Standardization: Schema blob size standardized to ≤ 1 MB.
  • Examples: B2 and cloud storage permission examples added, along with a curl query demo.
  • Code Cleanup: Typos fixed, unused code removed, and deprecated assertions cleaned up.

Bug Fixes

  • Addressed incorrect fmt.Errorf usage, slice initialization length, and file closing bugs.
  • Resolved image decoding crashes and encryption race conditions.
  • Fixed timezone and HTTP header inconsistencies.

This release represents a comprehensive overhaul and modernization of the Perkeep platform, ensuring improved performance, security, and developer experience.