5.5 KiB
5.5 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
0.2.0 - 2026-07-12
Added
- Contribution history store (SQLite) —
ContributionStorepersists each provider's daily counts invar/data/contributions.db;ContributionAggregatornow fetches only the window since each provider's last stored date (plus a 3-day trailing overlap for late corrections), merges the result into the store, and prunes rows older thanCONTRIBUTIONS_RETENTION_DAYS graph:contributions:refetchconsole command — forces a full or explicit-range re-fetch of contribution history, chunked into ≤365-day windows, for one, several, or all configured providers- Concurrent, non-blocking provider fetches —
ProviderInterface::fetch()split intostartFetch()/resolveFetch()so GitHub, GitLab, and Gitea requests are in flight simultaneously instead of one after another - Bounded fetch windows —
startFetch()/resolveFetch()accept optional$since/$untilbounds, used by both the incremental aggregator and the refetch command - PHPStan static analysis — level 8 over
src/andtests/, run viacomposer phpstan ContributionandContributionCollectiontyped entitiesCONTRIBUTIONS_RETENTION_DAYSenvironment variable
Changed
- Namespace renamed from
ApptoGitContributionGraphacross the codebase, Composer autoloading, and routing config - Removed the Guzzle and GraphQL client bundles — GitHub requests now go through Symfony's
HttpClientInterfacedirectly, the same as GitLab and Gitea - HTTP client requests are capped (10s connect/first-byte timeout, 15s max duration) so a slow provider can no longer stall the render path
docker-compose.ymlanddocker-compose.prod.ymlmount adatavolume for the SQLite store and pass throughCONTRIBUTIONS_RETENTION_DAYS- Dev Docker Compose override targets the
devbuild stage explicitly and mountsvendorread-write instead of as an anonymous volume
Fixed
ContributionCollection's variadic constructor now re-indexes its arguments witharray_values(), avoiding non-sequential keys that didn't match its declared property typeSvgRenderercoercesstrtotime()results tointbefore formatting datesdocker-compose.prod.ymlwas missing thedatavolume andCONTRIBUTIONS_RETENTION_DAYSenv var present indocker-compose.yml, so contribution history would not survive a container recreate on that deployment pathcomposer phpstanno longer crashes with an out-of-memory error under the default 128M limit
Documentation
- README and
CLAUDE.mdupdated to describe the SQLite store, incremental fetch, refetch command, and PHPStan setup; corrected several stale examples (test path,/healthsample response, Docker volume mounts) - Added PHPDoc to the remaining public methods across
src/
Tests
- Added tests for
ContributionStore,Contribution,ContributionCollection, andRefetchContributionsCommand - Extended provider and aggregator tests to cover
$since/$untilwindowing, concurrent-fetch failure modes, and store interactions
0.1.0 - 2026-05-30
Added
- FrankenPHP runtime — base image migrated from
php-clito FrankenPHP Alpine for better performance and built-in web server support - FrankenPHP worker mode — Symfony worker script (
public/worker.php) with request reuse and graceful reload - Caddy configuration —
docker/frankenphp/CaddyfileandCaddyfile.devfor production and development setups - Provider health probes —
ProviderInterfaceextended withping()andprobe()methods;ProbeTraitprovides the shared implementation - Per-provider status on
/health— the health endpoint now reportsok,degraded, ordownfor each configured provider (GitHub, GitLab, Gitea), along with an error code and latency - Supporting value objects —
ProviderStatus,ProviderStatusType,ProviderErrorCode, andProviderHealthCheckerservice ContributionAggregatorservice — contribution merging logic extracted fromGraphControllerinto a dedicated, testable service
Fixed
- Optional environment variables (
GITLAB_URL,ALLOWED_HOSTS, etc.) now have explicit empty default values indocker-compose.yml, preventing Docker Compose warnings on startup
Changed
SvgRendereris nowfinaland declaresstrict_types=1
Tests
- Unit tests added for
ProbeTrait,ProviderHealthChecker,ProviderStatus,ContributionAggregator, and all three provider probes (GitHubProvider,GitLabProvider,GiteaProvider) SvgRendererTestrefactored to follow project PHPUnit conventions (#[Test]attribute,it_prefix, Arrange/Act/Assert structure)
0.0.1 - 2025-01-01
Added
- Initial release — GitHub, GitLab, and Gitea contribution graph as a self-hosted SVG endpoint
- Light and dark theme support
- Filesystem cache with 1-hour TTL
- Docker multi-stage build (
base → deps → build → final) - Basic
/healthendpoint