Compare commits
161 Commits
00c390bb2c
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 3e916b6cc1 | |||
| f252675a4a | |||
| 6292cb906c | |||
| 92da8f11be | |||
| 520c16380a | |||
| 8244c06cdf | |||
| abe2d2e78b | |||
| f2bbd334e4 | |||
| 1bff328f14 | |||
| 00d876b746 | |||
| c5abef6fa4 | |||
| 22214fb343 | |||
| 27618dc85b | |||
| 5ca38a6f5e | |||
| 653ede6f94 | |||
| de09cc7c6d | |||
| 04a712adef | |||
| f903fb727f | |||
| 781f863035 | |||
| fba63149d2 | |||
| 43459f28e6 | |||
| 643275a76a | |||
| 81be075784 | |||
| 21c88ee69f | |||
| ba2630834a | |||
| 86c8066157 | |||
| 43fa941e20 | |||
| c3e1caa17f | |||
| fee8c4a1dd | |||
| 58fb14bbcf | |||
| f69c94c804 | |||
| c22527f460 | |||
| f1de48a76c | |||
| fadd931586 | |||
| acc703a984 | |||
| 1c8c3e093c | |||
| 2273ff45c4 | |||
| 4e73a1ee9d | |||
| 67ef8acff3 | |||
| 0b191474ff | |||
| a62123a500 | |||
| c429f76116 | |||
| 309e72c8eb | |||
| c6281c93da | |||
| 6de1702933 | |||
| b7239ed050 | |||
| cf7bc7c8e9 | |||
| 9bb73a4516 | |||
| 83b37b316e | |||
| bccd0a42f8 | |||
| eddbce471c | |||
| a8c746e23e | |||
| 6fcdaa9f84 | |||
| 95646eb281 | |||
| 643a739acd | |||
| 024ba6d4a0 | |||
| c9f67eb55f | |||
| a4074fbdb7 | |||
| 028f0d607d | |||
| 9d5dbde395 | |||
| 235c2dab07 | |||
| c3738ac5d8 | |||
| 5b379e7954 | |||
| 3183ffdd4a | |||
| 76beb87f66 | |||
| a7dde48495 | |||
| 19bf36884e | |||
| 0077b5baac | |||
| b3a34476fe | |||
| fd16775b92 | |||
| 961ce258c4 | |||
| 5cd032790b | |||
| f4db0fafd1 | |||
| 02fbccfc43 | |||
| d55911b394 | |||
| c5cf6c3ebd | |||
| d7133c489c | |||
| a1f28e4cf1 | |||
| 4ed998b8d2 | |||
| 46b438854f | |||
| c1538e1065 | |||
| 32c4615cad | |||
| b1f1b48016 | |||
| 6fd3d9ece5 | |||
| 49f72c40b7 | |||
| 22b5d3bde7 | |||
| f24cbd4776 | |||
| 283b39e256 | |||
| 56583e4aa9 | |||
| 5db536c39c | |||
| c12e7ccac5 | |||
| be5e64fa15 | |||
| 93e9b4caa2 | |||
| 664f7c9f80 | |||
| a18fa1bb00 | |||
| 9eeb58a220 | |||
| e4810ba500 | |||
| c0263c871e | |||
| 9eb2a1d10c | |||
| 361b560419 | |||
| 85273361bb | |||
| 97f837b6c7 | |||
| 255bcfb5b2 | |||
| 43063615fb | |||
| a79dab90a6 | |||
| 4dad5e1da9 | |||
| 458a75d64f | |||
| bdac4bcc87 | |||
| 74b46e6339 | |||
| dedb21a8ab | |||
| 2dfa5630a6 | |||
| 73df9f9996 | |||
| ec35f4a6e8 | |||
| 019bca256f | |||
| e628dcf56f | |||
| 03cab4d78b | |||
| 1d6206797a | |||
| 4be0b519ea | |||
| deaba2eef0 | |||
| 08f738ecda | |||
| 47b86c7752 | |||
| 7f2c180a6a | |||
| bebd96cf6d | |||
| b73f851415 | |||
| a9f0c8a660 | |||
| 6cd7495f7e | |||
| 189050adaf | |||
| 189a392e4a | |||
| 29d0f3522f | |||
| c3b3d93dc9 | |||
| 2439b8741d | |||
| 2fed2790c1 | |||
| d445a06a80 | |||
| 789c4e78f9 | |||
| d10716aec0 | |||
| df1a8c8a89 | |||
| 85400e53e5 | |||
| 044cb1e45c | |||
| 143c08f788 | |||
| 32586430af | |||
| 6d9ffd4890 | |||
| fbb26a7539 | |||
| 8e72d6f94b | |||
| decd10108c | |||
| f60338e6e2 | |||
| 005a91da1c | |||
| 0c5e38a18b | |||
| ff667eb362 | |||
| 7307fa34fd | |||
| 85605a1905 | |||
| 8c2967c9e3 | |||
| ba6ac7052a | |||
| 5f0a420ea5 | |||
| 2d454188cc | |||
| c437e195e9 | |||
| ac8596f8b3 | |||
| 23ad1e6f0b | |||
| 86007209e8 | |||
| f05fb7540a | |||
| bdade0a4e8 | |||
| 57a0950bf2 |
@@ -1,126 +1,120 @@
|
||||
# 🛡️ Patrick Beane
|
||||
# Patrick Beane
|
||||
|
||||
**SRE | Security Engineer | Self-Hosted Infra & Detection**
|
||||
**Infrastructure & Security Engineer | SRE | Cloud-Native Platforms**
|
||||
|
||||
I design and operate **security-first, self-hosted infrastructure** focused on detection, resilience, and sovereignty.
|
||||
My lab functions as a live production environment where threat intelligence, automation, and reliability engineering intersect.
|
||||
I design and operate a self-directed production infrastructure platform focused on security automation, reliability engineering, observability, vulnerability management, and recoverability.
|
||||
|
||||
The environment spans Kubernetes, Linux, multi-cloud infrastructure, identity controls, threat detection, backup verification, and public operational dashboards. My goal is to build systems that are secure-by-default, observable in production, and recoverable under failure.
|
||||
|
||||
---
|
||||
|
||||
## 🛰 The Fleet (10 Nodes)
|
||||
## Production Infrastructure Overview
|
||||
|
||||
> This environment blends production, research, and continuous experimentation.
|
||||
> Availability and controls are intentionally tuned per node role.
|
||||
This environment blends production operations, security research, and continuous infrastructure improvement. Services are distributed across cloud and self-hosted nodes, with each node scoped to a specific operational role to reduce blast radius and simplify ownership.
|
||||
|
||||
| Node | Role | Specs | Status |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| **Argus** | SIEM / Brain / node-health Failover | Xeon E5-2660v2 (1 core) | 🟢 Online |
|
||||
| **Triton** | High Performance Compute | EPYC 9634 (8 cores) | 🟢 Online |
|
||||
| **Ares** | Gitea / Kubernetes Management Node (MicroK8s) | Ryzen 9 9950X (8 cores) | 🟢 Online |
|
||||
| **Zephyrus** | Container Host | Ryzen 9 7950X (4 cores) | 🟢 Online |
|
||||
| **Iris** | NGINX / PHP Edge | Vultr | 🟢 Online |
|
||||
| **Vault** | Secrets Management | GCP (Vaultwarden) | 🟢 Online |
|
||||
| **Apollo** | Intel Dashboard (Flask) | AWS | 🟢 Online |
|
||||
| **Hermes** | Public API (Frontend) | Oracle Cloud | 🟢 Online |
|
||||
| **Hades** | Public API (Backend) | Oracle Cloud | 🟢 Online |
|
||||
| **Zeus** | Monitoring / Metrics NOC | Xeon Gold 6150 (1 core) | 🟢 Online |
|
||||
| Node | Primary Role | Function |
|
||||
| :--- | :--- | :--- |
|
||||
| **Argus** | Security telemetry and failover automation | Threat detection, event correlation, and node-health automation |
|
||||
| **Triton** | Observability and internal tooling | Prometheus, Grafana, Authelia, code-server, CrowdSec bouncers |
|
||||
| **Ares** | Kubernetes and source control | Gitea, PostgreSQL, Valkey, CI runners, Kubernetes control plane |
|
||||
| **Zephyrus** | Container hosting | Docker workloads and service hosting |
|
||||
| **Iris** | Edge services | NGINX/PHP ingress and public-facing services |
|
||||
| **Vault** | Secrets and identity-adjacent services | Vaultwarden and protected internal services |
|
||||
| **Apollo** | Threat intelligence dashboard | Flask-based analytics and reporting |
|
||||
| **Hermes** | Public API frontend | Public API and frontend service layer |
|
||||
| **Hades** | Public API backend | Backend service support for public APIs |
|
||||
| **Zeus** | Monitoring and metrics | Centralized observability and service-health tracking |
|
||||
|
||||
---
|
||||
|
||||
## 🌐 Infrastructure Strategy
|
||||
## Infrastructure Strategy
|
||||
|
||||
- **Compute Layer:** Zen 5 (9950X), Zen 4 (7950X), EPYC 9634 for sustained workloads.
|
||||
- **Edge Layer:** Oracle Cloud & Vultr for low-latency public ingress.
|
||||
- **Sentinel Layer:** **Argus SIEM** correlating telemetry and enforcing distributed decisions across nodes.
|
||||
- **Observability:** Zeus as the centralized NOC and metrics authority.
|
||||
- **Compute layer:** Heterogeneous self-hosted and cloud infrastructure scoped by workload type
|
||||
- **Edge layer:** Cloud and VPS ingress for public services and low-latency routing
|
||||
- **Security telemetry:** Multi-node detection and mitigation workflows using CrowdSec and custom automation
|
||||
- **Observability:** Centralized monitoring with Prometheus, Grafana, Netdata, exporters, and public dashboards
|
||||
- **Resilience:** Automated health checks, DNS failover, backup verification, and role-scoped service design
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ Detection & Response Lifecycle
|
||||
## Security Detection and Response
|
||||
|
||||
- **Triage:** Telemetry ingested from 7 active nodes into the Argus engine.
|
||||
- **Escalation:** Post-exploitation indicators (e.g. webshells) trigger immediate `PERM_BAN`.
|
||||
- **Retention:**
|
||||
- 24 hours for lower confidence scenarios
|
||||
- 14 days for high-confidence IOCs
|
||||
- 7 days for offender watchlist
|
||||
- **Notification:** High-severity events dynamically pushed to Discord.
|
||||
Security controls are integrated directly into the platform rather than handled as one-off manual checks.
|
||||
|
||||
Current detection and response patterns include:
|
||||
|
||||
- Telemetry ingestion from 7 active nodes
|
||||
- CrowdSec-based detection and mitigation
|
||||
- MITRE ATT&CK mapping for selected security events
|
||||
- Escalation logic for high-confidence indicators
|
||||
- Watchlist and retention policies based on event confidence
|
||||
- High-severity event notifications through Discord
|
||||
- Runtime visibility through public and private dashboards
|
||||
|
||||
---
|
||||
|
||||
## 🛠 The Arsenal
|
||||
## Technical Stack
|
||||
|
||||
**Languages:** Python (Flask, Gunicorn), Bash, JavaScript (React, Node.js)
|
||||
**Infrastructure:** Kubernetes (K8s), Docker, Caddy, NGINX
|
||||
**Security:** Argus (Custom SIEM), CrowdSec, Trivy, SQLite, Vaultwarden
|
||||
**Observability:** Prometheus, Blackbox Exporter, Node Exporter
|
||||
**Backups:** Borgmatic, Rsync.net (Encrypted Offsite)
|
||||
**Languages:** Python, Bash, JavaScript, React, Node.js
|
||||
**Infrastructure:** Kubernetes, Docker, Caddy, NGINX, Linux
|
||||
**Security:** CrowdSec, Trivy, Authelia, OIDC, MFA, Fail2Ban, Vaultwarden
|
||||
**Cloud and Networking:** AWS, GCP, Oracle Cloud, Vultr, Cloudflare, DNS automation
|
||||
**Observability:** Prometheus, Grafana, Netdata, Blackbox Exporter, Node Exporter, cAdvisor
|
||||
**Backups:** Borgmatic, encrypted offsite backups, restore verification
|
||||
**CI/CD and Source Control:** Git, GitHub Actions, Gitea, container image scanning
|
||||
**Infrastructure as Code:** Terraform
|
||||
|
||||
---
|
||||
|
||||
### 🧠 Supporting Tooling & Concepts
|
||||
## Operational Metrics
|
||||
|
||||
Actively used across this environment or in adjacent projects:
|
||||
|
||||
- **Security & Identity:** Fail2Ban, MITRE ATT&CK mapping, OIDC, Authelia, MFA, TLS hardening
|
||||
- **Infrastructure & Cloud:** Linux (Debian/Ubuntu), Terraform, AWS, GCP, Oracle Cloud, Vultr
|
||||
- **CI / Ops:** Git, GitHub Actions, container image scanning
|
||||
- **Observability (Extended):** Grafana, Netdata
|
||||
Current platform highlights:
|
||||
|
||||
- 10-node distributed infrastructure environment
|
||||
- 7-node security telemetry and detection footprint
|
||||
- `144386` lines of custom code across infrastructure, security, and automation projects
|
||||
- `1578` commits since January 1 across active repositories
|
||||
- Automated failover between AWS and peer infrastructure
|
||||
- Public dashboards for uptime, vulnerabilities, backups, threat telemetry, and service health
|
||||
- Multiple daily encrypted Borgmatic snapshots shipped offsite
|
||||
- Recurring backup verification and restore-oriented operational workflows
|
||||
- Nightly metrics refresh via Gitea Actions and `tokei`
|
||||
|
||||
---
|
||||
|
||||
## ⚡ Efficiency Metrics
|
||||
|
||||
- **Codebase Growth:** `47495` lines of custom code across all our repositories
|
||||
- **Commit Velocity:** `964` commits since Jan 1
|
||||
- **Ares:** Ryzen 9 9950X sustaining ~0.06 load avg while running Gitea and a Kubernetes control plane
|
||||
- **Resilience:** Automated failover between AWS and peer nodes
|
||||
|
||||
## 📈 Activity
|
||||
## Activity
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
### 🧩 Deployment Patterns
|
||||
- **Reverse Proxy:** Caddy/NGINX (Cloudflare where applicable)
|
||||
- **Observability:** Prometheus + Node Exporter + cAdvisor
|
||||
- **Lifecycle:** Watchtower for controlled auto-updates
|
||||
- **Access Control:** Authelia where exposed
|
||||
- **Management:** Portainer (loopback-bound where possible)
|
||||
## Deployment Patterns
|
||||
|
||||
> Nodes are intentionally heterogeneous.
|
||||
> Each host is scoped to its role to reduce blast radius and cognitive load.
|
||||
- **Reverse proxy:** Caddy and NGINX, with Cloudflare where applicable
|
||||
- **Observability:** Prometheus, Grafana, Node Exporter, Blackbox Exporter, cAdvisor, Netdata
|
||||
- **Access control:** Authelia, OIDC, MFA, TLS hardening, and protected reverse-proxy routes
|
||||
- **Lifecycle management:** Controlled container updates and service monitoring
|
||||
- **Service isolation:** Nodes scoped by role to reduce blast radius and simplify recovery
|
||||
- **Backup strategy:** Encrypted offsite backups with recurring verification
|
||||
|
||||
---
|
||||
|
||||
#### 📍 Triton
|
||||
Primary high-density services node running:
|
||||
- Prometheus + Grafana
|
||||
- Code-server
|
||||
- Authelia
|
||||
- Trilium
|
||||
- CrowdSec bouncers
|
||||
## Selected Public Projects
|
||||
|
||||
Optimized for sustained workloads and observability aggregation.
|
||||
- **Portfolio:** [beane.me](https://beane.me)
|
||||
- **Threat Decisions and Telemetry:** [threats.beane.me](https://threats.beane.me)
|
||||
- **Threat Intelligence and Analytics:** [intel.beane.me](https://intel.beane.me)
|
||||
- **Vulnerability Scanning and Trends:** [vuln.beane.me](https://vuln.beane.me)
|
||||
- **Backup and Restore Verification:** [backups.beane.me](https://backups.beane.me)
|
||||
- **Threat Decision Observability:** [observe.beane.me](https://observe.beane.me)
|
||||
- **Health and Failover Dashboard:** [health.beane.me](https://health.beane.me)
|
||||
- **Source Control:** [git.beane.me](https://git.beane.me)
|
||||
- **Terraform Threat Modeling:** [tfstride.beane.me](https://tfstride.beane.me)
|
||||
|
||||
---
|
||||
|
||||
### 🔗 Live Projects
|
||||
- **Threat Decisions & Telemetry:** `threats.beane.me`
|
||||
- **Threat Intelligence & Analytics:** `intel.beane.me`
|
||||
- **Vulnerability Scanning (Trivy):** `vuln.beane.me`
|
||||
- **Backups & Restore Verification:** `backups.beane.me`
|
||||
- **Threat Decision Observability:** `observe.beane.me`
|
||||
- **Source Control (Gitea + K8s):** `git.beane.me`
|
||||
## Engineering Philosophy
|
||||
|
||||
---
|
||||
Production systems should be observable, automated, recoverable, and secure from the start.
|
||||
|
||||
## 🚜 Resource Management
|
||||
|
||||
- **Compute Density:** Kubernetes control plane with Postgres and CI workloads on Zen 5 hardware
|
||||
- **Sovereignty:** All code, telemetry, and backups remain self-hosted
|
||||
- **Backups:** Multiple daily encrypted Borgmatic snapshots shipped offsite
|
||||
|
||||
> *"If it's not blocked, it just hasn't found our infrastructure yet."*
|
||||
I focus on infrastructure that explains itself: clear telemetry, deterministic automation, evidence-backed security findings, documented recovery paths, and controls that improve reliability without slowing delivery.
|
||||
|
||||
+78
-84
@@ -1,126 +1,120 @@
|
||||
# 🛡️ Patrick Beane
|
||||
# Patrick Beane
|
||||
|
||||
**SRE | Security Engineer | Self-Hosted Infra & Detection**
|
||||
**Infrastructure & Security Engineer | SRE | Cloud-Native Platforms**
|
||||
|
||||
I design and operate **security-first, self-hosted infrastructure** focused on detection, resilience, and sovereignty.
|
||||
My lab functions as a live production environment where threat intelligence, automation, and reliability engineering intersect.
|
||||
I design and operate a self-directed production infrastructure platform focused on security automation, reliability engineering, observability, vulnerability management, and recoverability.
|
||||
|
||||
The environment spans Kubernetes, Linux, multi-cloud infrastructure, identity controls, threat detection, backup verification, and public operational dashboards. My goal is to build systems that are secure-by-default, observable in production, and recoverable under failure.
|
||||
|
||||
---
|
||||
|
||||
## 🛰 The Fleet (10 Nodes)
|
||||
## Production Infrastructure Overview
|
||||
|
||||
> This environment blends production, research, and continuous experimentation.
|
||||
> Availability and controls are intentionally tuned per node role.
|
||||
This environment blends production operations, security research, and continuous infrastructure improvement. Services are distributed across cloud and self-hosted nodes, with each node scoped to a specific operational role to reduce blast radius and simplify ownership.
|
||||
|
||||
| Node | Role | Specs | Status |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| **Argus** | SIEM / Brain / node-health Failover | Xeon E5-2660v2 (1 core) | 🟢 Online |
|
||||
| **Triton** | High Performance Compute | EPYC 9634 (8 cores) | 🟢 Online |
|
||||
| **Ares** | Gitea / Kubernetes Management Node (MicroK8s) | Ryzen 9 9950X (8 cores) | 🟢 Online |
|
||||
| **Zephyrus** | Container Host | Ryzen 9 7950X (4 cores) | 🟢 Online |
|
||||
| **Iris** | NGINX / PHP Edge | Vultr | 🟢 Online |
|
||||
| **Vault** | Secrets Management | GCP (Vaultwarden) | 🟢 Online |
|
||||
| **Apollo** | Intel Dashboard (Flask) | AWS | 🟢 Online |
|
||||
| **Hermes** | Public API (Frontend) | Oracle Cloud | 🟢 Online |
|
||||
| **Hades** | Public API (Backend) | Oracle Cloud | 🟢 Online |
|
||||
| **Zeus** | Monitoring / Metrics NOC | Xeon Gold 6150 (1 core) | 🟢 Online |
|
||||
| Node | Primary Role | Function |
|
||||
| :--- | :--- | :--- |
|
||||
| **Argus** | Security telemetry and failover automation | Threat detection, event correlation, and node-health automation |
|
||||
| **Triton** | Observability and internal tooling | Prometheus, Grafana, Authelia, code-server, CrowdSec bouncers |
|
||||
| **Ares** | Kubernetes and source control | Gitea, PostgreSQL, Valkey, CI runners, Kubernetes control plane |
|
||||
| **Zephyrus** | Container hosting | Docker workloads and service hosting |
|
||||
| **Iris** | Edge services | NGINX/PHP ingress and public-facing services |
|
||||
| **Vault** | Secrets and identity-adjacent services | Vaultwarden and protected internal services |
|
||||
| **Apollo** | Threat intelligence dashboard | Flask-based analytics and reporting |
|
||||
| **Hermes** | Public API frontend | Public API and frontend service layer |
|
||||
| **Hades** | Public API backend | Backend service support for public APIs |
|
||||
| **Zeus** | Monitoring and metrics | Centralized observability and service-health tracking |
|
||||
|
||||
---
|
||||
|
||||
## 🌐 Infrastructure Strategy
|
||||
## Infrastructure Strategy
|
||||
|
||||
- **Compute Layer:** Zen 5 (9950X), Zen 4 (7950X), EPYC 9634 for sustained workloads.
|
||||
- **Edge Layer:** Oracle Cloud & Vultr for low-latency public ingress.
|
||||
- **Sentinel Layer:** **Argus SIEM** correlating telemetry and enforcing distributed decisions across nodes.
|
||||
- **Observability:** Zeus as the centralized NOC and metrics authority.
|
||||
- **Compute layer:** Heterogeneous self-hosted and cloud infrastructure scoped by workload type
|
||||
- **Edge layer:** Cloud and VPS ingress for public services and low-latency routing
|
||||
- **Security telemetry:** Multi-node detection and mitigation workflows using CrowdSec and custom automation
|
||||
- **Observability:** Centralized monitoring with Prometheus, Grafana, Netdata, exporters, and public dashboards
|
||||
- **Resilience:** Automated health checks, DNS failover, backup verification, and role-scoped service design
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ Detection & Response Lifecycle
|
||||
## Security Detection and Response
|
||||
|
||||
- **Triage:** Telemetry ingested from 7 active nodes into the Argus engine.
|
||||
- **Escalation:** Post-exploitation indicators (e.g. webshells) trigger immediate `PERM_BAN`.
|
||||
- **Retention:**
|
||||
- 24 hours for lower confidence scenarios
|
||||
- 14 days for high-confidence IOCs
|
||||
- 7 days for offender watchlist
|
||||
- **Notification:** High-severity events dynamically pushed to Discord.
|
||||
Security controls are integrated directly into the platform rather than handled as one-off manual checks.
|
||||
|
||||
Current detection and response patterns include:
|
||||
|
||||
- Telemetry ingestion from 7 active nodes
|
||||
- CrowdSec-based detection and mitigation
|
||||
- MITRE ATT&CK mapping for selected security events
|
||||
- Escalation logic for high-confidence indicators
|
||||
- Watchlist and retention policies based on event confidence
|
||||
- High-severity event notifications through Discord
|
||||
- Runtime visibility through public and private dashboards
|
||||
|
||||
---
|
||||
|
||||
## 🛠 The Arsenal
|
||||
## Technical Stack
|
||||
|
||||
**Languages:** Python (Flask, Gunicorn), Bash, JavaScript (React, Node.js)
|
||||
**Infrastructure:** Kubernetes (K8s), Docker, Caddy, NGINX
|
||||
**Security:** Argus (Custom SIEM), CrowdSec, Trivy, SQLite, Vaultwarden
|
||||
**Observability:** Prometheus, Blackbox Exporter, Node Exporter
|
||||
**Backups:** Borgmatic, Rsync.net (Encrypted Offsite)
|
||||
**Languages:** Python, Bash, JavaScript, React, Node.js
|
||||
**Infrastructure:** Kubernetes, Docker, Caddy, NGINX, Linux
|
||||
**Security:** CrowdSec, Trivy, Authelia, OIDC, MFA, Fail2Ban, Vaultwarden
|
||||
**Cloud and Networking:** AWS, GCP, Oracle Cloud, Vultr, Cloudflare, DNS automation
|
||||
**Observability:** Prometheus, Grafana, Netdata, Blackbox Exporter, Node Exporter, cAdvisor
|
||||
**Backups:** Borgmatic, encrypted offsite backups, restore verification
|
||||
**CI/CD and Source Control:** Git, GitHub Actions, Gitea, container image scanning
|
||||
**Infrastructure as Code:** Terraform
|
||||
|
||||
---
|
||||
|
||||
### 🧠 Supporting Tooling & Concepts
|
||||
## Operational Metrics
|
||||
|
||||
Actively used across this environment or in adjacent projects:
|
||||
|
||||
- **Security & Identity:** Fail2Ban, MITRE ATT&CK mapping, OIDC, Authelia, MFA, TLS hardening
|
||||
- **Infrastructure & Cloud:** Linux (Debian/Ubuntu), Terraform, AWS, GCP, Oracle Cloud, Vultr
|
||||
- **CI / Ops:** Git, GitHub Actions, container image scanning
|
||||
- **Observability (Extended):** Grafana, Netdata
|
||||
Current platform highlights:
|
||||
|
||||
- 10-node distributed infrastructure environment
|
||||
- 7-node security telemetry and detection footprint
|
||||
- `REPLACE_ME_LOC` lines of custom code across infrastructure, security, and automation projects
|
||||
- `REPLACE_ME_COMMITS` commits since January 1 across active repositories
|
||||
- Automated failover between AWS and peer infrastructure
|
||||
- Public dashboards for uptime, vulnerabilities, backups, threat telemetry, and service health
|
||||
- Multiple daily encrypted Borgmatic snapshots shipped offsite
|
||||
- Recurring backup verification and restore-oriented operational workflows
|
||||
- Nightly metrics refresh via Gitea Actions and `tokei`
|
||||
|
||||
---
|
||||
|
||||
## ⚡ Efficiency Metrics
|
||||
|
||||
- **Codebase Growth:** `REPLACE_ME_LOC` lines of custom code across all our repositories
|
||||
- **Commit Velocity:** `REPLACE_ME_COMMITS` commits since Jan 1
|
||||
- **Ares:** Ryzen 9 9950X sustaining ~0.06 load avg while running Gitea and a Kubernetes control plane
|
||||
- **Resilience:** Automated failover between AWS and peer nodes
|
||||
|
||||
## 📈 Activity
|
||||
## Activity
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
### 🧩 Deployment Patterns
|
||||
- **Reverse Proxy:** Caddy/NGINX (Cloudflare where applicable)
|
||||
- **Observability:** Prometheus + Node Exporter + cAdvisor
|
||||
- **Lifecycle:** Watchtower for controlled auto-updates
|
||||
- **Access Control:** Authelia where exposed
|
||||
- **Management:** Portainer (loopback-bound where possible)
|
||||
## Deployment Patterns
|
||||
|
||||
> Nodes are intentionally heterogeneous.
|
||||
> Each host is scoped to its role to reduce blast radius and cognitive load.
|
||||
- **Reverse proxy:** Caddy and NGINX, with Cloudflare where applicable
|
||||
- **Observability:** Prometheus, Grafana, Node Exporter, Blackbox Exporter, cAdvisor, Netdata
|
||||
- **Access control:** Authelia, OIDC, MFA, TLS hardening, and protected reverse-proxy routes
|
||||
- **Lifecycle management:** Controlled container updates and service monitoring
|
||||
- **Service isolation:** Nodes scoped by role to reduce blast radius and simplify recovery
|
||||
- **Backup strategy:** Encrypted offsite backups with recurring verification
|
||||
|
||||
---
|
||||
|
||||
#### 📍 Triton
|
||||
Primary high-density services node running:
|
||||
- Prometheus + Grafana
|
||||
- Code-server
|
||||
- Authelia
|
||||
- Trilium
|
||||
- CrowdSec bouncers
|
||||
## Selected Public Projects
|
||||
|
||||
Optimized for sustained workloads and observability aggregation.
|
||||
- **Portfolio:** [beane.me](https://beane.me)
|
||||
- **Threat Decisions and Telemetry:** [threats.beane.me](https://threats.beane.me)
|
||||
- **Threat Intelligence and Analytics:** [intel.beane.me](https://intel.beane.me)
|
||||
- **Vulnerability Scanning and Trends:** [vuln.beane.me](https://vuln.beane.me)
|
||||
- **Backup and Restore Verification:** [backups.beane.me](https://backups.beane.me)
|
||||
- **Threat Decision Observability:** [observe.beane.me](https://observe.beane.me)
|
||||
- **Health and Failover Dashboard:** [health.beane.me](https://health.beane.me)
|
||||
- **Source Control:** [git.beane.me](https://git.beane.me)
|
||||
- **Terraform Threat Modeling:** [tfstride.beane.me](https://tfstride.beane.me)
|
||||
|
||||
---
|
||||
|
||||
### 🔗 Live Projects
|
||||
- **Threat Decisions & Telemetry:** `threats.beane.me`
|
||||
- **Threat Intelligence & Analytics:** `intel.beane.me`
|
||||
- **Vulnerability Scanning (Trivy):** `vuln.beane.me`
|
||||
- **Backups & Restore Verification:** `backups.beane.me`
|
||||
- **Threat Decision Observability:** `observe.beane.me`
|
||||
- **Source Control (Gitea + K8s):** `git.beane.me`
|
||||
## Engineering Philosophy
|
||||
|
||||
---
|
||||
Production systems should be observable, automated, recoverable, and secure from the start.
|
||||
|
||||
## 🚜 Resource Management
|
||||
|
||||
- **Compute Density:** Kubernetes control plane with Postgres and CI workloads on Zen 5 hardware
|
||||
- **Sovereignty:** All code, telemetry, and backups remain self-hosted
|
||||
- **Backups:** Multiple daily encrypted Borgmatic snapshots shipped offsite
|
||||
|
||||
> *"If it's not blocked, it just hasn't found our infrastructure yet."*
|
||||
I focus on infrastructure that explains itself: clear telemetry, deterministic automation, evidence-backed security findings, documented recovery paths, and controls that improve reliability without slowing delivery.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"generated_at": "2026-04-04T14:22:48Z",
|
||||
"total_code": 47495,
|
||||
"total_comments": 4303,
|
||||
"total_blanks": 8037
|
||||
"generated_at": "2026-06-22T05:50:01Z",
|
||||
"total_code": 144386,
|
||||
"total_comments": 9578,
|
||||
"total_blanks": 21773
|
||||
}
|
||||
|
||||
+323
-323
@@ -1,326 +1,10 @@
|
||||
{
|
||||
"generated_at": "2026-04-04T14:22:47Z",
|
||||
"from_date": "2025-04-05",
|
||||
"to_date": "2026-04-04",
|
||||
"total_commits": 964,
|
||||
"max_daily_commits": 56,
|
||||
"generated_at": "2026-06-22T05:50:01Z",
|
||||
"from_date": "2025-06-23",
|
||||
"to_date": "2026-06-22",
|
||||
"total_commits": 1578,
|
||||
"max_daily_commits": 86,
|
||||
"days": [
|
||||
{
|
||||
"date": "2025-04-05",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-06",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-07",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-08",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-09",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-10",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-11",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-12",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-13",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-14",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-15",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-16",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-17",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-18",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-19",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-20",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-21",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-22",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-23",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-24",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-25",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-26",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-27",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-28",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-29",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-04-30",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-01",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-02",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-03",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-04",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-05",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-06",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-07",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-08",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-09",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-10",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-11",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-12",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-13",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-14",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-15",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-16",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-17",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-18",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-19",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-20",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-21",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-22",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-23",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-24",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-25",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-26",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-27",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-28",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-29",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-30",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-05-31",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-01",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-02",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-03",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-04",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-05",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-06",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-07",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-08",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-09",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-10",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-11",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-12",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-13",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-14",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-15",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-16",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-17",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-18",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-19",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-20",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-21",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-22",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2025-06-23",
|
||||
"count": 0
|
||||
@@ -1455,15 +1139,331 @@
|
||||
},
|
||||
{
|
||||
"date": "2026-04-02",
|
||||
"count": 10
|
||||
"count": 14
|
||||
},
|
||||
{
|
||||
"date": "2026-04-03",
|
||||
"count": 9
|
||||
"count": 18
|
||||
},
|
||||
{
|
||||
"date": "2026-04-04",
|
||||
"count": 28
|
||||
},
|
||||
{
|
||||
"date": "2026-04-05",
|
||||
"count": 24
|
||||
},
|
||||
{
|
||||
"date": "2026-04-06",
|
||||
"count": 6
|
||||
},
|
||||
{
|
||||
"date": "2026-04-07",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"date": "2026-04-08",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"date": "2026-04-09",
|
||||
"count": 86
|
||||
},
|
||||
{
|
||||
"date": "2026-04-10",
|
||||
"count": 6
|
||||
},
|
||||
{
|
||||
"date": "2026-04-11",
|
||||
"count": 14
|
||||
},
|
||||
{
|
||||
"date": "2026-04-12",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"date": "2026-04-13",
|
||||
"count": 14
|
||||
},
|
||||
{
|
||||
"date": "2026-04-14",
|
||||
"count": 6
|
||||
},
|
||||
{
|
||||
"date": "2026-04-15",
|
||||
"count": 20
|
||||
},
|
||||
{
|
||||
"date": "2026-04-16",
|
||||
"count": 3
|
||||
},
|
||||
{
|
||||
"date": "2026-04-17",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"date": "2026-04-18",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2026-04-19",
|
||||
"count": 6
|
||||
},
|
||||
{
|
||||
"date": "2026-04-20",
|
||||
"count": 3
|
||||
},
|
||||
{
|
||||
"date": "2026-04-21",
|
||||
"count": 4
|
||||
},
|
||||
{
|
||||
"date": "2026-04-22",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"date": "2026-04-23",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"date": "2026-04-24",
|
||||
"count": 10
|
||||
},
|
||||
{
|
||||
"date": "2026-04-25",
|
||||
"count": 7
|
||||
},
|
||||
{
|
||||
"date": "2026-04-26",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"date": "2026-04-27",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"date": "2026-04-28",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2026-04-29",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2026-04-30",
|
||||
"count": 3
|
||||
},
|
||||
{
|
||||
"date": "2026-05-01",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"date": "2026-05-02",
|
||||
"count": 10
|
||||
},
|
||||
{
|
||||
"date": "2026-05-03",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2026-05-04",
|
||||
"count": 7
|
||||
},
|
||||
{
|
||||
"date": "2026-05-05",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"date": "2026-05-06",
|
||||
"count": 4
|
||||
},
|
||||
{
|
||||
"date": "2026-05-07",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"date": "2026-05-08",
|
||||
"count": 4
|
||||
},
|
||||
{
|
||||
"date": "2026-05-09",
|
||||
"count": 5
|
||||
},
|
||||
{
|
||||
"date": "2026-05-10",
|
||||
"count": 6
|
||||
},
|
||||
{
|
||||
"date": "2026-05-11",
|
||||
"count": 4
|
||||
},
|
||||
{
|
||||
"date": "2026-05-12",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"date": "2026-05-13",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2026-05-14",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2026-05-15",
|
||||
"count": 16
|
||||
},
|
||||
{
|
||||
"date": "2026-05-16",
|
||||
"count": 14
|
||||
},
|
||||
{
|
||||
"date": "2026-05-17",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"date": "2026-05-18",
|
||||
"count": 5
|
||||
},
|
||||
{
|
||||
"date": "2026-05-19",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2026-05-20",
|
||||
"count": 11
|
||||
},
|
||||
{
|
||||
"date": "2026-05-21",
|
||||
"count": 19
|
||||
},
|
||||
{
|
||||
"date": "2026-05-22",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"date": "2026-05-23",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"date": "2026-05-24",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2026-05-25",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"date": "2026-05-26",
|
||||
"count": 20
|
||||
},
|
||||
{
|
||||
"date": "2026-05-27",
|
||||
"count": 9
|
||||
},
|
||||
{
|
||||
"date": "2026-05-28",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2026-05-29",
|
||||
"count": 23
|
||||
},
|
||||
{
|
||||
"date": "2026-05-30",
|
||||
"count": 8
|
||||
},
|
||||
{
|
||||
"date": "2026-05-31",
|
||||
"count": 19
|
||||
},
|
||||
{
|
||||
"date": "2026-06-01",
|
||||
"count": 3
|
||||
},
|
||||
{
|
||||
"date": "2026-06-02",
|
||||
"count": 8
|
||||
},
|
||||
{
|
||||
"date": "2026-06-03",
|
||||
"count": 21
|
||||
},
|
||||
{
|
||||
"date": "2026-06-04",
|
||||
"count": 12
|
||||
},
|
||||
{
|
||||
"date": "2026-06-05",
|
||||
"count": 7
|
||||
},
|
||||
{
|
||||
"date": "2026-06-06",
|
||||
"count": 7
|
||||
},
|
||||
{
|
||||
"date": "2026-06-07",
|
||||
"count": 4
|
||||
},
|
||||
{
|
||||
"date": "2026-06-08",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2026-06-09",
|
||||
"count": 10
|
||||
},
|
||||
{
|
||||
"date": "2026-06-10",
|
||||
"count": 19
|
||||
},
|
||||
{
|
||||
"date": "2026-06-11",
|
||||
"count": 10
|
||||
},
|
||||
{
|
||||
"date": "2026-06-12",
|
||||
"count": 15
|
||||
},
|
||||
{
|
||||
"date": "2026-06-13",
|
||||
"count": 8
|
||||
},
|
||||
{
|
||||
"date": "2026-06-14",
|
||||
"count": 5
|
||||
},
|
||||
{
|
||||
"date": "2026-06-15",
|
||||
"count": 0
|
||||
},
|
||||
{
|
||||
"date": "2026-06-16",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"date": "2026-06-17",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"date": "2026-06-18",
|
||||
"count": 10
|
||||
},
|
||||
{
|
||||
"date": "2026-06-19",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"date": "2026-06-20",
|
||||
"count": 6
|
||||
},
|
||||
{
|
||||
"date": "2026-06-21",
|
||||
"count": 10
|
||||
},
|
||||
{
|
||||
"date": "2026-06-22",
|
||||
"count": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
+383
-384
@@ -2,391 +2,390 @@
|
||||
<style>
|
||||
text { font: 10px -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif; fill: #57606a; }
|
||||
</style>
|
||||
<text x="30" y="10">Mar</text>
|
||||
<text x="78" y="10">May</text>
|
||||
<text x="138" y="10">Jun</text>
|
||||
<text x="186" y="10">Jul</text>
|
||||
<text x="234" y="10">Aug</text>
|
||||
<text x="294" y="10">Sep</text>
|
||||
<text x="342" y="10">Oct</text>
|
||||
<text x="390" y="10">Nov</text>
|
||||
<text x="450" y="10">Dec</text>
|
||||
<text x="498" y="10">Jan</text>
|
||||
<text x="558" y="10">Feb</text>
|
||||
<text x="606" y="10">Mar</text>
|
||||
<text x="654" y="10">Apr</text>
|
||||
<text x="42" y="10">Jul</text>
|
||||
<text x="90" y="10">Aug</text>
|
||||
<text x="150" y="10">Sep</text>
|
||||
<text x="198" y="10">Oct</text>
|
||||
<text x="246" y="10">Nov</text>
|
||||
<text x="306" y="10">Dec</text>
|
||||
<text x="354" y="10">Jan</text>
|
||||
<text x="414" y="10">Feb</text>
|
||||
<text x="462" y="10">Mar</text>
|
||||
<text x="510" y="10">Apr</text>
|
||||
<text x="558" y="10">May</text>
|
||||
<text x="618" y="10">Jun</text>
|
||||
<text x="0" y="40">Mon</text>
|
||||
<text x="0" y="64">Wed</text>
|
||||
<text x="0" y="88">Fri</text>
|
||||
<rect x="30" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-03-30: 0 commits</title></rect>
|
||||
<rect x="30" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-03-31: 0 commits</title></rect>
|
||||
<rect x="30" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-01: 0 commits</title></rect>
|
||||
<rect x="30" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-02: 0 commits</title></rect>
|
||||
<rect x="30" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-03: 0 commits</title></rect>
|
||||
<rect x="30" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-04: 0 commits</title></rect>
|
||||
<rect x="30" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-05: 0 commits</title></rect>
|
||||
<rect x="42" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-06: 0 commits</title></rect>
|
||||
<rect x="42" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-07: 0 commits</title></rect>
|
||||
<rect x="42" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-08: 0 commits</title></rect>
|
||||
<rect x="42" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-09: 0 commits</title></rect>
|
||||
<rect x="42" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-10: 0 commits</title></rect>
|
||||
<rect x="42" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-11: 0 commits</title></rect>
|
||||
<rect x="42" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-12: 0 commits</title></rect>
|
||||
<rect x="54" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-13: 0 commits</title></rect>
|
||||
<rect x="54" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-14: 0 commits</title></rect>
|
||||
<rect x="54" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-15: 0 commits</title></rect>
|
||||
<rect x="54" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-16: 0 commits</title></rect>
|
||||
<rect x="54" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-17: 0 commits</title></rect>
|
||||
<rect x="54" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-18: 0 commits</title></rect>
|
||||
<rect x="54" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-19: 0 commits</title></rect>
|
||||
<rect x="66" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-20: 0 commits</title></rect>
|
||||
<rect x="66" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-21: 0 commits</title></rect>
|
||||
<rect x="66" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-22: 0 commits</title></rect>
|
||||
<rect x="66" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-23: 0 commits</title></rect>
|
||||
<rect x="66" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-24: 0 commits</title></rect>
|
||||
<rect x="66" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-25: 0 commits</title></rect>
|
||||
<rect x="66" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-26: 0 commits</title></rect>
|
||||
<rect x="78" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-27: 0 commits</title></rect>
|
||||
<rect x="78" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-28: 0 commits</title></rect>
|
||||
<rect x="78" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-29: 0 commits</title></rect>
|
||||
<rect x="78" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-04-30: 0 commits</title></rect>
|
||||
<rect x="78" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-01: 0 commits</title></rect>
|
||||
<rect x="78" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-02: 0 commits</title></rect>
|
||||
<rect x="78" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-03: 0 commits</title></rect>
|
||||
<rect x="90" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-04: 0 commits</title></rect>
|
||||
<rect x="90" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-05: 0 commits</title></rect>
|
||||
<rect x="90" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-06: 0 commits</title></rect>
|
||||
<rect x="90" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-07: 0 commits</title></rect>
|
||||
<rect x="90" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-08: 0 commits</title></rect>
|
||||
<rect x="90" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-09: 0 commits</title></rect>
|
||||
<rect x="90" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-10: 0 commits</title></rect>
|
||||
<rect x="102" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-11: 0 commits</title></rect>
|
||||
<rect x="102" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-12: 0 commits</title></rect>
|
||||
<rect x="102" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-13: 0 commits</title></rect>
|
||||
<rect x="102" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-14: 0 commits</title></rect>
|
||||
<rect x="102" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-15: 0 commits</title></rect>
|
||||
<rect x="102" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-16: 0 commits</title></rect>
|
||||
<rect x="102" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-17: 0 commits</title></rect>
|
||||
<rect x="114" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-18: 0 commits</title></rect>
|
||||
<rect x="114" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-19: 0 commits</title></rect>
|
||||
<rect x="114" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-20: 0 commits</title></rect>
|
||||
<rect x="114" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-21: 0 commits</title></rect>
|
||||
<rect x="114" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-22: 0 commits</title></rect>
|
||||
<rect x="114" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-23: 0 commits</title></rect>
|
||||
<rect x="114" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-24: 0 commits</title></rect>
|
||||
<rect x="126" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-25: 0 commits</title></rect>
|
||||
<rect x="126" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-26: 0 commits</title></rect>
|
||||
<rect x="126" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-27: 0 commits</title></rect>
|
||||
<rect x="126" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-28: 0 commits</title></rect>
|
||||
<rect x="126" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-29: 0 commits</title></rect>
|
||||
<rect x="126" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-30: 0 commits</title></rect>
|
||||
<rect x="126" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-05-31: 0 commits</title></rect>
|
||||
<rect x="138" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-01: 0 commits</title></rect>
|
||||
<rect x="138" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-02: 0 commits</title></rect>
|
||||
<rect x="138" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-03: 0 commits</title></rect>
|
||||
<rect x="138" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-04: 0 commits</title></rect>
|
||||
<rect x="138" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-05: 0 commits</title></rect>
|
||||
<rect x="138" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-06: 0 commits</title></rect>
|
||||
<rect x="138" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-07: 0 commits</title></rect>
|
||||
<rect x="150" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-08: 0 commits</title></rect>
|
||||
<rect x="150" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-09: 0 commits</title></rect>
|
||||
<rect x="150" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-10: 0 commits</title></rect>
|
||||
<rect x="150" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-11: 0 commits</title></rect>
|
||||
<rect x="150" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-12: 0 commits</title></rect>
|
||||
<rect x="150" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-13: 0 commits</title></rect>
|
||||
<rect x="150" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-14: 0 commits</title></rect>
|
||||
<rect x="162" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-15: 0 commits</title></rect>
|
||||
<rect x="162" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-16: 0 commits</title></rect>
|
||||
<rect x="162" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-17: 0 commits</title></rect>
|
||||
<rect x="162" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-18: 0 commits</title></rect>
|
||||
<rect x="162" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-19: 0 commits</title></rect>
|
||||
<rect x="162" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-20: 0 commits</title></rect>
|
||||
<rect x="162" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-21: 0 commits</title></rect>
|
||||
<rect x="174" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-22: 0 commits</title></rect>
|
||||
<rect x="174" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-23: 0 commits</title></rect>
|
||||
<rect x="174" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-24: 0 commits</title></rect>
|
||||
<rect x="174" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-25: 0 commits</title></rect>
|
||||
<rect x="174" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-26: 0 commits</title></rect>
|
||||
<rect x="174" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-27: 0 commits</title></rect>
|
||||
<rect x="174" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-28: 0 commits</title></rect>
|
||||
<rect x="186" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-29: 0 commits</title></rect>
|
||||
<rect x="186" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-30: 0 commits</title></rect>
|
||||
<rect x="186" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-01: 0 commits</title></rect>
|
||||
<rect x="186" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-02: 0 commits</title></rect>
|
||||
<rect x="186" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-03: 0 commits</title></rect>
|
||||
<rect x="186" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-04: 0 commits</title></rect>
|
||||
<rect x="186" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-05: 0 commits</title></rect>
|
||||
<rect x="198" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-06: 0 commits</title></rect>
|
||||
<rect x="198" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-07: 0 commits</title></rect>
|
||||
<rect x="198" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-08: 0 commits</title></rect>
|
||||
<rect x="198" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-09: 0 commits</title></rect>
|
||||
<rect x="198" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-10: 0 commits</title></rect>
|
||||
<rect x="198" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-11: 0 commits</title></rect>
|
||||
<rect x="198" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-12: 0 commits</title></rect>
|
||||
<rect x="210" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-13: 0 commits</title></rect>
|
||||
<rect x="210" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-14: 0 commits</title></rect>
|
||||
<rect x="210" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-15: 0 commits</title></rect>
|
||||
<rect x="210" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-16: 0 commits</title></rect>
|
||||
<rect x="210" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-17: 0 commits</title></rect>
|
||||
<rect x="210" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-18: 0 commits</title></rect>
|
||||
<rect x="210" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-19: 0 commits</title></rect>
|
||||
<rect x="222" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-20: 0 commits</title></rect>
|
||||
<rect x="222" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-21: 0 commits</title></rect>
|
||||
<rect x="222" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-22: 0 commits</title></rect>
|
||||
<rect x="222" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-23: 0 commits</title></rect>
|
||||
<rect x="222" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-24: 0 commits</title></rect>
|
||||
<rect x="222" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-25: 0 commits</title></rect>
|
||||
<rect x="222" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-26: 0 commits</title></rect>
|
||||
<rect x="234" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-27: 0 commits</title></rect>
|
||||
<rect x="234" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-28: 0 commits</title></rect>
|
||||
<rect x="234" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-29: 0 commits</title></rect>
|
||||
<rect x="234" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-30: 0 commits</title></rect>
|
||||
<rect x="234" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-31: 0 commits</title></rect>
|
||||
<rect x="234" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-01: 0 commits</title></rect>
|
||||
<rect x="234" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-02: 0 commits</title></rect>
|
||||
<rect x="246" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-03: 0 commits</title></rect>
|
||||
<rect x="246" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-04: 0 commits</title></rect>
|
||||
<rect x="246" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-05: 0 commits</title></rect>
|
||||
<rect x="246" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-06: 0 commits</title></rect>
|
||||
<rect x="246" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-07: 0 commits</title></rect>
|
||||
<rect x="246" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-08: 0 commits</title></rect>
|
||||
<rect x="246" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2025-08-09: 5 commits</title></rect>
|
||||
<rect x="258" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-10: 0 commits</title></rect>
|
||||
<rect x="258" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-11: 0 commits</title></rect>
|
||||
<rect x="258" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-12: 0 commits</title></rect>
|
||||
<rect x="258" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-13: 0 commits</title></rect>
|
||||
<rect x="258" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-14: 0 commits</title></rect>
|
||||
<rect x="258" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-15: 0 commits</title></rect>
|
||||
<rect x="258" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2025-08-16: 4 commits</title></rect>
|
||||
<rect x="270" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-17: 0 commits</title></rect>
|
||||
<rect x="270" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-18: 0 commits</title></rect>
|
||||
<rect x="270" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-19: 0 commits</title></rect>
|
||||
<rect x="270" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-20: 0 commits</title></rect>
|
||||
<rect x="270" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-21: 0 commits</title></rect>
|
||||
<rect x="270" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-22: 0 commits</title></rect>
|
||||
<rect x="270" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-23: 0 commits</title></rect>
|
||||
<rect x="282" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-24: 0 commits</title></rect>
|
||||
<rect x="282" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-25: 0 commits</title></rect>
|
||||
<rect x="282" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-26: 0 commits</title></rect>
|
||||
<rect x="282" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-27: 0 commits</title></rect>
|
||||
<rect x="282" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-28: 0 commits</title></rect>
|
||||
<rect x="282" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-29: 0 commits</title></rect>
|
||||
<rect x="282" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2025-08-30: 1 commit</title></rect>
|
||||
<rect x="294" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-31: 0 commits</title></rect>
|
||||
<rect x="294" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-01: 0 commits</title></rect>
|
||||
<rect x="294" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-02: 0 commits</title></rect>
|
||||
<rect x="294" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-03: 0 commits</title></rect>
|
||||
<rect x="294" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-04: 0 commits</title></rect>
|
||||
<rect x="294" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-05: 0 commits</title></rect>
|
||||
<rect x="294" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-06: 0 commits</title></rect>
|
||||
<rect x="306" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-07: 0 commits</title></rect>
|
||||
<rect x="306" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-08: 0 commits</title></rect>
|
||||
<rect x="306" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-09: 0 commits</title></rect>
|
||||
<rect x="306" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-10: 0 commits</title></rect>
|
||||
<rect x="306" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-11: 0 commits</title></rect>
|
||||
<rect x="306" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-12: 0 commits</title></rect>
|
||||
<rect x="306" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-13: 0 commits</title></rect>
|
||||
<rect x="318" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-14: 0 commits</title></rect>
|
||||
<rect x="318" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-15: 0 commits</title></rect>
|
||||
<rect x="318" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-16: 0 commits</title></rect>
|
||||
<rect x="318" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-17: 0 commits</title></rect>
|
||||
<rect x="318" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-18: 0 commits</title></rect>
|
||||
<rect x="318" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-19: 0 commits</title></rect>
|
||||
<rect x="318" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-20: 0 commits</title></rect>
|
||||
<rect x="330" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-21: 0 commits</title></rect>
|
||||
<rect x="330" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-22: 0 commits</title></rect>
|
||||
<rect x="330" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-23: 0 commits</title></rect>
|
||||
<rect x="330" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-24: 0 commits</title></rect>
|
||||
<rect x="330" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-25: 0 commits</title></rect>
|
||||
<rect x="330" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-26: 0 commits</title></rect>
|
||||
<rect x="330" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-27: 0 commits</title></rect>
|
||||
<rect x="342" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-28: 0 commits</title></rect>
|
||||
<rect x="342" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-29: 0 commits</title></rect>
|
||||
<rect x="342" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-30: 0 commits</title></rect>
|
||||
<rect x="342" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-01: 0 commits</title></rect>
|
||||
<rect x="342" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-02: 0 commits</title></rect>
|
||||
<rect x="342" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-03: 0 commits</title></rect>
|
||||
<rect x="342" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2025-10-04: 6 commits</title></rect>
|
||||
<rect x="354" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2025-10-05: 5 commits</title></rect>
|
||||
<rect x="354" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-06: 0 commits</title></rect>
|
||||
<rect x="354" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-07: 0 commits</title></rect>
|
||||
<rect x="354" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-08: 0 commits</title></rect>
|
||||
<rect x="354" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-09: 0 commits</title></rect>
|
||||
<rect x="354" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-10: 0 commits</title></rect>
|
||||
<rect x="354" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-11: 0 commits</title></rect>
|
||||
<rect x="366" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-12: 0 commits</title></rect>
|
||||
<rect x="366" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-13: 0 commits</title></rect>
|
||||
<rect x="366" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-14: 0 commits</title></rect>
|
||||
<rect x="366" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-15: 0 commits</title></rect>
|
||||
<rect x="366" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-16: 0 commits</title></rect>
|
||||
<rect x="366" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-17: 0 commits</title></rect>
|
||||
<rect x="366" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-18: 0 commits</title></rect>
|
||||
<rect x="378" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-19: 0 commits</title></rect>
|
||||
<rect x="378" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-20: 0 commits</title></rect>
|
||||
<rect x="378" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-21: 0 commits</title></rect>
|
||||
<rect x="378" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-22: 0 commits</title></rect>
|
||||
<rect x="378" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-23: 0 commits</title></rect>
|
||||
<rect x="378" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-24: 0 commits</title></rect>
|
||||
<rect x="378" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-25: 0 commits</title></rect>
|
||||
<rect x="390" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-26: 0 commits</title></rect>
|
||||
<rect x="390" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-27: 0 commits</title></rect>
|
||||
<rect x="390" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-28: 0 commits</title></rect>
|
||||
<rect x="390" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-29: 0 commits</title></rect>
|
||||
<rect x="390" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-30: 0 commits</title></rect>
|
||||
<rect x="390" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-31: 0 commits</title></rect>
|
||||
<rect x="390" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-01: 0 commits</title></rect>
|
||||
<rect x="402" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-02: 0 commits</title></rect>
|
||||
<rect x="402" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-03: 0 commits</title></rect>
|
||||
<rect x="402" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-04: 0 commits</title></rect>
|
||||
<rect x="402" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-05: 0 commits</title></rect>
|
||||
<rect x="402" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-06: 0 commits</title></rect>
|
||||
<rect x="402" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-07: 0 commits</title></rect>
|
||||
<rect x="402" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-08: 0 commits</title></rect>
|
||||
<rect x="414" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-09: 0 commits</title></rect>
|
||||
<rect x="414" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-10: 0 commits</title></rect>
|
||||
<rect x="414" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-11: 0 commits</title></rect>
|
||||
<rect x="414" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-12: 0 commits</title></rect>
|
||||
<rect x="414" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-13: 0 commits</title></rect>
|
||||
<rect x="414" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-14: 0 commits</title></rect>
|
||||
<rect x="414" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-15: 0 commits</title></rect>
|
||||
<rect x="426" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-16: 0 commits</title></rect>
|
||||
<rect x="426" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-17: 0 commits</title></rect>
|
||||
<rect x="426" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-18: 0 commits</title></rect>
|
||||
<rect x="426" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-19: 0 commits</title></rect>
|
||||
<rect x="426" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-20: 0 commits</title></rect>
|
||||
<rect x="426" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-21: 0 commits</title></rect>
|
||||
<rect x="426" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-22: 0 commits</title></rect>
|
||||
<rect x="438" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-23: 0 commits</title></rect>
|
||||
<rect x="438" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-24: 0 commits</title></rect>
|
||||
<rect x="438" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-25: 0 commits</title></rect>
|
||||
<rect x="438" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-26: 0 commits</title></rect>
|
||||
<rect x="438" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-27: 0 commits</title></rect>
|
||||
<rect x="438" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-28: 0 commits</title></rect>
|
||||
<rect x="438" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-29: 0 commits</title></rect>
|
||||
<rect x="450" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-30: 0 commits</title></rect>
|
||||
<rect x="450" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-01: 0 commits</title></rect>
|
||||
<rect x="450" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-02: 0 commits</title></rect>
|
||||
<rect x="450" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-03: 0 commits</title></rect>
|
||||
<rect x="450" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-04: 0 commits</title></rect>
|
||||
<rect x="450" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-05: 0 commits</title></rect>
|
||||
<rect x="450" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-06: 0 commits</title></rect>
|
||||
<rect x="462" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-07: 0 commits</title></rect>
|
||||
<rect x="462" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-08: 0 commits</title></rect>
|
||||
<rect x="462" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-09: 0 commits</title></rect>
|
||||
<rect x="462" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-10: 0 commits</title></rect>
|
||||
<rect x="462" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-11: 0 commits</title></rect>
|
||||
<rect x="462" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-12: 0 commits</title></rect>
|
||||
<rect x="462" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-13: 0 commits</title></rect>
|
||||
<rect x="474" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-14: 0 commits</title></rect>
|
||||
<rect x="474" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-15: 0 commits</title></rect>
|
||||
<rect x="474" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-16: 0 commits</title></rect>
|
||||
<rect x="474" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-17: 0 commits</title></rect>
|
||||
<rect x="474" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-18: 0 commits</title></rect>
|
||||
<rect x="474" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-19: 0 commits</title></rect>
|
||||
<rect x="474" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-20: 0 commits</title></rect>
|
||||
<rect x="486" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-21: 0 commits</title></rect>
|
||||
<rect x="486" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-22: 0 commits</title></rect>
|
||||
<rect x="486" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-23: 0 commits</title></rect>
|
||||
<rect x="486" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-24: 0 commits</title></rect>
|
||||
<rect x="486" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-25: 0 commits</title></rect>
|
||||
<rect x="486" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-26: 0 commits</title></rect>
|
||||
<rect x="486" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-27: 0 commits</title></rect>
|
||||
<rect x="498" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-28: 0 commits</title></rect>
|
||||
<rect x="498" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-29: 0 commits</title></rect>
|
||||
<rect x="498" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-30: 0 commits</title></rect>
|
||||
<rect x="498" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-31: 0 commits</title></rect>
|
||||
<rect x="498" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-01: 0 commits</title></rect>
|
||||
<rect x="498" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-02: 0 commits</title></rect>
|
||||
<rect x="498" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-03: 0 commits</title></rect>
|
||||
<rect x="510" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-04: 0 commits</title></rect>
|
||||
<rect x="510" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-05: 0 commits</title></rect>
|
||||
<rect x="510" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-06: 0 commits</title></rect>
|
||||
<rect x="510" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-07: 0 commits</title></rect>
|
||||
<rect x="510" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-08: 10 commits</title></rect>
|
||||
<rect x="510" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-09: 4 commits</title></rect>
|
||||
<rect x="510" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-10: 0 commits</title></rect>
|
||||
<rect x="522" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-11: 1 commit</title></rect>
|
||||
<rect x="522" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-12: 9 commits</title></rect>
|
||||
<rect x="522" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-13: 11 commits</title></rect>
|
||||
<rect x="522" y="56" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-14: 23 commits</title></rect>
|
||||
<rect x="522" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-15: 10 commits</title></rect>
|
||||
<rect x="522" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-16: 10 commits</title></rect>
|
||||
<rect x="522" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-17: 3 commits</title></rect>
|
||||
<rect x="534" y="20" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-18: 23 commits</title></rect>
|
||||
<rect x="534" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-19: 9 commits</title></rect>
|
||||
<rect x="534" y="44" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-20: 28 commits</title></rect>
|
||||
<rect x="534" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-21: 6 commits</title></rect>
|
||||
<rect x="534" y="68" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-22: 15 commits</title></rect>
|
||||
<rect x="534" y="80" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-23: 17 commits</title></rect>
|
||||
<rect x="534" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-24: 5 commits</title></rect>
|
||||
<rect x="546" y="20" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-25: 20 commits</title></rect>
|
||||
<rect x="546" y="32" width="10" height="10" rx="2" ry="2" fill="#216e39"><title>2026-01-26: 56 commits</title></rect>
|
||||
<rect x="546" y="44" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-27: 22 commits</title></rect>
|
||||
<rect x="546" y="56" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-28: 16 commits</title></rect>
|
||||
<rect x="546" y="68" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-29: 28 commits</title></rect>
|
||||
<rect x="546" y="80" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-30: 16 commits</title></rect>
|
||||
<rect x="546" y="92" width="10" height="10" rx="2" ry="2" fill="#30a14e"><title>2026-01-31: 31 commits</title></rect>
|
||||
<rect x="558" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-02-01: 0 commits</title></rect>
|
||||
<rect x="558" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-02: 2 commits</title></rect>
|
||||
<rect x="558" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-03: 1 commit</title></rect>
|
||||
<rect x="558" y="56" width="10" height="10" rx="2" ry="2" fill="#30a14e"><title>2026-02-04: 40 commits</title></rect>
|
||||
<rect x="558" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-05: 10 commits</title></rect>
|
||||
<rect x="558" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-06: 8 commits</title></rect>
|
||||
<rect x="558" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-07: 1 commit</title></rect>
|
||||
<rect x="570" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-08: 6 commits</title></rect>
|
||||
<rect x="570" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-09: 2 commits</title></rect>
|
||||
<rect x="570" y="44" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-02-10: 27 commits</title></rect>
|
||||
<rect x="570" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-11: 6 commits</title></rect>
|
||||
<rect x="570" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-12: 10 commits</title></rect>
|
||||
<rect x="570" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-13: 2 commits</title></rect>
|
||||
<rect x="570" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-02-14: 0 commits</title></rect>
|
||||
<rect x="582" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-15: 1 commit</title></rect>
|
||||
<rect x="582" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-16: 1 commit</title></rect>
|
||||
<rect x="582" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-17: 3 commits</title></rect>
|
||||
<rect x="582" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-18: 1 commit</title></rect>
|
||||
<rect x="582" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-19: 4 commits</title></rect>
|
||||
<rect x="582" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-20: 4 commits</title></rect>
|
||||
<rect x="582" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-02-21: 0 commits</title></rect>
|
||||
<rect x="594" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-22: 1 commit</title></rect>
|
||||
<rect x="594" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-23: 2 commits</title></rect>
|
||||
<rect x="594" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-24: 4 commits</title></rect>
|
||||
<rect x="594" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-25: 5 commits</title></rect>
|
||||
<rect x="594" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-26: 2 commits</title></rect>
|
||||
<rect x="594" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-27: 9 commits</title></rect>
|
||||
<rect x="594" y="92" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-02-28: 19 commits</title></rect>
|
||||
<rect x="606" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-01: 9 commits</title></rect>
|
||||
<rect x="606" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-02: 10 commits</title></rect>
|
||||
<rect x="606" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-03: 2 commits</title></rect>
|
||||
<rect x="606" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-03-04: 0 commits</title></rect>
|
||||
<rect x="606" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-05: 14 commits</title></rect>
|
||||
<rect x="606" y="80" width="10" height="10" rx="2" ry="2" fill="#30a14e"><title>2026-03-06: 29 commits</title></rect>
|
||||
<rect x="606" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-07: 10 commits</title></rect>
|
||||
<rect x="618" y="20" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-03-08: 19 commits</title></rect>
|
||||
<rect x="618" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-09: 2 commits</title></rect>
|
||||
<rect x="618" y="44" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-03-10: 20 commits</title></rect>
|
||||
<rect x="618" y="56" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-03-11: 27 commits</title></rect>
|
||||
<rect x="618" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-03-12: 0 commits</title></rect>
|
||||
<rect x="618" y="80" width="10" height="10" rx="2" ry="2" fill="#30a14e"><title>2026-03-13: 37 commits</title></rect>
|
||||
<rect x="618" y="92" width="10" height="10" rx="2" ry="2" fill="#216e39"><title>2026-03-14: 49 commits</title></rect>
|
||||
<rect x="630" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-15: 9 commits</title></rect>
|
||||
<rect x="630" y="32" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-03-16: 17 commits</title></rect>
|
||||
<rect x="630" y="44" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-03-17: 21 commits</title></rect>
|
||||
<rect x="630" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-18: 14 commits</title></rect>
|
||||
<rect x="630" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-19: 10 commits</title></rect>
|
||||
<rect x="630" y="80" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-03-20: 16 commits</title></rect>
|
||||
<rect x="630" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-21: 7 commits</title></rect>
|
||||
<rect x="642" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-03-22: 0 commits</title></rect>
|
||||
<rect x="642" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-23: 1 commit</title></rect>
|
||||
<rect x="642" y="44" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-03-24: 19 commits</title></rect>
|
||||
<rect x="642" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-25: 9 commits</title></rect>
|
||||
<rect x="642" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-26: 7 commits</title></rect>
|
||||
<rect x="642" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-03-27: 0 commits</title></rect>
|
||||
<rect x="642" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-03-28: 0 commits</title></rect>
|
||||
<rect x="654" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-29: 2 commits</title></rect>
|
||||
<rect x="654" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-30: 9 commits</title></rect>
|
||||
<rect x="654" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-31: 6 commits</title></rect>
|
||||
<rect x="654" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-01: 1 commit</title></rect>
|
||||
<rect x="654" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-02: 10 commits</title></rect>
|
||||
<rect x="654" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-03: 9 commits</title></rect>
|
||||
<rect x="654" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-04: 4 commits</title></rect>
|
||||
<rect x="30" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-22: 0 commits</title></rect>
|
||||
<rect x="30" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-23: 0 commits</title></rect>
|
||||
<rect x="30" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-24: 0 commits</title></rect>
|
||||
<rect x="30" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-25: 0 commits</title></rect>
|
||||
<rect x="30" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-26: 0 commits</title></rect>
|
||||
<rect x="30" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-27: 0 commits</title></rect>
|
||||
<rect x="30" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-28: 0 commits</title></rect>
|
||||
<rect x="42" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-29: 0 commits</title></rect>
|
||||
<rect x="42" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-06-30: 0 commits</title></rect>
|
||||
<rect x="42" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-01: 0 commits</title></rect>
|
||||
<rect x="42" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-02: 0 commits</title></rect>
|
||||
<rect x="42" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-03: 0 commits</title></rect>
|
||||
<rect x="42" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-04: 0 commits</title></rect>
|
||||
<rect x="42" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-05: 0 commits</title></rect>
|
||||
<rect x="54" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-06: 0 commits</title></rect>
|
||||
<rect x="54" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-07: 0 commits</title></rect>
|
||||
<rect x="54" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-08: 0 commits</title></rect>
|
||||
<rect x="54" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-09: 0 commits</title></rect>
|
||||
<rect x="54" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-10: 0 commits</title></rect>
|
||||
<rect x="54" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-11: 0 commits</title></rect>
|
||||
<rect x="54" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-12: 0 commits</title></rect>
|
||||
<rect x="66" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-13: 0 commits</title></rect>
|
||||
<rect x="66" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-14: 0 commits</title></rect>
|
||||
<rect x="66" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-15: 0 commits</title></rect>
|
||||
<rect x="66" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-16: 0 commits</title></rect>
|
||||
<rect x="66" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-17: 0 commits</title></rect>
|
||||
<rect x="66" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-18: 0 commits</title></rect>
|
||||
<rect x="66" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-19: 0 commits</title></rect>
|
||||
<rect x="78" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-20: 0 commits</title></rect>
|
||||
<rect x="78" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-21: 0 commits</title></rect>
|
||||
<rect x="78" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-22: 0 commits</title></rect>
|
||||
<rect x="78" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-23: 0 commits</title></rect>
|
||||
<rect x="78" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-24: 0 commits</title></rect>
|
||||
<rect x="78" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-25: 0 commits</title></rect>
|
||||
<rect x="78" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-26: 0 commits</title></rect>
|
||||
<rect x="90" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-27: 0 commits</title></rect>
|
||||
<rect x="90" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-28: 0 commits</title></rect>
|
||||
<rect x="90" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-29: 0 commits</title></rect>
|
||||
<rect x="90" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-30: 0 commits</title></rect>
|
||||
<rect x="90" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-07-31: 0 commits</title></rect>
|
||||
<rect x="90" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-01: 0 commits</title></rect>
|
||||
<rect x="90" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-02: 0 commits</title></rect>
|
||||
<rect x="102" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-03: 0 commits</title></rect>
|
||||
<rect x="102" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-04: 0 commits</title></rect>
|
||||
<rect x="102" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-05: 0 commits</title></rect>
|
||||
<rect x="102" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-06: 0 commits</title></rect>
|
||||
<rect x="102" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-07: 0 commits</title></rect>
|
||||
<rect x="102" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-08: 0 commits</title></rect>
|
||||
<rect x="102" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2025-08-09: 5 commits</title></rect>
|
||||
<rect x="114" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-10: 0 commits</title></rect>
|
||||
<rect x="114" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-11: 0 commits</title></rect>
|
||||
<rect x="114" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-12: 0 commits</title></rect>
|
||||
<rect x="114" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-13: 0 commits</title></rect>
|
||||
<rect x="114" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-14: 0 commits</title></rect>
|
||||
<rect x="114" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-15: 0 commits</title></rect>
|
||||
<rect x="114" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2025-08-16: 4 commits</title></rect>
|
||||
<rect x="126" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-17: 0 commits</title></rect>
|
||||
<rect x="126" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-18: 0 commits</title></rect>
|
||||
<rect x="126" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-19: 0 commits</title></rect>
|
||||
<rect x="126" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-20: 0 commits</title></rect>
|
||||
<rect x="126" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-21: 0 commits</title></rect>
|
||||
<rect x="126" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-22: 0 commits</title></rect>
|
||||
<rect x="126" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-23: 0 commits</title></rect>
|
||||
<rect x="138" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-24: 0 commits</title></rect>
|
||||
<rect x="138" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-25: 0 commits</title></rect>
|
||||
<rect x="138" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-26: 0 commits</title></rect>
|
||||
<rect x="138" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-27: 0 commits</title></rect>
|
||||
<rect x="138" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-28: 0 commits</title></rect>
|
||||
<rect x="138" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-29: 0 commits</title></rect>
|
||||
<rect x="138" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2025-08-30: 1 commit</title></rect>
|
||||
<rect x="150" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-08-31: 0 commits</title></rect>
|
||||
<rect x="150" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-01: 0 commits</title></rect>
|
||||
<rect x="150" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-02: 0 commits</title></rect>
|
||||
<rect x="150" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-03: 0 commits</title></rect>
|
||||
<rect x="150" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-04: 0 commits</title></rect>
|
||||
<rect x="150" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-05: 0 commits</title></rect>
|
||||
<rect x="150" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-06: 0 commits</title></rect>
|
||||
<rect x="162" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-07: 0 commits</title></rect>
|
||||
<rect x="162" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-08: 0 commits</title></rect>
|
||||
<rect x="162" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-09: 0 commits</title></rect>
|
||||
<rect x="162" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-10: 0 commits</title></rect>
|
||||
<rect x="162" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-11: 0 commits</title></rect>
|
||||
<rect x="162" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-12: 0 commits</title></rect>
|
||||
<rect x="162" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-13: 0 commits</title></rect>
|
||||
<rect x="174" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-14: 0 commits</title></rect>
|
||||
<rect x="174" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-15: 0 commits</title></rect>
|
||||
<rect x="174" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-16: 0 commits</title></rect>
|
||||
<rect x="174" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-17: 0 commits</title></rect>
|
||||
<rect x="174" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-18: 0 commits</title></rect>
|
||||
<rect x="174" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-19: 0 commits</title></rect>
|
||||
<rect x="174" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-20: 0 commits</title></rect>
|
||||
<rect x="186" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-21: 0 commits</title></rect>
|
||||
<rect x="186" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-22: 0 commits</title></rect>
|
||||
<rect x="186" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-23: 0 commits</title></rect>
|
||||
<rect x="186" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-24: 0 commits</title></rect>
|
||||
<rect x="186" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-25: 0 commits</title></rect>
|
||||
<rect x="186" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-26: 0 commits</title></rect>
|
||||
<rect x="186" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-27: 0 commits</title></rect>
|
||||
<rect x="198" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-28: 0 commits</title></rect>
|
||||
<rect x="198" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-29: 0 commits</title></rect>
|
||||
<rect x="198" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-09-30: 0 commits</title></rect>
|
||||
<rect x="198" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-01: 0 commits</title></rect>
|
||||
<rect x="198" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-02: 0 commits</title></rect>
|
||||
<rect x="198" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-03: 0 commits</title></rect>
|
||||
<rect x="198" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2025-10-04: 6 commits</title></rect>
|
||||
<rect x="210" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2025-10-05: 5 commits</title></rect>
|
||||
<rect x="210" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-06: 0 commits</title></rect>
|
||||
<rect x="210" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-07: 0 commits</title></rect>
|
||||
<rect x="210" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-08: 0 commits</title></rect>
|
||||
<rect x="210" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-09: 0 commits</title></rect>
|
||||
<rect x="210" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-10: 0 commits</title></rect>
|
||||
<rect x="210" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-11: 0 commits</title></rect>
|
||||
<rect x="222" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-12: 0 commits</title></rect>
|
||||
<rect x="222" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-13: 0 commits</title></rect>
|
||||
<rect x="222" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-14: 0 commits</title></rect>
|
||||
<rect x="222" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-15: 0 commits</title></rect>
|
||||
<rect x="222" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-16: 0 commits</title></rect>
|
||||
<rect x="222" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-17: 0 commits</title></rect>
|
||||
<rect x="222" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-18: 0 commits</title></rect>
|
||||
<rect x="234" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-19: 0 commits</title></rect>
|
||||
<rect x="234" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-20: 0 commits</title></rect>
|
||||
<rect x="234" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-21: 0 commits</title></rect>
|
||||
<rect x="234" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-22: 0 commits</title></rect>
|
||||
<rect x="234" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-23: 0 commits</title></rect>
|
||||
<rect x="234" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-24: 0 commits</title></rect>
|
||||
<rect x="234" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-25: 0 commits</title></rect>
|
||||
<rect x="246" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-26: 0 commits</title></rect>
|
||||
<rect x="246" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-27: 0 commits</title></rect>
|
||||
<rect x="246" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-28: 0 commits</title></rect>
|
||||
<rect x="246" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-29: 0 commits</title></rect>
|
||||
<rect x="246" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-30: 0 commits</title></rect>
|
||||
<rect x="246" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-10-31: 0 commits</title></rect>
|
||||
<rect x="246" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-01: 0 commits</title></rect>
|
||||
<rect x="258" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-02: 0 commits</title></rect>
|
||||
<rect x="258" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-03: 0 commits</title></rect>
|
||||
<rect x="258" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-04: 0 commits</title></rect>
|
||||
<rect x="258" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-05: 0 commits</title></rect>
|
||||
<rect x="258" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-06: 0 commits</title></rect>
|
||||
<rect x="258" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-07: 0 commits</title></rect>
|
||||
<rect x="258" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-08: 0 commits</title></rect>
|
||||
<rect x="270" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-09: 0 commits</title></rect>
|
||||
<rect x="270" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-10: 0 commits</title></rect>
|
||||
<rect x="270" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-11: 0 commits</title></rect>
|
||||
<rect x="270" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-12: 0 commits</title></rect>
|
||||
<rect x="270" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-13: 0 commits</title></rect>
|
||||
<rect x="270" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-14: 0 commits</title></rect>
|
||||
<rect x="270" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-15: 0 commits</title></rect>
|
||||
<rect x="282" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-16: 0 commits</title></rect>
|
||||
<rect x="282" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-17: 0 commits</title></rect>
|
||||
<rect x="282" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-18: 0 commits</title></rect>
|
||||
<rect x="282" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-19: 0 commits</title></rect>
|
||||
<rect x="282" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-20: 0 commits</title></rect>
|
||||
<rect x="282" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-21: 0 commits</title></rect>
|
||||
<rect x="282" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-22: 0 commits</title></rect>
|
||||
<rect x="294" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-23: 0 commits</title></rect>
|
||||
<rect x="294" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-24: 0 commits</title></rect>
|
||||
<rect x="294" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-25: 0 commits</title></rect>
|
||||
<rect x="294" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-26: 0 commits</title></rect>
|
||||
<rect x="294" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-27: 0 commits</title></rect>
|
||||
<rect x="294" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-28: 0 commits</title></rect>
|
||||
<rect x="294" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-29: 0 commits</title></rect>
|
||||
<rect x="306" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-11-30: 0 commits</title></rect>
|
||||
<rect x="306" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-01: 0 commits</title></rect>
|
||||
<rect x="306" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-02: 0 commits</title></rect>
|
||||
<rect x="306" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-03: 0 commits</title></rect>
|
||||
<rect x="306" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-04: 0 commits</title></rect>
|
||||
<rect x="306" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-05: 0 commits</title></rect>
|
||||
<rect x="306" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-06: 0 commits</title></rect>
|
||||
<rect x="318" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-07: 0 commits</title></rect>
|
||||
<rect x="318" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-08: 0 commits</title></rect>
|
||||
<rect x="318" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-09: 0 commits</title></rect>
|
||||
<rect x="318" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-10: 0 commits</title></rect>
|
||||
<rect x="318" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-11: 0 commits</title></rect>
|
||||
<rect x="318" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-12: 0 commits</title></rect>
|
||||
<rect x="318" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-13: 0 commits</title></rect>
|
||||
<rect x="330" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-14: 0 commits</title></rect>
|
||||
<rect x="330" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-15: 0 commits</title></rect>
|
||||
<rect x="330" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-16: 0 commits</title></rect>
|
||||
<rect x="330" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-17: 0 commits</title></rect>
|
||||
<rect x="330" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-18: 0 commits</title></rect>
|
||||
<rect x="330" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-19: 0 commits</title></rect>
|
||||
<rect x="330" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-20: 0 commits</title></rect>
|
||||
<rect x="342" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-21: 0 commits</title></rect>
|
||||
<rect x="342" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-22: 0 commits</title></rect>
|
||||
<rect x="342" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-23: 0 commits</title></rect>
|
||||
<rect x="342" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-24: 0 commits</title></rect>
|
||||
<rect x="342" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-25: 0 commits</title></rect>
|
||||
<rect x="342" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-26: 0 commits</title></rect>
|
||||
<rect x="342" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-27: 0 commits</title></rect>
|
||||
<rect x="354" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-28: 0 commits</title></rect>
|
||||
<rect x="354" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-29: 0 commits</title></rect>
|
||||
<rect x="354" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-30: 0 commits</title></rect>
|
||||
<rect x="354" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2025-12-31: 0 commits</title></rect>
|
||||
<rect x="354" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-01: 0 commits</title></rect>
|
||||
<rect x="354" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-02: 0 commits</title></rect>
|
||||
<rect x="354" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-03: 0 commits</title></rect>
|
||||
<rect x="366" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-04: 0 commits</title></rect>
|
||||
<rect x="366" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-05: 0 commits</title></rect>
|
||||
<rect x="366" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-06: 0 commits</title></rect>
|
||||
<rect x="366" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-07: 0 commits</title></rect>
|
||||
<rect x="366" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-08: 10 commits</title></rect>
|
||||
<rect x="366" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-09: 4 commits</title></rect>
|
||||
<rect x="366" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-01-10: 0 commits</title></rect>
|
||||
<rect x="378" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-11: 1 commit</title></rect>
|
||||
<rect x="378" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-12: 9 commits</title></rect>
|
||||
<rect x="378" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-13: 11 commits</title></rect>
|
||||
<rect x="378" y="56" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-14: 23 commits</title></rect>
|
||||
<rect x="378" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-15: 10 commits</title></rect>
|
||||
<rect x="378" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-16: 10 commits</title></rect>
|
||||
<rect x="378" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-17: 3 commits</title></rect>
|
||||
<rect x="390" y="20" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-18: 23 commits</title></rect>
|
||||
<rect x="390" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-19: 9 commits</title></rect>
|
||||
<rect x="390" y="44" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-20: 28 commits</title></rect>
|
||||
<rect x="390" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-21: 6 commits</title></rect>
|
||||
<rect x="390" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-22: 15 commits</title></rect>
|
||||
<rect x="390" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-23: 17 commits</title></rect>
|
||||
<rect x="390" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-24: 5 commits</title></rect>
|
||||
<rect x="402" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-25: 20 commits</title></rect>
|
||||
<rect x="402" y="32" width="10" height="10" rx="2" ry="2" fill="#30a14e"><title>2026-01-26: 56 commits</title></rect>
|
||||
<rect x="402" y="44" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-27: 22 commits</title></rect>
|
||||
<rect x="402" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-28: 16 commits</title></rect>
|
||||
<rect x="402" y="68" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-29: 28 commits</title></rect>
|
||||
<rect x="402" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-01-30: 16 commits</title></rect>
|
||||
<rect x="402" y="92" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-01-31: 31 commits</title></rect>
|
||||
<rect x="414" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-02-01: 0 commits</title></rect>
|
||||
<rect x="414" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-02: 2 commits</title></rect>
|
||||
<rect x="414" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-03: 1 commit</title></rect>
|
||||
<rect x="414" y="56" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-02-04: 40 commits</title></rect>
|
||||
<rect x="414" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-05: 10 commits</title></rect>
|
||||
<rect x="414" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-06: 8 commits</title></rect>
|
||||
<rect x="414" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-07: 1 commit</title></rect>
|
||||
<rect x="426" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-08: 6 commits</title></rect>
|
||||
<rect x="426" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-09: 2 commits</title></rect>
|
||||
<rect x="426" y="44" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-02-10: 27 commits</title></rect>
|
||||
<rect x="426" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-11: 6 commits</title></rect>
|
||||
<rect x="426" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-12: 10 commits</title></rect>
|
||||
<rect x="426" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-13: 2 commits</title></rect>
|
||||
<rect x="426" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-02-14: 0 commits</title></rect>
|
||||
<rect x="438" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-15: 1 commit</title></rect>
|
||||
<rect x="438" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-16: 1 commit</title></rect>
|
||||
<rect x="438" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-17: 3 commits</title></rect>
|
||||
<rect x="438" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-18: 1 commit</title></rect>
|
||||
<rect x="438" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-19: 4 commits</title></rect>
|
||||
<rect x="438" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-20: 4 commits</title></rect>
|
||||
<rect x="438" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-02-21: 0 commits</title></rect>
|
||||
<rect x="450" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-22: 1 commit</title></rect>
|
||||
<rect x="450" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-23: 2 commits</title></rect>
|
||||
<rect x="450" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-24: 4 commits</title></rect>
|
||||
<rect x="450" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-25: 5 commits</title></rect>
|
||||
<rect x="450" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-26: 2 commits</title></rect>
|
||||
<rect x="450" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-27: 9 commits</title></rect>
|
||||
<rect x="450" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-02-28: 19 commits</title></rect>
|
||||
<rect x="462" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-01: 9 commits</title></rect>
|
||||
<rect x="462" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-02: 10 commits</title></rect>
|
||||
<rect x="462" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-03: 2 commits</title></rect>
|
||||
<rect x="462" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-03-04: 0 commits</title></rect>
|
||||
<rect x="462" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-05: 14 commits</title></rect>
|
||||
<rect x="462" y="80" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-03-06: 29 commits</title></rect>
|
||||
<rect x="462" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-07: 10 commits</title></rect>
|
||||
<rect x="474" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-08: 19 commits</title></rect>
|
||||
<rect x="474" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-09: 2 commits</title></rect>
|
||||
<rect x="474" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-10: 20 commits</title></rect>
|
||||
<rect x="474" y="56" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-03-11: 27 commits</title></rect>
|
||||
<rect x="474" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-03-12: 0 commits</title></rect>
|
||||
<rect x="474" y="80" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-03-13: 37 commits</title></rect>
|
||||
<rect x="474" y="92" width="10" height="10" rx="2" ry="2" fill="#30a14e"><title>2026-03-14: 49 commits</title></rect>
|
||||
<rect x="486" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-15: 9 commits</title></rect>
|
||||
<rect x="486" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-16: 17 commits</title></rect>
|
||||
<rect x="486" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-17: 21 commits</title></rect>
|
||||
<rect x="486" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-18: 14 commits</title></rect>
|
||||
<rect x="486" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-19: 10 commits</title></rect>
|
||||
<rect x="486" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-20: 16 commits</title></rect>
|
||||
<rect x="486" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-21: 7 commits</title></rect>
|
||||
<rect x="498" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-03-22: 0 commits</title></rect>
|
||||
<rect x="498" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-23: 1 commit</title></rect>
|
||||
<rect x="498" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-24: 19 commits</title></rect>
|
||||
<rect x="498" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-25: 9 commits</title></rect>
|
||||
<rect x="498" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-26: 7 commits</title></rect>
|
||||
<rect x="498" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-03-27: 0 commits</title></rect>
|
||||
<rect x="498" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-03-28: 0 commits</title></rect>
|
||||
<rect x="510" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-29: 2 commits</title></rect>
|
||||
<rect x="510" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-30: 9 commits</title></rect>
|
||||
<rect x="510" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-03-31: 6 commits</title></rect>
|
||||
<rect x="510" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-01: 1 commit</title></rect>
|
||||
<rect x="510" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-02: 14 commits</title></rect>
|
||||
<rect x="510" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-03: 18 commits</title></rect>
|
||||
<rect x="510" y="92" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-04-04: 28 commits</title></rect>
|
||||
<rect x="522" y="20" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-04-05: 24 commits</title></rect>
|
||||
<rect x="522" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-06: 6 commits</title></rect>
|
||||
<rect x="522" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-07: 1 commit</title></rect>
|
||||
<rect x="522" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-08: 2 commits</title></rect>
|
||||
<rect x="522" y="68" width="10" height="10" rx="2" ry="2" fill="#216e39"><title>2026-04-09: 86 commits</title></rect>
|
||||
<rect x="522" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-10: 6 commits</title></rect>
|
||||
<rect x="522" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-11: 14 commits</title></rect>
|
||||
<rect x="534" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-12: 2 commits</title></rect>
|
||||
<rect x="534" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-13: 14 commits</title></rect>
|
||||
<rect x="534" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-14: 6 commits</title></rect>
|
||||
<rect x="534" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-15: 20 commits</title></rect>
|
||||
<rect x="534" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-16: 3 commits</title></rect>
|
||||
<rect x="534" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-17: 1 commit</title></rect>
|
||||
<rect x="534" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-04-18: 0 commits</title></rect>
|
||||
<rect x="546" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-19: 6 commits</title></rect>
|
||||
<rect x="546" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-20: 3 commits</title></rect>
|
||||
<rect x="546" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-21: 4 commits</title></rect>
|
||||
<rect x="546" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-22: 1 commit</title></rect>
|
||||
<rect x="546" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-23: 2 commits</title></rect>
|
||||
<rect x="546" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-24: 10 commits</title></rect>
|
||||
<rect x="546" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-25: 7 commits</title></rect>
|
||||
<rect x="558" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-26: 2 commits</title></rect>
|
||||
<rect x="558" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-27: 1 commit</title></rect>
|
||||
<rect x="558" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-04-28: 0 commits</title></rect>
|
||||
<rect x="558" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-04-29: 0 commits</title></rect>
|
||||
<rect x="558" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-04-30: 3 commits</title></rect>
|
||||
<rect x="558" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-01: 1 commit</title></rect>
|
||||
<rect x="558" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-02: 10 commits</title></rect>
|
||||
<rect x="570" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-05-03: 0 commits</title></rect>
|
||||
<rect x="570" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-04: 7 commits</title></rect>
|
||||
<rect x="570" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-05: 1 commit</title></rect>
|
||||
<rect x="570" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-06: 4 commits</title></rect>
|
||||
<rect x="570" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-07: 1 commit</title></rect>
|
||||
<rect x="570" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-08: 4 commits</title></rect>
|
||||
<rect x="570" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-09: 5 commits</title></rect>
|
||||
<rect x="582" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-10: 6 commits</title></rect>
|
||||
<rect x="582" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-11: 4 commits</title></rect>
|
||||
<rect x="582" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-12: 1 commit</title></rect>
|
||||
<rect x="582" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-05-13: 0 commits</title></rect>
|
||||
<rect x="582" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-05-14: 0 commits</title></rect>
|
||||
<rect x="582" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-15: 16 commits</title></rect>
|
||||
<rect x="582" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-16: 14 commits</title></rect>
|
||||
<rect x="594" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-17: 1 commit</title></rect>
|
||||
<rect x="594" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-18: 5 commits</title></rect>
|
||||
<rect x="594" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-05-19: 0 commits</title></rect>
|
||||
<rect x="594" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-20: 11 commits</title></rect>
|
||||
<rect x="594" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-21: 19 commits</title></rect>
|
||||
<rect x="594" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-22: 2 commits</title></rect>
|
||||
<rect x="594" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-23: 2 commits</title></rect>
|
||||
<rect x="606" y="20" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-05-24: 0 commits</title></rect>
|
||||
<rect x="606" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-25: 1 commit</title></rect>
|
||||
<rect x="606" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-26: 20 commits</title></rect>
|
||||
<rect x="606" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-27: 9 commits</title></rect>
|
||||
<rect x="606" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-05-28: 0 commits</title></rect>
|
||||
<rect x="606" y="80" width="10" height="10" rx="2" ry="2" fill="#40c463"><title>2026-05-29: 23 commits</title></rect>
|
||||
<rect x="606" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-30: 8 commits</title></rect>
|
||||
<rect x="618" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-05-31: 19 commits</title></rect>
|
||||
<rect x="618" y="32" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-01: 3 commits</title></rect>
|
||||
<rect x="618" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-02: 8 commits</title></rect>
|
||||
<rect x="618" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-03: 21 commits</title></rect>
|
||||
<rect x="618" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-04: 12 commits</title></rect>
|
||||
<rect x="618" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-05: 7 commits</title></rect>
|
||||
<rect x="618" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-06: 7 commits</title></rect>
|
||||
<rect x="630" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-07: 4 commits</title></rect>
|
||||
<rect x="630" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-06-08: 0 commits</title></rect>
|
||||
<rect x="630" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-09: 10 commits</title></rect>
|
||||
<rect x="630" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-10: 19 commits</title></rect>
|
||||
<rect x="630" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-11: 10 commits</title></rect>
|
||||
<rect x="630" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-12: 15 commits</title></rect>
|
||||
<rect x="630" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-13: 8 commits</title></rect>
|
||||
<rect x="642" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-14: 5 commits</title></rect>
|
||||
<rect x="642" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-06-15: 0 commits</title></rect>
|
||||
<rect x="642" y="44" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-16: 2 commits</title></rect>
|
||||
<rect x="642" y="56" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-17: 1 commit</title></rect>
|
||||
<rect x="642" y="68" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-18: 10 commits</title></rect>
|
||||
<rect x="642" y="80" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-19: 1 commit</title></rect>
|
||||
<rect x="642" y="92" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-20: 6 commits</title></rect>
|
||||
<rect x="654" y="20" width="10" height="10" rx="2" ry="2" fill="#9be9a8"><title>2026-06-21: 10 commits</title></rect>
|
||||
<rect x="654" y="32" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-06-22: 0 commits</title></rect>
|
||||
<rect x="654" y="44" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-06-23: 0 commits</title></rect>
|
||||
<rect x="654" y="56" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-06-24: 0 commits</title></rect>
|
||||
<rect x="654" y="68" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-06-25: 0 commits</title></rect>
|
||||
<rect x="654" y="80" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-06-26: 0 commits</title></rect>
|
||||
<rect x="654" y="92" width="10" height="10" rx="2" ry="2" fill="#ebedf0"><title>2026-06-27: 0 commits</title></rect>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
Binary file not shown.
@@ -55,18 +55,44 @@ def weekday_row(day):
|
||||
return (day.weekday() + 1) % 7
|
||||
|
||||
|
||||
def month_labels(start, end):
|
||||
labels = [(0, start.strftime("%b"))]
|
||||
total_weeks = ((end - start).days // 7) + 1
|
||||
def month_labels(grid_start, visible_start, grid_end):
|
||||
labels = []
|
||||
total_weeks = ((grid_end - grid_start).days // 7) + 1
|
||||
first_visible_month = visible_start.strftime("%b")
|
||||
first_visible_week = ((visible_start - grid_start).days // 7)
|
||||
|
||||
for week in range(total_weeks):
|
||||
week_start = start + timedelta(days=week * 7)
|
||||
week_start = grid_start + timedelta(days=week * 7)
|
||||
label = None
|
||||
|
||||
for offset in range(7):
|
||||
day = week_start + timedelta(days=offset)
|
||||
if day.day == 1 and week != 0:
|
||||
labels.append((week, day.strftime("%b")))
|
||||
if day < visible_start:
|
||||
continue
|
||||
|
||||
if day.day == 1:
|
||||
label = day.strftime("%b")
|
||||
break
|
||||
|
||||
if week == first_visible_week and not labels:
|
||||
next_month_close = False
|
||||
for future_week in range(week + 1, min(week + 3, total_weeks)):
|
||||
future_start = grid_start + timedelta(days=future_week * 7)
|
||||
for offset in range(7):
|
||||
day = future_start + timedelta(days=offset)
|
||||
if day >= visible_start and day.day == 1:
|
||||
next_month_close = True
|
||||
break
|
||||
if next_month_close:
|
||||
break
|
||||
|
||||
if not next_month_close:
|
||||
label = first_visible_month
|
||||
|
||||
if label is not None:
|
||||
if not labels or labels[-1][1] != label:
|
||||
labels.append((week, label))
|
||||
|
||||
return labels
|
||||
|
||||
|
||||
@@ -108,7 +134,7 @@ def generate_svg(data):
|
||||
'</style>',
|
||||
]
|
||||
|
||||
for week, label in month_labels(aligned_start, aligned_end):
|
||||
for week, label in month_labels(aligned_start, start, aligned_end):
|
||||
x = LEFT_PAD + (week * CELL)
|
||||
svg.append(f'<text x="{x}" y="10">{label}</text>')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user