Software engineer
Based in Italy - working globally

I BUILD DIGITAL SYSTEMS THAT FEEL OBVIOUS AFTER THEY EXIST.

Currently building / shipping / experimenting Laravel · Vue · React · TypeScript · AI systems · SaaS
01DESIGN
02ARCHITECTURE
03BUILD
04SHIP
Portrait of Lenildo Santos
Subject — Lenildo Santos Status — Online

About

Software engineer. Product thinker. Builder of digital systems.

I work between product design and engineering, turning ambiguous ideas into software that can actually survive contact with real users.

Most of my work starts with a messy problem and ends with a system people don't have to think about. I favour boring, well-tested infrastructure over clever tricks — the excitement should be in what the product does, not in how fragile it is underneath.

Location
Italy / Portugal
Focus
Product / SaaS / Systems
Current
Building digital products
Tools
Laravel / Vue / TypeScript / AI
01

Make complexity disappear.

02

Design before decoration.

03

Ship something real.

04

Automate the boring part.

05

Build for the second version.

SoftBox Studio

AI-powered application builder

Project
Platform / AI tooling
Role
Product + engineering
Stack
Laravel / Vue / MySQL / LLM APIs

STRUCTURED OUTPUT, NOT FREE-FORM.

The problem

Turning an idea into working, owned software still starts with a blank editor. Non-technical founders and fast-moving builders either pay for a closed no-code tool they cannot leave, or wait weeks for scaffolding. SoftBox Studio closes that gap: describe the app in chat, watch an AI plan and build it, then refine it visually and export real, deployable Laravel + Vue code.

The approach

The core design decision was making the AI output structured and reversible, not free-form. Every turn returns a JSON action protocol (create_page, generate_crud, update_theme, update_database) applied transactionally, so partial failures cannot corrupt a project. A dedicated Context Engine compiles the whole application's memory into each system prompt, so the AI always reasons over the full app rather than a single page. Providers sit behind an AiProvider contract (multiple hosted LLM APIs, local OpenCode, and a keyless offline Fake), and every page is a JSON block tree rendered by the frontend - templates are never edited directly.

Outcome

Phases 1 and 2 shipped: visual builder, version history with undoable snapshots, a three-tier component registry (30 primitives, 26 sections, 6 page templates), specialized agents (planner, architect, developer, designer, reviewer), a visual Database Designer, a Workflow Builder, and a Monaco-based code explorer that renders a real Laravel + Vue codebase with generated Pest tests. Phase 3 (multi-agent collaboration, Git integration, deploy, marketplace) is on the roadmap.

Highlights

Queue-backed multi-turn auto-continuation with a rotating token to abort stale chains, solving PHP timeouts and runaway loops · Fully demoable with no API key via a deterministic offline provider · OpenCode local-AI server, Reverb WebSockets, project export, and a self-deploy admin panel

SoftBox Sales

AI-assisted procurement & sourcing platform

Project
Product / SaaS - SoftBox suite
Role
Product + engineering
Stack
Laravel / Vue / MySQL / LLM APIs

SHOW THE MATH, NOT JUST THE ANSWER.

The problem

B2B hardware sourcing is a spreadsheet-and-email grind: gather requirements, chase suppliers for quotes, normalize wildly inconsistent PDFs and spreadsheets, weigh price against quality and delivery, award, then track the purchase and payments across disconnected files. SoftBox Sales puts the whole cycle - supplier to RFQ to quotes to comparison to award to purchase order to payments to KPIs - into one system, with AI doing the reading.

The approach

The backbone is an explicit RFQ state machine (draft to open to comparing to awarded to closed, plus cancel and reopen) with every transition audited. Comparison uses a transparent weighted model (60% price / 25% delivery / 15% warranty, min-max normalized to 0-100) that flags the top supplier as recommended rather than hiding the math. AI quote extraction reads PDF, CSV, XLSX and TXT into structured line items on a queued job, always with human review before the numbers count. AI is mock-first: contract bindings swap the real LLM implementation for deterministic fakes when no key is present, so dev and CI never depend on a paid API. Every call is cost-logged, and all domain tables are scoped by organization_id for multi-tenancy.

Outcome

Running in production at sales.softbox.work, behind a full VPS runbook (nginx, php8.4-fpm, MySQL, Redis, Supervisor, certbot). The codebase holds roughly 36 migrations, 27 models and 5 policies, with about 30 unit and feature test files, Larastan level 5, and Pint.

Highlights

Price-anomaly detection flags quotes more than 15% off median · Conversational assistant with tool-use over 5 procurement tools (up to 5 reasoning rounds) · Hybrid research solved a chat tool-cap limitation with a queued, per-item research UI on self-hosted SearXNG

