I build the parts that are hard to undo
I care about the parts of software that are hard to undo. Schema design, tenancy boundaries, guard ordering, the contract between two services that will outlive whoever wrote them. Those decisions compound, and getting them right early is most of what separates a system that survives a year from one that gets rewritten.
Most of my day-to-day is backend: NestJS and Python services, Postgres and Prisma, queue workers, retrieval pipelines, and the security surface around all of it — auth, RBAC, rate limits, audit trails, webhook signature verification. I'm equally comfortable on the frontend when a product needs it; I just don't think that's where the interesting problems usually are.
The AI work I do is engineering, not prompting. Provider abstractions with deterministic offline mocks so tests don't hit an API. Model tiering that routes cheap requests to cheap models. Context assembly that degrades to empty instead of failing the stream when retrieval misses. Tools that call back into the core API with the user's own token, so the model physically cannot escape RBAC.
I'm a B.Sc. Software Engineering student at CODE University in Berlin, and I won the Porsche Digital Campus Challenge in the Customer Relations track. I'm looking for backend, platform, or applied-AI work — internship, working-student, or junior — where the systems are real and the constraints are honest.

- Based in
- Berlin, Germany · CET / UTC+1
- Studying
- B.Sc. Software Engineering, CODE University
- Focus
- Backend · Distributed systems · Applied AI
- Languages
- Tigrigna · Amharic · English · German
Open to work
Internship · Working student · Junior backend / platform / AI engineering
Six things I believe about building software
These are not slogans. Each one is a rule that changed how a specific system is built, and each one has a cost I can name.
Make the irreversible decisions slowly
Schema, tenancy model, auth, service boundaries. These are expensive to change and cheap to get right if you think first. UI patterns and prompts can iterate daily — they should.
Enforce invariants where they can't be forgotten
An audit trail should be append-only at the database level, not because everyone remembers not to touch it. A billing gate belongs in the request pipeline, not at the top of each handler. If correctness depends on someone remembering, it will eventually fail.
Degrade, don't collapse
Context assembly is best-effort at every layer: if RAG misses, if the graph query times out, if a phase rollup is empty, the stream still answers. A retrieval failure should cost quality, never availability.
Write the failure down
When an upstream SDK quietly dropped a parameter and broke a feature with no commit to blame, the fix shipped with a version ceiling, a comment explaining what its absence had cost, and a test matrix pinning the behaviour. The next person does not get to rediscover it.
Tests where they buy something
Unit specs where the logic is genuinely subtle, containers where the database is the thing under test, and a deterministic offline embedder so the AI suite runs without a network or a bill. Coverage measures which lines ran, not which behaviours are guaranteed.
Documentation is part of the change
The rule I hold myself to is that the relevant document gets updated in the same commit as the code — not afterwards, not in a cleanup pass. A spec that lies is worse than no spec.
Where I have been
Work, education and the one competition that is worth its own entry.
- May 2026— now
Engineering
Co-founder & CTO
PROM Software Systems · Berlin, Germany
Co-founded the company and lead the technical side of it: architecture, engineering and delivery across an AI-native product development platform of six deployables and 274k lines.
- Architected and built a NestJS modular monolith: 37 modules, 57 controllers, 337 REST endpoints, backed by a 69-model Prisma schema across 62 migrations.
- Designed the multi-tenancy model — organization_id on every business row, AsyncLocalStorage request context, per-module scope guards, and an append-only audit log enforced by Postgres rules rather than convention.
- Built a Python/FastAPI AI orchestration service with layered best-effort context assembly, model tier routing, output budgets and Redis idempotency, so retrieval failures degrade answers instead of breaking streams.
- Made RBAC bypass structurally impossible for the AI: tools call back into the Core API carrying the caller's own JWT, so every existing guard applies unchanged.
- Implemented retrieval on Postgres and pgvector — a vector(1024) HNSW cosine index over an entity/edge knowledge graph — behind an Embedder interface with a deterministic offline mock for tests.
- Shipped Stripe subscriptions, entitlements, trial pausing as a global guard, and per-call credit gating with raw-body webhook signature verification.
- Built the customer web app in Next.js 15 and React 19: 72 routes, 157 components, realtime over Socket.IO with a Redis adapter for multi-node fan-out.
- Published a CLI to npm that links a repo to a product and proxies the MCP server over stdio, giving coding agents live product context.
- Established the engineering gates: strict type-check as the primary CI signal, 89 Jest specs, a testcontainers integration tier, pytest against a mocked provider, and an OpenAPI codegen-drift check between the TypeScript and Python services.
TypeScriptNestJSPythonFastAPIPostgreSQLpgvectorPrismaRedisBullMQNext.jsReactDockerTurborepoStripeSocket.IOOpenTelemetryAnthropicMCPSee the work - Jun 2024— Dec 2025
Engineering
Full-stack Developer & Architect
SociaLink · Berlin, Germany
Built a unified operational data store for social activity with hybrid search and a store-aware natural language assistant.
- Designed a polyglot persistence layer — PostgreSQL for relations, MongoDB for raw documents, a vector store for semantics — rather than forcing one engine to cover all three access patterns.
- Implemented Bronze, Silver and Gold ingestion stages so raw payloads stay immutable and every enrichment is reproducible by replay rather than by patching production data.
- Built hybrid retrieval fusing lexical and vector results, which handles exact-name lookups and vague conceptual questions in the same query path.
- Ran async enrichment through Celery and Redis, and containerised the full stack so a clean machine is one compose command from working.
PythonDjangoDRFPostgreSQLMongoDBCeleryRedisLangChainDockerSee the work - Mar 2024— Jun 2024
Award
Engineer & System Architect — Team Barilla
Porsche Digital Campus Challenge · Berlin, Germany
Won the Customer Relations track with an AI-powered customer relations hub built around lossless human handover.
- Took first place in the Customer Relations category against competing university teams.
- Designed the agent workflow end to end: multi-modal intake, semantic retrieval over Porsche's own documentation and service records, tool-based lookups, satisfaction check, and escalation.
- Argued for and designed the escalation path first — the human agent inherits the full transcript, retrieved sources and the system's own confidence, so nothing the customer already said is repeated.
- Designed the CR staff console: live session tracking, resolution KPIs, and a queue ordered by urgency rather than arrival.
- Presented the final solution to Porsche Digital stakeholders.
PythonAWSVector databaseEmbeddingsRAGMulti-modal UXSee the work - Sep 2023— now
Education
B.Sc. Software Engineering
CODE University of Applied Sciences · Berlin, Germany
Project-based programme where assessment is a shipped artefact rather than an exam — software engineering, product thinking and interdisciplinary teamwork.
- Every module is delivered as a real project with a real defence, which is where most of my systems-design practice actually comes from.
- Focus areas: backend architecture, data systems, applied AI, and the product reasoning around them.
- Consistent collaboration across engineering, design and product tracks on interdisciplinary teams.
- Sep 2019— Dec 2020
Education
B.Sc. Software Engineering (foundations)
Mekelle University · Mekelle, Ethiopia
Computer science and software engineering fundamentals — algorithms, data structures, operating systems, databases.
- Grounding in the fundamentals that the applied work later rested on.
- Recognised with a formal academic recommendation for technical ability, teamwork and leadership.
- Tigrigna
- Native — first language
- Amharic
- Fluent — second language
- English
- Fluent — professional working proficiency
- German
- Conversational — actively improving