https://github.com/greatstrength/tiferet
Build an app, the beautiful way.
https://github.com/greatstrength/tiferet
design-patterns domain-driven-design esoteric software software-development software-engineering
Last synced: 3 months ago
JSON representation
Build an app, the beautiful way.
- Host: GitHub
- URL: https://github.com/greatstrength/tiferet
- Owner: greatstrength
- License: bsd-3-clause
- Created: 2024-04-23T22:53:38.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2026-03-27T01:53:12.000Z (3 months ago)
- Last Synced: 2026-03-27T07:19:43.134Z (3 months ago)
- Topics: design-patterns, domain-driven-design, esoteric, software, software-development, software-engineering
- Language: Python
- Homepage:
- Size: 1.93 MB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Agents: AGENTS.md
Awesome Lists containing this project
README
# Tiferet – Domain-Driven Design, beautifully balanced
[](https://pypi.org/project/tiferet/)
[](https://pypi.org/project/tiferet/)
[](LICENSE)
**Tiferet** is a Python framework that brings **Domain-Driven Design** into focus with elegance and clarity.
Inspired by the Kabbalistic principle of harmony and beauty in balance, Tiferet helps you turn complex business logic into maintainable, configuration-driven applications — where purpose, structure, and execution feel naturally aligned.
### At a glance
- Domain events as the core unit of behavior
- YAML for features, workflows, dependency injection, errors, CLI commands
- Clean layering: domain objects • aggregates • transfer objects • services
- Structured, multilingual errors built-in
- Easy to extend to CLI, web, scripts, TUI, …
Current status: **2.0.0a8** (pre-release – actively evolving toward stable v2)
## Quick Start – Add two numbers in ~3 minutes
```bash
# 1. Set up environment
python3 -m venv tiferet-demo && source tiferet-demo/bin/activate
pip install tiferet
```
Create these files in your project folder:
**demo.py**
```python
from tiferet import App
app = App() # loads configs from app/configs/ by default
result = app.run(
interface_id="basic_calc",
feature_id="calc.add",
data={"a": 19, "b": 23}
)
print(f"19 + 23 = {result}") # → 42
```
**app/configs/app.yml**
```yaml
interfaces:
basic_calc:
name: Basic Calculator
```
**app/configs/feature.yml**
```yaml
features:
calc:
add:
name: Add Numbers
commands:
- service_id: add_number_event
```
**app/configs/di.yml**
```yaml
services:
add_number_event:
module_path: app.events.calc
class_name: AddNumber
```
**app/events/calc.py**
(the domain event itself – very minimal)
```python
from tiferet.events import DomainEvent
class AddNumber(DomainEvent):
def execute(self, a: int, b: int, **kwargs) -> int:
return a + b
```
Run:
```bash
python demo.py
```
You should see:
```
19 + 23 = 42
```
→ Want a full calculator (add, subtract, multiply, divide, sqrt, …) with CLI, validation and proper error handling?
→ Continue with the **[step-by-step Calculator Tutorial →](docs/tutorial/basic_calculator/index.md)**
## Why Tiferet?
- **Configuration as code** — features, DI, errors, CLI all live in YAML
- **Domain logic stays pure** — focused events & aggregates
- **Infrastructure is injectable** — file/db/utils behind clean service contracts
- **Built for evolution** — today CLI, tomorrow FastAPI or TUI
- **Strong testability** — events are easy to invoke in isolation
## Documentation & Guides
**Core architecture**
- [Code Style & Artifact Comments](docs/core/code_style.md)
- [Domain Objects](docs/core/domain.md)
- [Domain Events](docs/core/events.md)
- [Aggregates & Transfer Objects (Mappers)](docs/core/mappers.md)
- [Service Interfaces](docs/core/interfaces.md)
- [Contexts](docs/core/contexts.md)
- [Repositories](docs/core/repos.md)
- [Utilities (File/Yaml/Json/Csv/Sqlite)](docs/core/utils.md)
### Practical Guides
**Domain Guides**
- [Application Management](docs/guides/domain/app.md)
- [Dependency Injection](docs/guides/domain/di.md)
- [Feature Workflows](docs/guides/domain/feature.md)
- [Error Handling](docs/guides/domain/error.md)
- [CLI Integration](docs/guides/domain/cli.md)
- [Logging](docs/guides/domain/logging.md)
**Event Guides**
- [Application Events](docs/guides/events/app.md)
- [Dependency Injection Events](docs/guides/events/di.md)
- [Feature Events](docs/guides/events/feature.md)
- [Error Events](docs/guides/events/error.md)
- [CLI Integration Events](docs/guides/events/cli.md)
- [Logging Events](docs/guides/events/logging.md)
- [SQLite Events](docs/guides/events/sqlite.md)
**Utility Guides**
- [File Loader](docs/guides/utils/file.md)
- [YAML Loader](docs/guides/utils/yaml.md)
- [JSON Loader](docs/guides/utils/json.md)
- [CSV Loader](docs/guides/utils/csv.md)
- [Sqlite Connector](docs/guides/utils/sqlite.md)
**Other Component Guides**
- [Interfaces](docs/guides/interfaces.md)
- [Mappers (Aggregates & Transfer Objects)](docs/guides/mappers.md)
- [Repositories](docs/guides/repos.md)
**Tutorial**
→ [Build a complete Calculator (events + CLI + configs)](docs/tutorial/basic_calculator/index.md)
## Contributing
We welcome bug reports, documentation improvements, feature ideas, and early adopters.
See [CONTRIBUTING.md](CONTRIBUTING.md) for the workflow (issues → TRD → feature branch → PR).
Questions, feedback, or just want to say hi?
Open an issue or reach out via email: andrew@greatstrength.me
Let's build software that feels as good as it works.