SoftBox CRM

Modular, AI-augmented CRM platform

Project
Product / SaaS - SoftBox suite
Role
Product + engineering
Stack
Laravel / Vue / MySQL

EVERY CAPABILITY IS A MODULE.

The problem

SMBs outgrow starter CRMs fast, then face a painful migration to an enterprise platform. SoftBox CRM was designed as a modular platform that scales from about 5 to about 500 users without a re-platform - every capability is a module you can enable or disable.

The approach

It is a modular monolith: each of 23 features ships as a self-contained module carrying its own routes, migrations, services, models, policies and tests, auto-discovered at boot by a ModuleServiceProvider and gated by config/modules.php. The frontend mirrors the same structure with lazy-loaded Vue pages and Pinia stores. The API is versioned (api/v1/), auth is Sanctum, and RBAC plus team_id multi-tenancy are built in. To avoid AI lock-in, all LLM calls route through an LLMProvider strategy (multiple hosted and local providers); per-module AI services (Sales, Emails, Deals, Analytics, Automation, Support) share one AiService, and prompts use schema-rich JSON to keep outputs reliable.

Outcome

By the numbers: 102 models, 100 controllers, 50 services, 75 migrations, 108 Vue pages and 30 stores, backed by 54 PHPUnit test files across 15 feature-module suites plus core Unit/Feature suites on SQLite in-memory.

Highlights

Automation engine with triggers, conditions and 10 action types · AI lead scoring, next-best-action and sentiment analysis · Omnichannel gateway abstraction (Twilio / mailgun) and an RFQ-to-procurement module · White-label platform module and mobile PWA

SoftBox Projects

Client project-management platform

Project
Product / SaaS - SoftBox suite
Role
Product + engineering
Stack
Laravel / Vue / MySQL

VISIBILITY WITHOUT EXPOSURE.

The problem

Agencies need one place to run every client engagement - requirements, roadmap, feature specs, reports and delivery - while giving clients graded visibility into progress without exposing internal analytics. The tool had to run anywhere with zero host setup.

The approach

Built as a Laravel 13 + Vue 3 (Inertia) app that runs entirely in Docker - seven services, with every command wrapped in Make targets and UID/GID passthrough so bind mounts stay writable. Visibility is handled by per-role share links (client / stakeholder / internal), each with its own PIN and visibility level; the client link hides analytics, and PIN attempts are throttled so even a correct PIN is blocked after repeated failures. External clients get a separate magic-link portal on its own auth guard.

Outcome

Hardened through an explicit security pass that found and fixed 1 critical, 3 high and 5 medium issues (stored XSS via v-html, hardcoded seeder secrets). The test suite grew from 47 to 155 passing tests with 537 assertions across more than 100 commits, with 944 imported test results tracked across four platforms. Exports cover CSV, XLSX, PDF and Markdown.

Highlights

Fixed a subtle AI job retry cascade by enforcing a precise invariant (retry_after > timeout > HTTP timeout) with WithoutOverlapping · AI document transforms (translate / improve / summarize) with a review-first apply flow · PWA install, Chart.js analytics and a Tiptap document editor

Tavolando

All-in-one restaurant management panel

Project
Product / SaaS
Role
Product + engineering
Stack
Laravel / React / PostgreSQL

REAL-TIME, DOWN TO THE CENT.

The problem

An Italian restaurateur runs the floor from paper, Excel, phone calls and sticky notes. Reservations live in one place, the menu in another, orders shouted to the kitchen, and the bill juggled at the counter. Tavolando replaces all of it with one real-time panel that mirrors the actual rhythm of an Italian service - from first booking to last bill.

The approach

Everything is real-time: 13 broadcast events fan out across Sala (floor map), Cucina (kitchen display) and Cameriere (waiter app) over private restaurant-scoped channels via Echo/Reverb. The product is Italian-first and treats money as integer cents throughout. The UI composes from a workspace design system package (57 primitives) whose tokens.json is the single source of truth, and the marketing landing is config-driven from the same config the app uses, so product truth is never duplicated.

Outcome

70 tests and 80 migrations back 12 kitchen and floor pages, with real product screenshots rather than mockups. Pricing ships at 0 / 49 / 79 EUR, and the distinctive editorial landing shipped. A full rebrand from Tavolta to Tavolando swept roughly 150 files and 2,900 occurrences across four registered domains.

Highlights

Money-integrity fixes: cancelled-item resurrection, correct 10% vs 22% VAT, discount overflow, and idempotent payments (409 + client key) · Realtime done safely: optimistic UI reconciled against the server with rollback and a polling/SSE fallback · Draggable, shaped floor plan built on pointer events with no canvas library · Accessibility-driven: a lime token at 6.62:1 contrast replaced a failing chart color

