-
released this
2025-12-04 19:37:37 +00:00 | 1 commits to main since this releaseWhat's New in v0.1.1
This release adds two major security and functionality features to Bovine Pages Server.
DNS TXT Record Verification for Custom Domains
A new optional security feature to prevent domain hijacking:
- Ownership Verification: Requires DNS TXT record to prove domain ownership before registering custom domains
- Security: SHA256 hash with constant-time comparison prevents timing attacks
- Format:
bovine-pages-verification=<SHA256_HASH>where hash = SHA256(owner/repository) - Configuration: Enable with
enableCustomDomainDNSVerification: true(disabled by default) - Backward Compatible: Existing domains continue working when disabled
- Helper Script:
examples/generate-dns-verification-hash.shfor generating hashes - Comprehensive Tests: Full test coverage for hash generation and DNS verification
Custom Domain Redirects
A powerful URL redirect system for custom domains:
- Simple Configuration:
.redirectsfile in repository root withFROM:TOformat - Easy Activation: Visit
/LOAD_REDIRECTSendpoint to activate redirects - Traefik Integration: Automatically creates Traefik
redirectregexmiddleware - Persistent Storage: Stores middleware configuration in Redis
- Security: Configurable
maxRedirectsparameter (default: 25) prevents resource exhaustion - Flexible Format: Supports comments (#) and empty lines
- Safe Regex: Automatic escaping of special characters
- Permanent Redirects: 301 status for all redirects
- Custom Domains Only: Works only on custom domains, not pages domain URLs
- Redis Required: Requires Redis cache for middleware storage
- User-Friendly: Beautiful HTML success/error pages with detailed instructions
- Well Tested: >90% test coverage for redirects module
Example: DNS Verification Setup
# 1. Generate verification hash ./examples/generate-dns-verification-hash.sh squarecows bovine-website # Output: 73bb8214899661e7f7900c77714586cc51702e6cf26a58c62e17fa9d88f3d3d3 # 2. Add DNS TXT record TXT bovine.squarecows.com bovine-pages-verification=73bb8214899661e7f7900c77714586cc51702e6cf26a58c62e17fa9d88f3d3d3 # 3. Add to .pages file enabled: true custom_domain: bovine.squarecows.com # 4. Visit pages URL to register https://squarecows.pages.example.com/bovine-websiteExample: Custom Domain Redirects Setup
# .redirects file in repository root # Redirect old blog to new location /old-blog:/blog /about-us:/about # Visit to activate https://yourdomain.com/LOAD_REDIRECTSBreaking Changes
None - both features are opt-in and backward compatible.
Configuration
DNS Verification (optional):
enableCustomDomainDNSVerification: true # default: falseRedirects (optional):
maxRedirects: 25 # default: 25, max redirects per domainFull Changelog
See CHANGELOG.md for complete details.
🤖 Generated with Claude Code
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
released this
2025-12-04 13:42:30 +00:00 | 8 commits to main since this releaseDocumentation Improvements
This release focuses on enhancing project documentation through comprehensive wiki updates.
Wiki Updates
- Cache Management Page: Created comprehensive guide for managing Redis/Valkey cache including key structures, manual cache management commands, and troubleshooting tips
- Quick Start Guide Enhancements: Improved getting started experience with clearer installation steps and configuration examples
- Custom Domains Documentation Updates: Enhanced custom domain setup documentation with detailed DNS verification flow for the upcoming 0.1.0 release
- Home Page Improvements: Restructured wiki home page for better navigation and accessibility
Notes
This is a documentation-only release with no code changes to the plugin itself. The wiki improvements provide better guidance for administrators and users deploying and managing the pages-server plugin.
Installation
No changes to installation process. Continue using v0.0.3 for production deployments.
📚 Generated with Claude Code
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
released this
2025-12-03 20:24:24 +00:00 | 10 commits to main since this releaseHighlights
This release adds directory listings functionality and improves custom domain management with several bug fixes.
New Features
Directory Index (Apache-style directory listings)
- Enable Apache-style directory listings for directories without index.html
- Configure per-repository with
directory_index: truein.pagesfile - Beautiful responsive HTML listing with file names, types, and sizes
- Color-coded icons for files and folders
- Parent directory navigation
- Mobile-responsive design
- Cached for 60 seconds for optimal performance
Cache Reaper Script
- Python script for automated cleanup of stale domain mappings
- Connects to Redis and validates domain mappings against Forgejo API
- Dry-run mode for safe testing
- Designed for cron scheduling (hourly, daily, etc.)
- Exit codes for monitoring and alerting
- Full documentation in
reaper/directory
Custom Domain Conflict Prevention
- Validates custom domain ownership during registration
- Prevents domain hijacking by checking existing mappings
- Allows re-registration for the same repository (updates mappings)
Bug Fixes
Reaper Script: Added missing
prioritykey to Traefik router cleanup- Now properly deletes all 6 Traefik router configuration keys
- Prevents orphaned keys from remaining in Redis
Custom Domain Reverse Mapping: Added persistent reverse mapping cache
- Caches both forward (
custom_domain:domain -> username:repository) and reverse (username:repository -> domain) mappings - Prevents custom domain resolution failures when forward mapping expires
- Both mappings use TTL=0 (persistent storage) for reliability
Documentation
- Comprehensive wiki documentation for directory listings feature
- Enhanced Quick Start guide with Traefik and Docker setup
- Added Redis/Valkey requirement documentation
- Architecture diagrams using Mermaid.js
- Rebranded to "Bovine Pages Server"
Installation
Add to your Traefik configuration:
experimental: plugins: pages-server: moduleName: code.squarecows.com/SquareCows/pages-server version: v0.0.8See the Quick Start Guide for complete setup instructions.
Full Changelog
See CHANGELOG.md for complete details.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
1 download
-
released this
2025-12-01 21:15:59 +00:00 | 18 commits to main since this releaseRelease v0.0.7
🎉 What's New
🔒 Password Protection
Protect your websites with secure password authentication:
- Add
password:field in.pagesfile with SHA256 hash - Automatic login page with beautiful gradient UI
- Secure HMAC-signed cookies (HttpOnly, Secure, SameSite=Strict)
- Configurable auth cookie duration (default: 1 hour)
- Password hash caching with 60-second TTL
- Per-repository authentication
🐛 Critical Bug Fixes
- CRITICAL: Traefik Router Expiration: Fixed bug where router configurations were expiring after 10 minutes
- Changed default
traefikRedisRouterTTLfrom 600 seconds to 0 (persistent) - Router configurations now persist until explicitly deleted
- Prevents custom domain sites from disappearing from Traefik
- External reaper process should clean up stale routers
- Changed default
📚 Documentation
- Moved CUSTOM_DOMAINS.md to wiki for better organization
- Added comprehensive password protection documentation to README and wiki
- Updated configuration examples with new auth parameters
📦 Installation
Update your Traefik configuration to use v0.0.7:
experimental: plugins: pages-server: moduleName: code.squarecows.com/SquareCows/pages-server version: v0.0.7🔗 Links
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Add
-
released this
2025-12-01 20:26:04 +00:00 | 25 commits to main since this releaseCritical Fixes
Redis Binary Data Corruption (CRITICAL)
Fixed a critical bug causing data corruption when reading large files from Redis cache:
- Changed
reader.Read()toio.ReadFull()in Redis RESP protocol bulk string reader reader.Read()doesn't guarantee reading all bytes at once, causing partial reads for large files- This caused CSS/JS files to be corrupted when served from Redis cache
- Resulted in Subresource Integrity (SRI) hash mismatches and broken styling
- Files are now read completely and correctly from Redis cache
- Action Required: Clear your Redis cache after updating to remove corrupted data
SVG File Corruption
Fixed "Char 0x0 out of allowed range" errors when serving SVG files:
- Replaced custom base64 decoder with Go's standard library
encoding/base64 - Removed buggy custom
base64Decodeandbase64DecodedLenfunctions - Fixes corruption issues with binary files (SVGs, images, fonts)
- Standard library decoder is more robust and well-tested
New Features
Directory Index Support
Automatic
index.htmldetection for directory URLs:- Accessing
/pricing/now automatically tries/pricing/index.html - Enables clean URLs without file extensions
- Only applies to paths without file extensions (directories)
- Falls back to 404 if neither the directory nor
index.htmlexists - Standard web server behavior for improved user experience
Persistent Custom Domain Storage
Custom domain mappings now stored without TTL:
- Changed customDomainCache initialization to use TTL=0 (persistent storage)
- Modified
SetWithTTL()to useSETcommand instead ofSETEXwhen TTL=0 - Modified
MemoryCacheto useexpiration=-1for never-expiring items - Enables external reaper scripts to validate and clean up domains via cron
- Domain mappings persist until explicitly deleted
- No impact on file content cache (still uses configured TTL)
HTTP Response Headers
Added server identification and cache status headers:
- Added
Server: bovineheader to all responses (content and error pages) - Added
X-Cache-Status: HITheader when serving content from cache - Added
X-Cache-Status: MISSheader when fetching content from Forgejo API - Enables monitoring and debugging of cache behavior
Upgrade Instructions
- Update the plugin version in your Traefik configuration to
v0.0.6 - IMPORTANT: Clear your Redis cache to remove corrupted data:
redis-cli FLUSHDB - Restart Traefik to load the updated plugin
- Verify the site loads correctly with proper CSS/JS
Full Changelog
See CHANGELOG.md for complete details.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Changed
-
released this
2025-11-29 13:09:50 +00:00 | 33 commits to main since this releaseRelease v0.0.5
Documentation-only release that corrects router configuration examples in README.md to match the actual implementation.
🔧 Fixed
Router Configuration Documentation
- Removed incorrect
tls.certResolverfrompages-custom-domains-httpsrouter example- The catch-all router should NOT have a certResolver
- Individual domains get their own routers dynamically created in Redis with proper SSL configuration
- Updated custom domain setup instructions:
- Added step 3: Configure Traefik static config with Redis provider
- Clarified that plugin writes router configurations to Redis
- Explained that Traefik Redis provider loads routers and requests SSL certificates automatically
- Fixed configuration examples to match actual implementation behavior
📚 Documentation
- Updated custom domain setup with Redis provider configuration requirement
- Clarified catch-all router behavior vs. individual Redis routers
- Added explanatory comments to router configuration examples
📝 Note
This is a documentation-only release. No code changes from v0.0.4. The configuration examples in the README were incorrect and could cause confusion. This release corrects those examples to match how the Redis router integration actually works.
See CHANGELOG.md for full details.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Removed incorrect
-
released this
2025-11-29 13:04:36 +00:00 | 35 commits to main since this releaseRelease v0.0.4
Major improvements for automatic SSL certificate generation and custom domain support.
🔧 Fixed
ACME Challenge Passthrough
- Critical fix: Middleware was redirecting ACME HTTP challenges to HTTPS, preventing SSL certificate generation
- Added automatic detection of
/.well-known/acme-challenge/*paths - ACME challenges now pass through to Traefik's handler before HTTPS redirect
- Enables Let's Encrypt to validate custom domains and generate SSL certificates
- No configuration changes required - works automatically
Redis Router Registration
- Fixed service reference: Changed from
pages-nooptonoop@internal(Traefik's built-in service) - Fixed middleware reference: Changed from
pages-servertopages-server@file(fully qualified name) - Eliminates "service does not exist" and "middleware does not exist" errors in Traefik dashboard
- No external service configuration required
Router Configuration
- Split HTTP (
web) and HTTPS (websecure) routers properly - Removed incorrect pattern where both entrypoints were on same router with TLS
- Updated
examples/traefik-config.ymlwith correct 3-router pattern
📚 Documentation
- Added comprehensive "Traefik Redis Provider Integration" section to README.md
- Added ACME Challenge Handling section explaining automatic passthrough
- Added troubleshooting section for SSL certificate generation issues
- Created IMPLEMENTATION_SUMMARY.md documenting the Traefik Redis provider implementation
- Updated all configuration examples with proper router structure
🚀 Impact
- Custom Domains: SSL certificates now generate correctly for custom domains
- Deployment: Existing deployments must update router configuration to split HTTP/HTTPS
- Security: HTTPS redirect still works for all non-ACME requests
See CHANGELOG.md for full details.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
released this
2025-11-29 00:14:38 +00:00 | 41 commits to main since this releaseRelease v0.0.3 - Custom Domain Support
This release adds full custom domain support with a scalable, registration-based approach.
Key Features
Custom Domain Support
- ✅ Users can specify custom domains in
.pagesfile - ✅ Registration-based activation (visit pages URL to activate)
- ✅ Automatic SSL certificate provisioning via Traefik
- ✅ Cache-only lookups for infinite scalability
Performance
- Infinite scalability: Performance independent of user/repository count
- Fast all requests: <5ms response time with cache-only lookups
- Efficient caching: Only active custom domains consume cache space
Configuration
enableCustomDomains(bool, default: true) - Enable/disable custom domainscustomDomainCacheTTL(int, default: 600) - Cache TTL in seconds
How Custom Domains Work
- Add
custom_domain: www.example.comto repository's.pagesfile - Visit
https://username.pages.domain.com/repositoryto activate - Configure DNS (A or CNAME record) pointing to Traefik server
- Access site at
https://www.example.com
What's Changed
Added
registerCustomDomainmethod for automatic domain registrationresolveCustomDomainmethod with cache-only lookupparseCustomDomainPathmethod for custom domain URL parsing- Comprehensive test suite in
custom_domain_test.go CUSTOM_DOMAINS.mdtechnical documentation- Configuration options:
enableCustomDomains,customDomainCacheTTL
Changed
ServeHTTPautomatically registers custom domains when serving pages- Custom domains require activation via pages URL visit
- Enhanced Traefik router examples with priority-based routing
Improved
- Test coverage: 78.2% (up from 74.9%)
- Simplified architecture: Registration-based approach
- Better UX: Clear activation steps and helpful error messages
Installation
experimental: plugins: pages-server: moduleName: code.squarecows.com/SquareCows/pages-server version: v0.0.3Documentation
- README.md - Installation and usage
- CUSTOM_DOMAINS.md - Custom domain technical details
- CHANGELOG.md - Complete changelog
Full Changelog: https://code.squarecows.com/SquareCows/pages-server/compare/v0.0.2...v0.0.3
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- ✅ Users can specify custom domains in
-
released this
2025-11-27 22:57:48 +00:00 | 42 commits to main since this releaseVersion 0.0.2 Release
This release adds GPLv3 licensing and simplifies the plugin architecture by removing external dependencies and letting Traefik handle what it does best.
🎉 Added
- GPLv3 License with full compliance
- Complete GPLv3 license text in LICENSE file
- License headers on all Go source files
- License headers on YAML configuration files
- Copyright (C) 2025 SquareCows
🗑️ Removed
-
Cloudflare DNS management - Users now manually configure DNS with any DNS provider
- Removed
cloudflareAPIKeyandcloudflareZoneIDconfiguration - Removed
cloudflare_dns.goandcloudflare_dns_test.go - More flexible: works with any DNS provider (Cloudflare, Route53, etc.)
- Removed
-
Let's Encrypt certificate management - Traefik handles all SSL certificates
- Removed
letsEncryptEndpointandletsEncryptEmailconfiguration - Removed
cert_manager.goandcert_manager_test.go - Clearer separation: plugin serves files, Traefik manages SSL
- Removed
🔧 Changed
- Simplified configuration - Only 2 required parameters:
pagesDomain- Base domain for pagesforgejoHost- Forgejo instance URL
- Updated module path from
github.com/SquareCows/pages-servertocode.squarecows.com/SquareCows/pages-server - Custom domains require manual DNS A/CNAME record creation
📈 Improved
- Test coverage increased from 56.3% to 74.9%
- Reduced codebase by 741 lines
- Clearer architecture - plugin focuses on serving static files
- More flexible DNS - works with any DNS provider
📚 Documentation
All documentation updated to reflect new architecture and DNS approach.
🔗 Links
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- GPLv3 License with full compliance