My name is Dmitrii Safronov.
I build systems that survive their creators.
Repositories are artifacts. The interesting part is the topology between them.
- Contracts must be explicit and enforceable
- Configuration is part of the system contract
- Operational behavior must be observable
- Portability is a system property
- Observability is architecture, not tooling
- Schemas are operational artifacts
- Configuration is validated before execution
- Applications should not depend on reading their own runtime state
- Integration boundaries must be explicit
- State minimization is preferred over state synchronization
- Invalid configuration must fail fast
- Python: Logging objects with schema (library)
- ETL: prometheus2clickhouse
- AI tools
- Flux2 tools
- Helm charts
- Ansible roles
- Ansible templates
- Docker tools
- Dummy apps
- GitHub Actions
- Home Assistant
- Forks | Archived
To avoid maintaining shared workflows and configurations separately across repositories, changes are propagated through a hierarchy of versioned templates.
Dedicated synchronizers handle propagation, shown as edge labels in the diagram below.
flowchart TB
BT["basic-template"]
SBT["semantic-basic-template"]
SST["semantic-shell-template"]
SDT["semantic-docker-template"]
ART["ansible_role-template"]
APT["ansible_project-template"]
ULT["update_lists-template"]
TST["template_sync-template"]
BT -->|"template_sync-basic"| SBT
SBT -->|"template_sync-semantic-basic"| SST
SBT -->|"template_sync-semantic-basic"| SDT
SBT -->|"template_sync-semantic-basic"| ART
SBT -->|"template_sync-semantic-basic"| APT
SBT -->|"template_sync-semantic-basic"| ULT
SBT -->|"template_sync-semantic-basic"| TST
SBT -->|"template_sync-semantic-basic"| OM["opencode-memoir"]
SBT -->|"template_sync-semantic-basic"| DJ["django-telegram-q2"]
SBT -->|"template_sync-semantic-basic"| OH["omniroute-hybrid-setup"]
SBT -->|"template_sync-semantic-basic"| BM["… other repositories"]
SST -->|"template_sync-semantic-shell"| SIMPLE["simple-sandbox"]
SST -->|"template_sync-semantic-shell"| SHELL["shell-tools"]
SST -->|"template_sync-semantic-shell"| SM["… other repositories"]
SDT -->|"template_sync-semantic-docker"| SK["skilled"]
SDT -->|"template_sync-semantic-docker"| DM["… other repositories"]
ART -->|"template_sync-ansible_role"| ROLES["Ansible roles · …"]
APT -->|"template_sync-ansible_project"| PROJECTS["Ansible projects · …"]
ULT -->|"update_list-sync"| LISTS["List consumers · …"]
TST -->|"template_sync"| TS["template_sync-*"]
TST -->|"template_sync-template_sync"| TSM["Other synchronizers · …"]
classDef template fill:#dbeafe,stroke:#2563eb,color:#1e3a8a,stroke-width:2px
classDef receiver fill:#f3f4f6,stroke:#9ca3af,color:#111827
class BT,SBT,SST,SDT,ART,APT,ULT,TST template
class OM,DJ,OH,BM,SIMPLE,SHELL,SM,SK,DM,ROLES,PROJECTS,LISTS,TS,TSM receiver
Latest blog posts
- A working workaround isn’t always a good workaround
- Настройка доступа к Ingress нескольких кластеров Kubernetes, находящихся в сети за NAT
- Проходные выключатели без проводов
- Моё приложение для Android прошло государственную регистрацию
- Как отключить отображение системных пользователей на экране входа в систему (LightDM)