Millesimo

Condominium management micro-SaaS

Project
Product / SaaS
Role
Product + engineering
Stack
Laravel / Vue / MySQL / Stripe

TOO BIG FOR A SPREADSHEET, TOO SMALL FOR ENTERPRISE.

The problem

Small Italian condominiums (4-20 units) are too big for a spreadsheet and too small for enterprise property software. Millesimo gives them one affordable place for shared expenses, communications, documents and payments - with a freemium model that scales with the building.

The approach

An Italian-first Laravel + Vue (Inertia) app with MySQL, Redis and Stripe Cashier. The heart is an ExpenseSplitService supporting millesimal, equal-share and fixed-monthly splitting, each with fallbacks when totals are zero. Business logic is cleanly separated - 13 models and 31 controllers (13 API) with policies, form requests and scoped bindings, plus 10 PHP enums. A companion Flutter mobile client (15 feature modules) authenticates via Sanctum bearer tokens.

Outcome

Ten MVP features shipped across 24 Vue pages and 14 tables. Subscription billing runs on signed Stripe webhooks covering checkout, subscription updates, payment success/failure and downgrade-to-free on cancellation; annual fee generation is idempotent and skips existing months. Plans ship at Free / 5 / 15 EUR with unit caps of 4 / 10 / 20.

Highlights

Fixed real performance and security debt: N+1 queries, a missing Cashier Billable trait, v-html XSS and missing cascade deletes · Multi-condominium switching with quick tenant context · Financial reporting by month, category and unit; demo captured via Playwright and assembled into a 1080p walkthrough

MassimAI

Legal intelligence for Supreme Court rulings

Project
Product / AI SaaS
Role
Product + engineering
Stack
Laravel / Vue / MySQL / Redis

IF THE AI FAILS, THE SCORE DOESN'T.

The problem

Italian legal professionals cannot track the roughly 424,000-document archive of the Corte Suprema di Cassazione by hand, yet a small fraction of rulings - especially those signalling nomofilachia (law-shaping) weight - matter far more than the rest. MassimAI monitors the archive, ranks each ruling by a 'could become law' score, and summarizes it.

The approach

Reliability was the guiding constraint. A transparent heuristic scorer runs synchronously on ingest, using weighted, human-readable signals (Sezioni Unite, referrals to a joint section, constitutional questions, questione di massima) so every ruling always has a defensible score. AI enrichment (massima and topics) runs as a best-effort async job that never blocks ingestion - if the provider fails, the row keeps its heuristic score. The crawler is deliberately polite: a 1,500 ms throttle, a contact-bearing user agent, exponential backoff with a kill switch, and a resumable page-cursor backfill. Before any text reaches the AI, PII is pseudonymized and rehydrated afterward; the mapping is never persisted.

Outcome

115 backend test methods across 28 files and 137 frontend tests across 23 files run in CI, over 14 migrations, 26 routes and 8+ artisan commands. Search runs on MySQL FULLTEXT with a SQLite LIKE fallback for tests. Ingestion is scheduled (6-hourly fetch, weekly re-fetch/prune, daily 08:00 watchlist alerts).

Highlights

Compliance-first: a documented legitimate-interest assessment, 365-day retention, a delist-vs-GDPR-erase split, a 30-day SLA, and a weekly delist sweep that strips text but keeps the score · Dual scoring behind one interface with deterministic fallback so ingestion never breaks · Watchlists and saved filters driving new high-band-ruling alerts

Product
  • Laravel
  • Vue
  • React
  • TypeScript
Systems
  • MySQL
  • PostgreSQL
  • Redis
  • REST APIs
Infrastructure
  • Linux
  • Docker
  • Cloudflare
  • CI/CD
AI
  • LLM APIs
  • AI workflows
  • Agents
  • Automation
2025—

Full Stack Developer

Athomos — Pescara, Abruzzo, Italy
+
Full-time, on-site. Working across PHP and Laravel, alongside a handful of other tools brought in as each project needs them. 1 year 4 months in, and counting.
2013—2025

Senior PHP Developer & Technology Innovation

InvoCorp — Lisbon, Portugal
+
Full-time, remote. Laravel and Node.js at the core, with close to twenty other skills picked up along the way. 11 years 9 months — the longest chapter so far, and the one that shaped how I build.
2009—2012

Technical Support & PHP Developer

Claranet Portugal (@Esoterica) — Lisbon, Portugal
+
Full-time, on-site at Av. D. João II, Lisbon. Where it started — technical support and PHP development for Esoterica. 3 years 11 months.