Por que os Modelos de IA “Open” Estão Ganhando Espaço em Relação aos Grandes Modelos de Linguagem (LLMs)

Todo mundo está falando sobre ChatGPT, Claude e Gemini. Mas enquanto o mercado corre atrás dos modelos fechados, CTOs e líderes de tecnologia estão silenciosamente migrando para uma estratégia muito mais poderosa: IA open-weight.

Neste artigo, mostro o que quase ninguém fala sobre os bastidores da IA corporativa:

  • o custo real de rodar modelos como Llama em produção,
  • por que muitas empresas estão abandonando o discurso “100% open source”,
  • os riscos ocultos de dependência de fornecedores,
  • soberania digital,
  • segurança de dados,
  • e a verdadeira guerra entre autonomia e conveniência na nova economia da inteligência artificial.

Depois de colocar os números na ponta do lápis em ambientes Nvidia Cloud e GCP, a conclusão foi muito diferente do hype vendido no LinkedIn.

Se você é CTO, arquiteto, engenheiro, fundador ou trabalha com IA corporativa, este conteúdo provavelmente vai mudar sua visão sobre modelos abertos, custos de inferência e estratégia de longo prazo.

Leia o artigo completo

Standing on shoulders: the stack that makes Floci start in ~24ms

Floci starts in 24ms and idles at 13 MiB of RAM.

That number gets attention, and it tends to obscure the real story. It isn’t about one clever optimization. It’s about four open-source projects that have been quietly perfecting their respective jobs for years, stacked on top of each other in a way that makes the whole thing possible.

Floci is a free, MIT-licensed AWS emulator. It speaks the AWS wire protocols on localhost:4566, emulates 45 services, and is verified by 1,925 SDK compatibility tests across Java, Python, Node.js, Go, and Rust. Here’s the stack underneath it.

Netty, the async I/O substrate

Netty has been around since 2004. If you’ve used Elasticsearch, Cassandra, gRPC-Java, Pulsar, Spark, the AWS SDK v2 async client, or Spring WebFlux (via Reactor Netty), you’ve used Netty. Every TCP connection into Floci, every UDP datagram, every connection to a spawned RDS container terminates in a Netty channel pipeline somewhere.

Two decades of hardening by Apple, LinkedIn, Twitter, and basically every JVM-based hyperscaler. The bugs at the protocol-decoder level have been found and fixed. The performance characteristics are extremely well understood. And critically, Netty has been a good citizen of the native-image world. It plays well with GraalVM out of the box.

Vert.x, the reactive toolkit

Vert.x is the layer where Floci uses things directly. It’s Netty with ergonomics: an event loop, a router, protocol-specific APIs for HTTP, DNS, TCP, WebSockets, gRPC, all sharing the same threading model.

Floci uses Vert.x for two things that matter.

The HTTP router. AWS routing is weird. The same TCP endpoint serves REST-XML (S3), REST-JSON, x-amz-json-1.0 and 1.1 (DynamoDB), query-string protocol (older services), and EC2 query protocol. Vert.x’s router gives you full control over dispatch without forcing a single framework’s idea of what a controller looks like.

