circonflex

Freelance Python and Django backend developer, based in Barcelona. Code that holds up first, AI agents second. FastAPI, Flask and Go, then Pydantic AI and MCP servers.

Djangocontact/serializers.py
class ContactRequestSerializer(serializers.Serializer):
    email = serializers.EmailField()
    mission = serializers.ChoiceField(choices=Mission.choices)
    message = serializers.CharField(min_length=10)


def test_rejects_a_short_message(api_client):
    response = api_client.post("/api/contact/", {"message": "too short"})
    assert response.status_code == 400
Pythoncontact/api.py
class ContactRequest(BaseModel):
    email: EmailStr
    mission: Mission
    message: str = Field(min_length=10)


@app.post("/api/contact", status_code=202)
async def contact(request: ContactRequest, mailer: Mailer = Depends(get_mailer)):
    await mailer.send(request)
    return {"sent": True}
Gocontact/request.go
func (r ContactRequest) Validate() error {
	if _, err := mail.ParseAddress(r.Email); err != nil {
		return fmt.Errorf("email: %w", err)
	}
	if utf8.RuneCountInString(r.Message) < 10 {
		return errors.New("message: too short")
	}
	return nil
}

Python, Go and AI-native backend services

ServiceWhat you get
Python
DJANGODRFNINJAREST APIs with Django REST Framework or Django Ninja, designed or taken over, tested and documented.
FASTAPITyped async services with Pydantic and generated OpenAPI docs.
FLASKLightweight services, or taking over and migrating an existing application.
Go
GO SERVICESFast, lean Go services held to the same standard of tests and architecture.
Architecture and quality
HEXAGONALDDDBusiness logic isolated from the framework, when the domain calls for it.
REFACTORINGTDDA cleaned-up codebase: SOLID, Clean Code, tests first.
AI-native
PYDANTIC AI AGENTSAI agents inside your product, with validated and tested outputs.
MCP SERVERSYour data and tools exposed to models, with permissions under control.

AI rests on a frame. I build the frame first.

An agent plugged into a fragile codebase mostly speeds up the bugs. Like a roof truss, a project holds because each piece takes a specific load.

A roof truss shaped like a circumflex accent. Its structural pieces are SOLID, YAGNI, tests, hexagonal architecture and the frameworks. The ridge carries Pydantic AI agents and MCP servers.SOLID · CLEAN CODEYAGNI · KISSTESTS FIRST: TDD, PYTESTHEXAGONAL · DDDDJANGO · FLASKFASTAPI · GOPYDANTIC AI AGENTS · MCP SERVERS
RaftersSOLID, Clean Code, YAGNI
Clear responsibilities and dependencies that point the right way.
Tie beamTDD, pytest
Tests hold the whole thing together. Red, green, refactor, in small steps.
King postHexagonal architecture, DDD
The domain at the center. Everything else hangs on it, never the other way round.
StrutsDjango, FastAPI, Flask, Go
Frameworks carry the load down to the domain. They don't hold up the roof.
RidgePydantic AI, MCP
Agents with typed, validated outputs, resting on a structure that doesn't move.

Hover a piece to see it in the truss.

I write about what I practice

Technical articles on dev-flow.io: Django and its ORM, TDD, architecture, deployment.

Read all articles on dev-flow.io

A project that needs a frame?

Describe the context: your current stack, team size, deadline. The more concrete it is, the more concrete my first answer will be.

Circonflex, backend development

Type of project