Perkeep 0.12 "Toronto" Released: A Major Update with Tailscale Integration
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/ioutilhas been replaced with modernioandospackages, and+buildtags 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:embedfor 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/sqliteandmodernc.org/kv. - Docker Builds: Docker builds are now smaller, faster, and Go module–based.
- Network Access:
ca-certificatesadded 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/staticcheckpasses have been introduced, and linter errors across packages resolved. - Test Enhancements: Unified test helpers using
T.TempDir,T.Setenv, andT.Cleanup. Race detection has been enabled indevcam, and integration tests now run outsideGOPATHwithGOMODawareness.
Storage, Encryption & Indexing
- Encryption: Migrated to
ageencryption, with added fingerprint support inpk-putandperkeepdconfigurations, 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, andblobserverbackends 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 anuntaggedsearch predicate added.
Web UI & Frontend
- Modern JavaScript Migration: The user interface has undergone a complete migration from
gouito modern JavaScript, impacting components likedownloadbutton,aboutdialog,SelectAllBtn,ImportShare,DirChildren,ShareItem, andmapquery. The oldgouibuild system is deprecated,index.jsreorganized for frontend routing, and obsolete UI code removed. - Frontend Enhancements:
map.jsupdated to usetile.osm.org, OpenStreetMap geocoding API added, and curl API query examples provided.
Server, Network & Tailscale
- Tailscale Integration:
Tailscale tsnetintegration has been added toauth,webserver, andserverinit. - 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
modtimeor 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:
CamliTypetype 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.Errorfusage, 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.