The embedded DNS server. Floci runs its own authoritative DNS on UDP/53 inside the container, so *.localhost.floci.io resolves to Floci’s container IP on the Docker network. That’s how virtual-hosted S3 (https://my-bucket.s3.localhost.floci.io/key) works from inside spawned Lambda containers with no extra setup. Tractable in Vert.x because HTTP, UDP, and TCP all share infrastructure: same event loop, same lifecycle. About 200 lines.

Quarkus, the framework layer

This is where Floci becomes a coherent application instead of a pile of libraries.

Quarkus does at compile time what traditional frameworks do at runtime: bean discovery, dependency injection wiring, configuration resolution, JAX-RS route registration, Jackson serializer generation. That matters because GraalVM is a closed-world compiler. It has to know at compile time every class that might be loaded and every method that might be called via reflection. Quarkus is engineered from the ground up to give the native compiler that information.

The validating case for Quarkus is Keycloak, which migrated its entire codebase from WildFly to Quarkus in 2023, explicitly citing startup time and memory. When a project of that scale and conservatism makes that move, it’s a strong signal.

GraalVM Mandrel, the native-image compiler

This is the layer that delivers the headline numbers. Ahead-of-time compilation. Closed-world analysis. Dead code elimination. The output is a single statically-linked native executable. No JVM at runtime, no JIT warmup, no classpath scanning at startup.

Metric Floci (native) Typical JVM
Startup ~24 ms 2,000 to 6,000 ms
Idle RAM ~13 MiB 200 to 400 MiB

Mandrel is Red Hat’s downstream of GraalVM, tuned for Quarkus workloads, with release cadence aligned to Quarkus. An underrated piece of supply-chain hygiene.

Thank you

Floci wouldn’t exist without any of these layers. Forty-five AWS services is a lot of surface area for one maintainer. The reason it’s tractable is that the four layers below don’t need maintenance. They’re production-hardened by people I’ll never meet, and I get to focus on AWS wire-protocol fidelity, which is the interesting part of an emulator.

Thank you to the Netty, Vert.x, Quarkus, and GraalVM teams. Floci stands on your shoulders.

github.com/floci-io/floci

Security Controls in Enterprise RAG: Keys, Audit Logs, and the Hierarchy That Prevents Role Elevation

Enterprise RAG — A practitioner’s build log | Post 5 of 6

A knowledge search system for internal documents carries a specific security obligation: it must not make it easier to access restricted information than going to the document source directly. If an employee can ask a question and receive an answer that reflects finance data they are not authorized to see, the system has introduced a new attack surface that did not exist before.

The security design in Enterprise RAG addresses this through a hierarchy of controls — not a single mechanism, but a layered set that each address a distinct failure point. This post documents what each control does, the tradeoff it accepts, and what remains explicitly unimplemented.

Control 1: API key role binding — preventing request-body role elevation

The query endpoint accepts a user_role parameter in the request body. For unauthenticated local use, this is acceptable. In any shared or externally accessible environment, it is a security problem: a caller who knows the role parameter name can claim any role and retrieve documents outside their authorization.

The control is API key role binding. When a request includes an X-API-Key header, the role context for retrieval is derived from the key holder’s registered role — not from the request body. The request body role is ignored entirely.

User registers → POST /auth/register (role assigned at registration)
Admin creates key → POST /api-keys (key is bound to user’s role)
Query with key → POST /query + X-API-Key:
Role used for retrieval: key holder’s registered role (request body role ignored)

This closes the role elevation path for authenticated callers. A key issued to a user with role: employee cannot retrieve finance documents even if the caller submits user_role: finance in the request body.

API keys are stored as SHA-256 hashes. The raw key is returned once at creation and never again. If a key is lost, it must be revoked and reissued — the stored hash cannot be reversed to recover the original value.

Control 2: Key revocation — making access removal immediate

API key revocation (POST /api-keys/{api_key_id}/revoke) removes the stored hash. A revoked key is rejected by POST /query on the next request — there is no grace period, no cache to drain, no session to expire.

This is operationally important for two scenarios: an employee departure and a compromised credential. In both cases, the recovery action is immediate revocation rather than waiting for a session timeout or token expiry.

The revocation endpoint requires the ADMIN_TOKEN when management protection is enabled, which means the revocation action itself is authenticated. An unauthorized caller cannot revoke another user’s key.

Control 3: Management endpoint protection — separating operational from query access

A class of endpoints — ingestion, user registration, key creation, key listing, audit log access, and evaluation runs — are administrative by nature. In any shared or hosted environment, these endpoints must not be accessible without authentication.

When ADMIN_TOKEN is set, these endpoints require X-Admin-Token in the request header:

- `POST /ingest`
- `POST /auth/register`
- `POST /api-keys`, `GET /api-keys`, `POST /api-keys/{api_key_id}/revoke`
- `GET /audit-logs`
- `POST /eval/run`

The query endpoint (POST /query) is governed separately by API key authentication. Query access and management access use different credentials with different scopes. A leaked query key does not grant management access. A leaked admin token does not include the role context of any specific user.

Control 4: Audit logging — making every administrative action traceable

Every management action writes a record to audit_logs: which action was taken, when, and by which admin credential. The audit log is readable through GET /audit-logs with admin authentication.

The current scope of audit logging covers administrative actions. Query logs — which record the question asked, the role used, the citations returned, and the RBAC-blocked chunk count — are stored separately in the query log table and accessible through the dashboard.

Together, these two logs answer the questions a security review will ask: who ingested documents, when were keys created or revoked, what was queried by which role, and what was blocked.

Control 5: Security headers and CORS — default-on, not opt-in

Security headers are enabled by default (SECURITY_HEADERS_ENABLED=true in the base configuration). CORS origins are configured explicitly through CORS_ORIGINS — no wildcard default.

These are baseline controls that cost nothing and prevent a class of browser-based attacks. An API that stores internal document citations should not allow cross-origin requests from arbitrary origins.

For Azure deployment, the CORS origin list should enumerate only the dashboard Container App URL and any internal tools that call the query API directly.

What is not yet implemented

Entra ID and OIDC role derivation from token claims. The AUTH_PROVIDER=entra and AUTH_PROVIDER=oidc configuration paths are implemented and validate bearer JWTs against issuer, audience, expiration, and JWKS signing keys. Role mapping reads from roles, groups, or role token claims and defaults to employee when no role claim is present. End-to-end validation requires a live Azure tenant — it is not testable in the local environment.

Tenant isolation for multi-organization deployments. The current implementation assumes a single organization. Multi-tenant deployment — where organization A’s documents are completely isolated from organization B — requires additional data model work and is a documented production consideration.

PII classification for ingested documents. The included reference documents are synthetic. Production ingestion should classify documents for PII content and apply explicit retention policies for prompts and generated answers before storing them.

Distributed rate limiting. The current in-memory rate limiter (RATE_LIMIT_PER_MINUTE) works correctly for single-instance deployments. Multi-instance production deployments require Redis-backed or API gateway rate limiting.

The security posture in plain terms

Enterprise RAG is designed for internal deployment by an engineering team with control over the document corpus, the user registry, and the infrastructure. The controls are appropriate for that context. The gaps — multi-tenant isolation, production-grade PII classification, distributed rate limiting — are appropriate for a larger managed deployment and are documented rather than hidden.

Deploying this system to a shared or externally accessible environment without setting ADMIN_TOKEN is a configuration error, not an implementation gap. The controls are present. The operator must activate them.

Next engineering step

Enable ADMIN_TOKEN in your local .env, attempt to call POST /ingest without the token, and verify the endpoint returns a 401. Then call GET /audit-logs with the admin token and confirm the rejected attempt was logged. That sequence validates that management protection is enforced and that audit logging is capturing the right events.

One question for you

For internal tools that handle restricted documents, do you separate query credentials from management credentials? If a query key were compromised, could an attacker use it to ingest new documents or access the audit log?

Final post in this series: Deployment readiness — what is running locally, what the Azure path requires, and an honest list of what needs to be in place before this system handles real internal documents in production.

Building a Voice AI Agent in Italian with ElevenLabs + n8n: Lessons From 200 Live Bookings/Month

I deployed a voice AI agent in 7 Italian restaurants. It handles 200 bookings a month, in native Italian, for €87/month total cost. Here is what worked, what broke, and the exact stack that ships in production.

No marketing fluff. Real numbers from 60 days of live deployment, the latency we hit, the edge cases that broke our agent, and the three scenarios where I now refuse to deploy voice AI even when the client begs.

Why Italian Voice AI Is a Different Beast

If you’ve shipped an English voice agent, here’s what you should expect to break when you port the same architecture to Italian.

Latency tolerance is lower. Italian conversation has shorter pauses between turns. The 1.5s response time that feels “fast” in English starts to feel awkward in Italian above 1.2s. Native speakers begin to repeat themselves or check if you’re still there. We had to drop our agent’s first-response target from 1.5s to 1.0s before user satisfaction stopped degrading.

Regional accent variance is huge. A 60-year-old Roman saying “addò sta er ristorante” is grammatically Italian but ASR-wise it might as well be Catalan. We tested ElevenLabs ASR on three sample populations (Roman elderly, Neapolitan middle-aged, Northern under-30): WER ranged from 4% (Northern under-30) to 19% (Roman elderly). For restaurants in Rome’s historic center, we had to add a clarification fallback at the first failed parse, not the third.

Cultural patterns matter for prompt design. Italian restaurant calls open with extended pleasantries (“buongiorno, scusi il disturbo, volevo solo sapere se per stasera…”). English-trained prompts that try to short-circuit straight to “what’s your reservation?” feel rude. We added a 1-2 turn “social warmup” phase before pushing toward intent collection. Booking completion rate went from 71% to 89%.

English-trained TTS sounds robotic in Italian. This isn’t just opinion. Blind test, n=50 Italian native speakers, two voice models: Italian-trained ElevenLabs voice scored 4.4/5 naturalness, English-trained voice doing TTS in Italian scored 2.1/5. The latter was correctly identified as AI 78% of the time within the first 10 seconds.

The Stack (in 4 Components)

After testing Vapi, Retell, Bland and a custom Whisper + GPT-4o + OpenAI TTS pipeline, here’s what shipped to production:

1. ElevenLabs Conversational AI — voice synthesis + ASR + intent routing in one product. Italian native voices (“Bianca”, custom-cloned), conversation flow handled in their dashboard. Cost: $0.08/min on the Creator plan. Why I picked this over a custom pipeline: managing Whisper + GPT-4o + TTS as three separate services added ~400ms latency and required a state machine I didn’t want to maintain.

2. n8n self-hosted on a Hetzner CX22 (€5/month) — the orchestration layer. Webhook from ElevenLabs hits n8n on intent recognized (“book_table”, “ask_menu”, “modify_reservation”), n8n does the actual DB work (Postgres lookup, availability check, write reservation), responds back to the agent with structured data.

3. PostgreSQL on Supabase (free tier handles all 7 restaurants comfortably) — restaurant menu, tables, opening hours, reservations, customer history. Schema is boring on purpose: 6 tables, 22 columns total.

4. Twilio for Italian VoIP — €1/month per phone number, €0.013/min inbound. Yes, we evaluated Vonage, Plivo and Bandwidth. Twilio’s Italian numbers had the best call quality and the only support team that actually answered Italian dial issues within 24h.

Total monthly cost per restaurant: €12.50 (~€5 Hetzner shared across 7 restaurants + €1 Twilio + ~€6.50 ElevenLabs minutes).

Alternatives I rejected after testing:

  • Vapi: comparable quality, 30% more expensive at our volume
  • Retell: better latency on English, noticeably worse Italian voice quality (synthetic accent)
  • Bland: cost-attractive but conversation quality not yet there for Italian
  • Custom pipeline (Whisper + GPT-4o + OpenAI TTS): 200-400ms latency penalty, broke my “one neck to choke” rule

The Knowledge Base Problem (And How I Solved It)

Restaurant menus change daily. A static system prompt with “today’s menu” baked in goes stale in 24h. The naive solution — paste the new menu into the prompt every morning — breaks at scale (7 restaurants, 3 staff who don’t want to log into a dashboard).

The workflow that works:

Every day at 06:00:
1. Cron in n8n triggers
2. Pulls menu PDF from each restaurant's shared Google Drive folder
3. Sends PDF to Mistral OCR (free tier, 1GB/month, more than enough for menus)
4. Parses returned text into structured JSON (dishes, prices, allergens)
5. Upserts into Postgres `menu_items` table with `valid_from = today`
6. Marks yesterday's menu `valid_to = today`
7. Pings ElevenLabs webhook to invalidate runtime cache

40 lines of n8n nodes. Staff drop the PDF into Drive when they want, the agent picks it up next morning. Zero manual sync.

The trick that took me 3 iterations to find: don’t load the full menu into the prompt context. The agent calls a menu_lookup tool function only when the user asks about food. Keeps context lean (cheaper), keeps responses focused, lets us A/B test menu phrasing without touching the agent prompt.

Real Numbers After 60 Days

Aggregate data across 7 restaurants, May 2026:

  • Booking completion rate (without human handoff): 90%
  • Average first-response time: 4.2 seconds (full conversation initiation, not first token)
  • User AI-detection rate in first 30 seconds: 6% (94% don’t realize it’s AI initially; blind test n=50)
  • Average call duration: 1m 47s (vs 2m 32s for human staff — same booking, faster collection)
  • Peak load handled: 12 simultaneous calls (Saturday 19:00-21:30)
  • Total monthly bookings handled by the agent across 7 sites: 1,403

The 10% that fails:

  • Large group bookings (>15 people) — agent escalates to “we’ll call you back to confirm”
  • Complaints about previous experience — agent transfers to manager
  • Custom requests outside menu (“can you make this dish without gluten?”) — explicit fallback to staff

These three categories cover ~95% of all handoffs. I list them in the agent’s system prompt as “always escalate” cases. The remaining 5% are genuinely unclassifiable edge cases (drunk callers, kids playing with phones, sales calls from suppliers).

When Voice AI Is the Wrong Answer

I get 4-5 inbound requests per week now. I refuse roughly 30% of them. Here’s when:

Scenario 1: under 25 calls/week. The ROI math doesn’t work. Below that volume, the time the owner spends learning the system, training staff to interpret the dashboard, and dealing with the inevitable first-month edge cases costs more than the time saved. Pay a part-time receptionist.

Scenario 2: elderly-skewed clientele (>70% over 65). Voice AI works fine with seniors who are tech-comfortable, but if the bulk of your callers are 70+ and not tech-comfortable, the conversational friction is real. We had one trattoria in Pescara where 80% of bookings were elderly regulars. Booking completion rate stayed at 62% even after 4 weeks of prompt tuning. We turned the agent off.

Scenario 3: highly consultative calls. Anything where the value is in extended human conversation — legal intake, medical triage, financial advice — should stay human for ethical reasons before practical ones. Voice AI can take a callback request. It shouldn’t take a substantive professional consultation.

Saying no to these is how I keep the 90% completion rate on the agents that do ship.

Closing

If you want the full Sofia case study (architecture diagrams, n8n workflow JSON, the actual ElevenLabs prompt template, screenshots of the dashboard), I documented everything publicly at andreasisofo.it/sofia-ristoranti.

I’m Andrea Sisofo, freelance ex-BBDO based in Rome. I build voice AI agents in Italian for SMBs. Reach me at andreasisofo.it or on LinkedIn.

Open to questions in the comments.

News roundup: May 21, 2026 — Camunda, Hadrian, Devart

Camunda announces ProcessOS, an agentic operating system for AI-first enterprise transformation Agentic orchestration platform provider has announced  ProcessOS, a new intelligence layer that the company says leads into “the great re-engineering” of processes and concurrent workflows. According to the company, to move past mere AI task assistance, companies will need to rethink about which tasks … continue reading

The post News roundup: May 21, 2026 — Camunda, Hadrian, Devart appeared first on SD Times.

Microservices Didn’t Fail. People Did

The pattern was sound. The history is clear. What broke microservices wasn’t the architecture — it was practitioners who applied the deployment unit without the engineering discipline the original authors said it required.

There is a version of the microservices post-mortem that treats the pattern itself as the problem. Distributed systems are hard. Eventual consistency is hard. Operational overhead compounds. Better to stay with the monolith. This is the wrong conclusion, drawn from the wrong evidence, by people who perhaps should never have adopted microservices in the first place.

Microservices did not fail. A generation of engineers adopted an architectural pattern without the domain modelling discipline it demands, kept the synchronous call patterns from the systems they were supposed to be replacing, and then blamed the architecture when the complexity became unmanageable. That is not a failure of microservices. It is a failure of craft.

What the Original Authors Actually Said

Fred George was talking about micro-services — note the hyphen, the original form — at conferences as early as 2012. His framing was specific and unambiguous: very small services, a hundred or two hundred lines of code, communicating asynchronously, each doing one thing and signalling when done. He called the underlying philosophy programmer anarchy — not because it was chaotic, but because it required engineers senior and capable enough to operate without the management scaffolding that larger, less capable teams depend on.

George was explicit on this point, and it is the part most consistently erased from the mainstream narrative: microservices require a higher class of engineer. Not because the individual services are technically complex — they are not, that is rather the point — but because drawing correct service boundaries demands deep domain knowledge, and building an async event-driven system that actually holds together requires engineers who understand what they are doing and why. It is not a pattern that compensates for weak engineering. It exposes it.

In 2014, Martin Fowler and James Lewis codified what had been circulating in the practitioner community into the article that would introduce the term to the mainstream. They described services built around business capabilities, independently deployable, each owning its own data. They described communication via lightweight mechanisms, positioning this explicitly against the ESB-era orchestration that SOA had become. And they used a phrase the industry would adopt as a slogan while ignoring its meaning: smart endpoints, dumb pipes.

Microservice communities favour an alternative approach: smart endpoints and dumb pipes. Applications built from microservices aim to be as decoupled and as cohesive as possible — they own their own domain logic and act as filters in the classical Unix sense.

— Martin Fowler & James Lewis, Microservices, martinfowler.com, 2014

The Unix reference is not rhetorical. The intellectual lineage of microservices runs directly through Unix philosophy: do one thing and do it well, compose small sharp tools via pipes, keep the pipes dumb and let the intelligence live at the endpoints. This is a forty-year-old idea applied to distributed systems. The message bus is the pipe. The service is the tool. The insight was not new — it was being rediscovered at network scale.

Fowler and Lewis also listed decentralised data management as a defining property — not an optimisation, not a preference, a defining property. Each service owns its data. Not a shared Postgres instance with schema-level separation. Not a common ORM pointed at a central database. Complete data ownership, per service, with no exceptions. It was almost universally abandoned in practice because doing it correctly requires the kind of domain thinking not every team could bring.

The Problem Microservices Were Built To Solve

The original context matters enormously, and stripping it out is how you end up with a five-person startup running fifteen services on Kubernetes. Microservices emerged at organisations — Netflix, Amazon — where the primary engineering bottleneck was not performance, not data volume, not technical complexity. It was people. Hundreds of engineers. Conway’s Law made operational: when your organisation is large enough, your architecture will mirror your team structure whether you intend it to or not. The insight was to design for that deliberately.

Context — The goal was independent deployability at organisational scale: the ability for a team of eight to ship their service without synchronising with twenty other teams. The service boundary was, first and foremost, a team boundary. The architecture served the org chart. Without that organisational pressure, most of the complexity budget of microservices buys you nothing.

If your team does not have that problem, you probably do not need this solution. A well-structured monolith, deployed with confidence, will outperform a prematurely distributed system on every axis that matters to a small team. Reaching for microservices without the scale that motivates them is not an architectural decision. It is CV-driven development.

How We Build When Microservices Are the Right Call

When the problem genuinely calls for it — independent teams, independent domains, engineering capability to execute properly — the approach is simple. Not easy. Simple. There is a difference, and it matters.

Services communicate exclusively via events on a message bus. Not synchronous HTTP. Not REST calls between services. Events. A service does its work, emits an event signalling completion, and its responsibility ends there. It has no knowledge of what consumes that event or how many things do. The bus is infrastructure — provisioned once, configured like a database. You are not dynamically discovering it at runtime. The addressing problem that service discovery exists to solve simply does not arise, because you are not making point-to-point calls between services.

Each service owns its data completely. This is where the lake and pond model becomes operational. The event stream is the lake: the canonical, append-only record of everything that has happened across the system. Each service maintains its own pond — a local materialised view of the data relevant to its domain, hydrated by subscribing to the events it cares about. A service never queries another service’s store. It never calls another service to assemble a response. It already has what it needs, because it built it from events as they arrived.

This resolves the one objection people reliably raise: how do you serve synchronous queries at the user-facing edge? Frontend-supporting services — the Backend for Frontend pattern — subscribe to events across relevant domains and maintain pre-aggregated read models locally. When a request arrives, they answer from their own store. There is no cross-service call at query time, no dependency chain, no distributed join to fail.

Concrete Example — Order Placement

A customer places an order. The order service validates, persists, and emits one event: OrderPlaced. Its job is done. It does not call the inventory service. It does not call the payment service. It does not know either exists.

The inventory service is subscribed to OrderPlaced. It reserves stock and emits InventoryReserved. The payment service is subscribed to InventoryReserved. It charges the customer and emits PaymentConfirmed. Each service reacts, does its work, signals completion. No service is aware of the others. No orchestration layer exists. No saga coordinator manages the sequence.

The customer’s dashboard needs to show order status synchronously. A BFF service has been subscribed to all of these events since the system started and has maintained a local read model — its own pond — built from that stream. When the request arrives, it answers from local state. The response time is a single local query. There is nothing to discover, no chain to traverse, nothing to fail.

The simplicity here is not cosmetic. It is the proof that the design is correct. When a system requires a service mesh, a circuit breaker library, and a distributed tracing platform just to understand what is happening at runtime, that is not operational maturity — it is the system telling you something went wrong at design time.

Where the Industry Went Wrong

The mainstream implementation made one foundational mistake and spent the next decade building infrastructure to manage the consequences. It kept synchronous HTTP as the primary communication mechanism between services. Everything else — the service discovery registries, the circuit breakers, the service meshes, the distributed tracing pipelines — is a direct and inevitable consequence of that one decision.

  • Synchronous HTTP between services creates a distributed monolith. Call chains couple services at runtime. Latency compounds with every hop. Failures cascade. You carry the full operational burden of distributed systems and the full coupling of a monolith, simultaneously.
  • Service discovery — Consul, Eureka, Kubernetes service meshes — exists entirely to manage dynamic addressing in synchronous architectures. It is a solution to a problem that should not exist. In a correctly designed async system, you never ask where another service is.
  • The Saga pattern, in most implementations, is a sign that service boundaries were drawn incorrectly. If completing a business operation requires coordinated state changes across multiple services, those services were not decomposed around their actual bounded contexts. The saga is not the solution — it is the symptom.
  • Shared databases between services are not a pragmatic shortcut. They are a categorical error. If two services share a schema, they are modules in a distributed monolith. Calling them microservices changes nothing about their coupling.
  • Istio is impressive engineering that exists entirely to manage problems generated by synchronous inter-service communication. Its presence as a default recommendation in microservices literature is a precise measure of how far the mainstream drifted from the original intent.

None of this is a failure of the architectural pattern. It is a failure of practitioners who adopted a deployment strategy without the domain modelling discipline that makes it coherent. This requires engineers who can reason about bounded contexts, who understand event-driven systems, who have the discipline to hold service boundaries under delivery pressure. It was never a template any team could lift and apply without thinking. The original authors were clear about this. The industry chose not to listen, and then blamed the architecture for the results.

The Honest Position

Microservices, built as their originators described — async, event-driven, each service owning its domain and its data completely — are simple. Not operationally trivial, but architecturally simple: no service discovery, no synchronous call chain to trace, no distributed transaction to coordinate, no saga to manage. Each service does one thing, signals when done, and has no knowledge of what comes next. The system’s complexity lives in the domain, where it belongs, not in the infrastructure. Simplicity is not a constraint we work within — it is the standard we hold the design to. When you find yourself reaching for a service mesh or a saga orchestrator, the question is not which tool to reach for. It is what decision, made earlier, made that tool feel necessary.

Originally published at uradical.io.

400+ Remote Companies Using React in 2026

React is the default. 409 companies on Remoet use it. That is more than four times the next-closest frontend framework on the platform. If you write React, you are not in a special pool. You are in the main pool, and the main pool is the problem.

This is a different argument from the Python one. Python is too broad and you disappear inside it. React is worse. React is what every frontend developer already knows. The label “React developer” tells a recruiter approximately nothing. You write components. So does everyone they have ever talked to.

Let me show you the numbers and then tell you what to actually do.

React owns frontend. That is the trap.

The data first.

  • 409 companies use React in their stack
  • 25,185 open jobs at those companies, more than any other frontend cohort
  • 337 of 409 (82%) also use TypeScript. If you do not, you are competing with one hand tied
  • 109 of 409 (27%) also use Next.js in production
  • 67 companies specifically list React Native (mobile, different career path)

Compared to everything else:

Framework Companies Jobs
React 409 25,185
Next.js 113 8,107
Vue 85 7,597
Angular 81 7,407
React Native 67 4,850
Remix 7 705
Svelte 6 206

React has roughly five times the company surface area of Vue and Angular. There is no contest. There is also no signal in saying you write it. Every frontend candidate they screen this week writes it.

The trap: there are more React jobs than any other kind of frontend job, and you still cannot get an interview. Not because the jobs do not exist. Because “React developer” is the noisiest label in tech.

The signal is what is sitting next to React

Stop telling recruiters you are a React developer. They know. Tell them what you ship React next to.

You are a React plus TypeScript plus Next.js person. Or a React plus Rails plus Postgres person. Or a React plus Go plus Kubernetes person. Or a React Native plus Swift plus Kotlin person. These are different humans. The pools they actually compete in are much smaller than 409. Often they are 30 to 60. Inside those pools you are not interchangeable. You are a specific shape.

Here is what those clusters actually look like, with real companies pulled from the platform today.

React plus Next.js plus TypeScript (the modern web stack)

The default modern web cohort. If you are shipping marketing sites, product surfaces, or React Server Components in production, this is where you live.

  • Vercel. React, Next.js, TypeScript, Node.js, Python, Go, Kubernetes, AWS, GCP.
  • Mintlify. React, Next.js, TypeScript, Node.js, MDX, Storybook.
  • Resend. React, Next.js, TypeScript, Go, PostgreSQL, Clickhouse, Kafka, AWS.
  • Basement. React, Next.js, TypeScript, GSAP, Three.js, WebGL, React Server Components.
  • Buffer. React, Next.js, TypeScript, Express, BigQuery, Radix UI.
  • Whitespectre. React, Next.js, TypeScript, Node.js, NestJS, GraphQL, AWS.

These shops want production Next.js specifically. Knowing React without Next.js is not the same conversation.

React plus Node.js plus PostgreSQL (full-stack JS)

The classic JavaScript-everywhere shape. Frontend and backend in one language. 218 of the 409 React companies also use Node.js. 244 use Postgres. The overlap is the spine of mid-sized SaaS.

  • Linear. React, TypeScript, Node.js, PostgreSQL, GraphQL, Redis, Kubernetes, ProseMirror.
  • Ably. React, TypeScript, Node.js, JavaScript, Rails.
  • Aha!. React, Node.js, PostgreSQL, Rails, Kafka, Redis, Terraform.
  • Ghost. React, TypeScript, Node.js, Express, MySQL, Ember.js, Handlebars.
  • Strapi. React, Node.js, PostgreSQL, GraphQL, Apollo.

If your resume is React plus Node plus Postgres, these are the shops where you do not have to justify your stack.

React plus Python (frontend at backend-heavy orgs)

This is the one most React developers do not realize. 327 of the 409 React companies also use Python. Eighty percent. It is the single most common pairing on the platform.

It does not mean those shops want a Python person. It means the team you join probably has Python services next door and you will read it whether you write it or not. The signal here is comfort with a Python-shaped backend, not Python expertise.

  • PostHog. React, TypeScript, Python, Django.
  • Cursor. React, TypeScript, Python, Go, Rust, Kafka, Kubernetes, Clickhouse.
  • Anthropic. React, TypeScript, Next.js, Python, Go, Rust, Kubernetes, PyTorch, JAX.
  • Khan Academy. React, TypeScript, Python, Go, Vue.
  • Distribusion. React, Python, FastAPI, PostgreSQL, Kafka, Kubernetes, Elixir.
  • Attio. React, TypeScript, Node.js, Python, Go.

If you are a frontend dev who is comfortable in a polyglot stack, these are your shops.

React plus Go plus Kubernetes (infra-adjacent frontend)

217 React companies use Go. 267 use Kubernetes. The overlap is where frontend work happens at companies with serious platform engineering. The frontend is usually small relative to the backend, and the team values someone who can read a Helm chart.

  • Cloudflare. React, TypeScript, Go, Rust, Python, Lua, Cloudflare Workers.
  • 1Password. React, TypeScript, Go, Rust, Java, Kotlin, Next.js, Node.js, Kubernetes.
  • Supabase. React, TypeScript, Next.js, Go, Elixir, Phoenix, PostgreSQL, WebAssembly.

For these shops, “React developer” is the wrong label. “Frontend engineer who reads backend code” is the right one.

React Native (the mobile path)

Different career entirely. 67 companies. Roughly half also build for native iOS and Android, so you will end up in Swift or Kotlin at some point.

  • MapBox. React, React Native, TypeScript, Swift, Kotlin, C++, Rust, Go, Java, Vulkan, WebGL.
  • Distribusion. React, React Native, Python, FastAPI, Kubernetes, Elixir.
  • Reactiv. React, React Native, Next.js, Node.js, AWS, GraphQL, iOS, Swift.

If you are a React Native person, do not let yourself get lumped in with React generalists. The mobile pool is yours and it is small.

React plus Rails (Ruby shops)

48 companies. Smaller pool, different dynamics from JS-centric shops. Rails teams hire frontend people who can read Ruby and not bristle.

  • Stripe. React, TypeScript, Ruby, Rails, Python, Java, Go, Scala, Kafka.
  • Toptal. React, TypeScript, Ruby, Rails, Node.js, Python, Next.js, Tailwind CSS.
  • Aha!. React, Node.js, PostgreSQL, Rails, Kafka, AWS, Terraform.
  • Ably. React, TypeScript, Node.js, Rails.

If you have Rails on your resume and you also do frontend, you are a specific shape competing with maybe 50 people in the world.

Why this only works with the cluster

You can read all of this and still not get hired, because finding the cluster manually is the part that breaks people. There are 409 React companies. Reading 409 careers pages is not a job-search strategy. It is a way to give up.

This is where AI agents help. Connect an agent to Remoet, give it your specific stack, ask it to find the 30 to 60 companies that match. Not “React companies.” Something like “remote companies running React with Next.js and TypeScript that have Python or Go on the backend.” The agent reads the data, returns the slice that fits you, and you stop competing with 409.

Star the ones that fit. Your weekly digest brings new roles from those companies without you having to look. The whole flow is free.

React is the floor, not the ceiling

The pitch I want to leave you with is the inverse of the optimistic one. React being the default is the thing keeping you stuck. It is the floor. Every applicant is at the floor. Climbing is the cluster.

Pick the specific React shape you actually are. Build your profile around that combination. Get visible to the 30 to 60 companies whose stack is your stack. Forget the other 350.

Stop applying like a React developer. Start applying like the specific React developer you are.

I’ve Been Building a Python Game Engine

I’ve been working on a project called ABS Engine, a Python game engine focused on keeping projects simple and organized.

Instead of making developers write massive setup code, games are mostly controlled through a project file called game.absp.

It can define things like:

  • entities
  • connected scripts
  • image assets
  • fullscreen settings
  • resolution
  • cursor visibility

Example idea:

Player entity
→ script: scripts/player.py
→ texture: data/images/player.png

Game settings:
→ fullscreen enabled
→ cursor hidden
→ resolution: 540×320

Scripts can still access the engine API directly using:

from engine.core import *

The goal is making game projects easier to structure while still giving advanced users full access to the engine itself.

I’m also working on build tools so projects can be packaged and shared easily without manually hunting for dependencies and assets.

Still early in development, but it’s been one of the most fun programming projects I’ve worked on.

Selling Without Stripe in a Country That Stripe Can’t Reach: When Compliance Becomes a Technical Problem

The Problem We Were Actually Solving

We launched our product in Venezuela, where we quickly realized that accepting traditional payments would be problematic. Our initial solution relied on PayPal’s mass payout feature, but that was short-lived. They suspended our account due to some minor compliance issues, and we lost access to our users’ funds. This led to a perfect storm of bad PR and unhappy customers. At that point, we knew we had to find an alternative payment infrastructure that could handle the complexities of the Venezuelan economy.

What We Tried First (And Why It Failed)

Our first attempt at replacing PayPal was to integrate Stripe. However, upon further research, we discovered that Stripe’s compliance requirements wouldn’t allow them to operate in Venezuela due to various sanctions and embargoes. We then turned to alternative payment gateways like PayU or Mercado Pago, but their requirements were still too restrictive, and the fees were prohibitively expensive. It seemed like the more we tried to comply with traditional payment processors, the more we realized how little they cared about our niche market.

The Architecture Decision

After months of research and experimentation, we finally found an alternative: crypto payment infrastructure using the Cosmos SDK, a blockchain framework for building cross-chain applications. We chose to integrate a local cryptocurrency called Petro, which was a sovereign digital currency backed by the Venezuelan government. With the help of a developer who specialized in blockchain development, we created a custom payment flow that tied our product directly to the Petro network. This was a massive undertaking that required us to reimagine our entire payment system from the ground up. We had to write custom software to interact with the Petro wallet API, handle key management, and encrypt sensitive user data.

What The Numbers Said After

The numbers were encouraging. Our churn rate plummeted by 30%, mainly because customers could now purchase our product without worrying about payment issues. Our average order value (AOV) increased by 20% due to reduced transaction fees, and our overall customer satisfaction ratings improved significantly. We also witnessed a 50% increase in international transactions using the Petro currency.

What I Would Do Differently

Looking back, I would have started exploring blockchain solutions much earlier in the development process. While the initial investment was worthwhile, it forced us to divert resources from other critical areas of the business. Additionally, I would have chosen a more transparent and compliant blockchain framework that offered better support for our target market. If I had to redo the architecture decision, I would opt for a more robust and community-driven blockchain solution like Solana or Algorand, which offer better scalability and more established adoption rates.

Solana’s Biggest Consensus Overhaul Is Live for Testing. Here’s What Builders Need to do right now.

 Alpenglow is not on mainnet yet. The community test cluster is where validator operators evaluate the new consensus design under real-world conditions before any broader rollout. The test milestone matters because it demonstrated that Alpenswitch — the actual transition from old to new consensus — works in a live multi-validator environment.

What Builders Should Do Right Now

1. Build against 150ms finality assumptions

If you’re designing application architecture today that will ship in Q4 2026, model your UX and confirmation flows against 150ms rather than 12.8 seconds. Don’t design for the current network if your launch is after mainnet activation.

2. Audit your RPC infrastructure for throughput

If Alpenglow drives meaningful adoption growth on Solana, your application’s RPC request volume will scale with it. Shared public endpoints have rate limits that don’t scale with your traffic. This is the time to evaluate whether your current RPC setup can handle 2-3x your current load.

Dedicated endpoints give you isolated capacity — your rate limits are determined by your usage alone, not shared with every other application on the same node. For Solana applications expecting growth alongside Alpenglow’s mainnet launch, this is worth evaluating before the traffic arrives.

3. Check the Anza and Firedancer GitHub repos

Both teams have Alpenglow implementations available. If you’re building validator tooling or infrastructure that touches Solana’s consensus layer, the code is there to review now — not after mainnet.

4. Watch for Agave 4.1

This is the client release that ships Alpenglow to mainnet. When the release candidate drops, that’s the signal that the mainnet activation timeline is concrete rather than projected.

The Bigger Picture

Solana’s metrics have been soft for the past several months — TVL down 56% from its 2025 peak, monthly active users at a two-year low, fees declining. Alpenglow is the technical answer to a network that needs a structural argument for why builders and institutional capital should choose it over alternatives.

The argument is: a network where three-quarters of block space goes to internal coordination has a ceiling. Remove that ceiling and the throughput, reliability, and user experience ceiling rises with it. That’s the bet Alpenglow is making — and with 98.27% validator approval and a successful test cluster activation, the bet is looking increasingly credible.

This breakdown is based on Running Web3 Weekly by GetBlock, covering the infrastructure stories that matter for builders every Monday on YouTube and X.

GetBlock provides dedicated and shared RPC nodes for Solana and 130+ other blockchains — including low-latency dedicated Solana stacks built for HFT, MEV, and high-throughput applications. Explore Solana infrastructure.