A new product to structure
Before writing code, you need to choose the building blocks, the module boundaries, the data model and how the app and the API talk to each other.
Expertise
Software architecture design and review for mobile apps, web applications and APIs: modular structure, data model, API contracts, progressive migrations. Every structural decision is documented, with its alternatives and consequences.
Replace the payment module step by step, behind the same interface, rather than rewriting the application.
Full rewrite: new features would be frozen for the whole rebuild.
Two implementations coexist during the migration; each wave can ship on its own.
Situations
Before writing code, you need to choose the building blocks, the module boundaries, the data model and how the app and the API talk to each other.
Each feature weakens another, dependencies are tangled and the team no longer dares to touch some parts.
A change of framework, state management or database, to carry out without interrupting a product in production.
Choices were made, but neither their reasons nor the rejected alternatives were written down. Every new team has to rediscover them.
Scope of work
An architecture is judged by what it lets you change without breaking everything. We design it, document it and evolve it with the team that will maintain it.
Module boundaries, state management, navigation and dependencies for Flutter, Swift, Kotlin and Next.js applications.
Business modules, documented API contracts, authentication and integrations, on NestJS and Node.js.
PostgreSQL schemas, versioned migrations, and the choice between relational and document databases based on usage.
Messaging, streaming and synchronisation: WebSocket, WebRTC, LiveKit or LL-HLS depending on target latency and cost.
Step-by-step replacement following the Strangler Fig pattern rather than a rewrite: the product stays live throughout.
Diagrams versioned in Git, API contracts and decision records: every structural choice states the alternatives considered and its consequences.
Method
Usage, volumes, team, deadlines and the existing system. An architecture answers constraints, not trends.
Target architecture and possible options, with their costs, their risks and what they will make harder later.
Diagrams, data model, API contracts and decision records, versioned with the code.
Foundations, code review and step-by-step migration, alongside your team or by taking on the development.
Responsibilities
A typical division of responsibilities, agreed for each engagement.
| Topic | Your team | Black Tide |
|---|---|---|
| Constraints | You share usage, volumes and deadlines | We turn them into architecture requirements |
| Structural choices | You approve the chosen option | We propose options and document their consequences |
| Documentation | You host it in your tools | We write it and keep it current during the engagement |
| Code review | Your process applies | We make sure architecture decisions are followed |
| Migration | You set the pace and priorities | We migrate step by step, without service interruption |
Selected work
A progressive Strangler Fig migration: the Flutter app moved to hooks and Riverpod in waves, while the backend is being migrated from MongoDB to PostgreSQL table by table, without service interruption.
Read the Blisterr caseThree connected blocks: a Flutter application, a NestJS API with around twenty business modules and a Python pipeline syncing around 125,000 books.
Read the Fantasy Alley caseEach case describes the work delivered, its scope and the current status of the product.
Budget and next steps
The architecture questions to settle, the existing system to examine and the expected deliverables: target architecture, data model, API contracts.
Design and documentation time, the size of the existing system to examine and, if requested, support during implementation.
Deliverables are written to be picked up by the team that builds, whether yours or ours.
Architecture review only, design of a target architecture, or full support through implementation.
Useful questions
Not by default. A well-structured modular monolith suits most products and is simpler to operate. We split into services when a real constraint calls for it.
Yes. We first examine the code and operations, then propose a step-by-step evolution path rather than a rewrite.
Depending on scope: architecture diagrams, data model, API contracts and decision records, versioned with the code.
Yes. The architecture is designed with the team that will maintain it, as a project or embedded, so decisions are understood and applied.
Next step
Your product, its existing technical base and what needs to evolve: the starting point for a useful review.