Skip to content

Engineering platform

Soga platform

R&D leadership for a long-lived internal platform: hexagonal Laravel services, Python workers, and an architecture pack that new work has to follow.

Head of Software Research and Development · Soga SAS · June 2019 — Present

LaravelPHPPythonRedis StreamsMySQLDockerKubernetesNginxHelm
Backend split
Laravel domain · Python pipelines
Integration
Events and gateway — not shared Eloquent
Delivery
Docker · Kubernetes · Helm

Overview

Soga is where the engineering platform is decided: how Laravel services are sliced, how Python workers run, what a stream payload looks like, and what is not allowed to cross a boundary.

The role combines team coordination, budget, architecture, and research. ProCrédito v2 is the most visible product on that platform; the platform is the set of rules that keep the next product from becoming a second monolith.

Standards live in an architecture pack — layers and slices, Laravel service layout, Python worker template, Redis Streams conventions, contracts, Docker and Kubernetes — not as folklore in service READMEs.

Problem

A private platform absorbs every process exception unless someone owns the model. Feature delivery without an architecture function produces shared databases, HTTP on workers, and magic strings for field names.

Research that does not change a decision is reading. The problem is to evaluate technology against a running system — and to fund only the bets that change how the next service is born.

Cross-service shortcuts (shared Eloquent, a FastAPI monolith for the obligation pipeline, business rules in the gateway) look fast and make every later change a coordination tax.

Constraints

Domain code does not import Laravel, Eloquent, Redis, or HTTP. Use cases depend on ports; Eloquent stays in infrastructure adapters.

New Laravel work goes to Application/Slices/{FeatureName}. New Python obligation logic goes to domain/ and processors/, wired in consumers/runtime.py. Internal workers do not grow an HTTP API.

Expected authorization denials are PolicyDecision + ErrorCode. Framework exceptions are for unexpected failure, not for “this user cannot do that.”

Architecture

The platform is a layered hexagon: Infrastructure → Application → Domain. Products are born as Laravel services with JSON:API slices, or as Python stream consumers, not as a new framework per team.

Redis Streams are the async backbone. Payloads and stream names are contracts. Idempotency is designed in; at-least-once delivery is assumed.

Delivery is containerized: Docker images, Nginx, Kubernetes, Helm for migrate jobs. The cluster is the runtime. It does not define bounded contexts.

Architecture

Soga — platform rules, product services

Architecture pack

Slices · contracts · streams

ProCrédito v2

Internal products

Laravel services

Python workers

Redis Streams

API Gateway

Kubernetes

Docker · Helm · Nginx

Architecture pack as the constraint. Laravel services and Python workers are born from the same rules. Events and the gateway are the only legal crossings.

Key decisions

Personal experience

Write the architecture pack; do not copy it into every README

When the rule changes, the pack changes. Service READMEs that restate hexagonal architecture drift and then contradict each other.

Personal experience

Laravel for the domain, Python for the hot pipeline

A FastAPI or Django monolith for obligation processing would duplicate the domain. Workers transform; they do not become the system of record.

Personal experience

Treat R&D as a leadership function

Budget, staffing, and the next architectural bet sit with people who still own delivery. A separate architecture office that does not ship will be ignored.

Trade-offs

Gained

New services start from the same slices, ports, and stream contracts. Research has a path into production, and a path to “no.”

Sacrificed

Less isolation between research and the next operational request. Every architectural rule is a constraint the team must keep paying.

Personal experience

Technologies

LaravelPHPPythonRedis StreamsMySQLDockerKubernetesNginxHelm

Results

The platform rules are the ones ProCrédito v2 and later services follow: hexagonal Laravel, Python stream workers, contracts, Kubernetes.

The obligation pipeline is the proof that the split works: high-volume processing without moving the aggregate into a worker framework.

Headcount, budget figures, and module counts are not published here.

Lessons learned

Architecture in an internal platform is mostly the art of saying no with a reason. Shared Eloquent and HTTP-on-workers are the shortcuts that come back as incidents.

Technology research is only useful if it changes a decision. Reading about a tool is not R&D; changing the system’s shape, or choosing not to, is.

A pack that is not used in the next slice is documentation. A pack that rejects a pull request is architecture.