The Tech Stack We Use in 2026
An inside look at the modern technologies, frameworks, and tools we've standardized on at Codexio. Learn why we chose each technology and how they work together.
Why Our Stack Matters
Our technology choices directly impact delivery speed, code quality, and long-term maintainability. After years of experimentation and dozens of projects, we’ve settled on a stack that maximizes developer productivity while ensuring enterprise-grade reliability.
Here’s what we use and why.
Frontend: Modern and Fast
Angular (Enterprise Applications)
Why we love Angular:
- Complete framework with everything built-in
- Excellent TypeScript integration out of the box
- Powerful dependency injection
- Enterprise-ready with strong opinions
- Outstanding for large-scale applications
- RxJS for reactive programming
When we use it:
- Large enterprise applications
- Complex business logic apps
- Projects requiring strict structure
- Long-term maintenance projects
Example use case: Financial dashboards, admin panels, enterprise SaaS
Ionic (Mobile-First Applications)
Why Ionic is our mobile choice:
- Build once, deploy to iOS, Android, and web
- Native-like performance with web technologies
- Works seamlessly with Angular
- Extensive UI component library
- Capacitor for native device features
- Cost-effective cross-platform development
When we use it:
- Mobile apps with tight budgets
- Cross-platform requirements
- Rapid mobile prototypes
- Progressive Web Apps (PWAs)
React & Next.js 14
Why we also use React:
- Massive ecosystem and community
- Concurrent features for better UX
- Server Components paradigm
- Flexible and unopinionated
- Easy to find talent
When we use it:
- Marketing websites with dynamic content
- Content-heavy sites (Astro + React)
- Projects requiring maximum flexibility
TypeScript (Non-Negotiable)
Why we mandate it:
// Catches errors at compile time, not runtime
interface User {
id: string;
email: string;
role: 'admin' | 'user'; // Type-safe enums
}
// This would error at compile time
const user: User = {
id: 123, // Error: number is not assignable to string
email: 'test@example.com'
};
Benefits we’ve seen:
- 40% fewer production bugs
- Faster onboarding for new developers
- Better IDE support and autocomplete
- Self-documenting code
Tailwind CSS
Why we love it:
- Utility-first approach speeds up development
- Consistent design system
- Excellent performance (only ships used CSS)
- Great with component-based frameworks
- Responsive design is effortless
Our configuration:
// tailwind.config.js - Customized for brand
module.exports = {
theme: {
extend: {
colors: {
primary: {...},
secondary: {...},
},
// Custom design tokens
},
},
};
Backend: Scalable and Modern
NestJS (Primary Backend Framework)
Why NestJS is our go-to:
- Progressive Node.js framework with Angular-like architecture
- Built-in TypeScript support and dependency injection
- Excellent for microservices and monoliths
- Comprehensive documentation and ecosystem
- Easy to maintain and scale
- Built-in testing utilities and validation
Typical NestJS structure:
backend/
├── src/
│ ├── modules/ # Feature modules
│ ├── controllers/ # Request handlers
│ ├── services/ # Business logic
│ ├── entities/ # Database models
│ ├── dto/ # Data transfer objects
│ └── guards/ # Authentication & authorization
Example controller:
@Controller('api/users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
@UseGuards(AuthGuard)
async findAll(): Promise<User[]> {
return this.usersService.findAll();
}
}
Node.js + Express (For Lightweight APIs)
When simpler is better:
- Quick prototypes and MVPs
- Serverless functions
- Simple REST APIs
- Minimal structure requirements
Python (For AI/ML and Data)
When Python makes sense:
- Machine learning pipelines
- Data processing and analysis
- AI integrations (OpenAI, HuggingFace)
- Scientific computing
Our Python stack:
- FastAPI for APIs
- Pandas for data manipulation
- TensorFlow/PyTorch for ML
- Celery for async tasks
Java & Kotlin + Spring Boot (Enterprise Projects)
For enterprise clients:
- Mature and battle-tested ecosystem
- Strong static typing for reliability
- Excellent performance and scalability
- Perfect for microservices architecture
- Enterprise-ready libraries and frameworks
Why we also use Kotlin:
- Modern, concise syntax (less boilerplate than Java)
- 100% Java interoperability
- Null safety built into the language
- Coroutines for async programming
- First-class Spring Boot support
- Growing adoption in Android and backend
Example Kotlin with Spring Boot:
@RestController
@RequestMapping("/api/products")
class ProductController(private val productService: ProductService) {
@GetMapping
suspend fun getAllProducts(): List<Product> =
productService.findAll()
@PostMapping
fun createProduct(@Valid @RequestBody product: CreateProductDto): Product =
productService.create(product)
}
Databases: Right Tool for the Job
PostgreSQL (Primary Relational DB)
Why PostgreSQL:
- Robust and reliable
- Excellent JSON support
- Full-text search
- Powerful indexing
- ACID compliant
Our usage patterns:
-- Example: Efficient querying with indexes
CREATE INDEX idx_user_email ON users(email);
CREATE INDEX idx_orders_date ON orders(created_at DESC);
-- JSON support for flexible data
SELECT data->>'preferences' as prefs
FROM users
WHERE data @> '{"active": true}';
MongoDB (For Flexible Schemas)
Perfect for:
- Rapidly evolving data models
- Document-based data
- Real-time applications
- Hierarchical data
Redis (Caching and Sessions)
Essential for performance:
// Caching expensive queries
const cachedUser = await redis.get(`user:${id}`);
if (cachedUser) return JSON.parse(cachedUser);
const user = await db.users.findById(id);
await redis.setex(`user:${id}`, 3600, JSON.stringify(user));
return user;
AI & Machine Learning
OpenAI API
Our primary AI provider:
- GPT-4 for complex reasoning
- GPT-3.5-Turbo for faster, cheaper tasks
- Embeddings for semantic search
- DALL-E for image generation
Integration pattern:
import OpenAI from 'openai';
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
// Structured outputs with type safety
const completion = await openai.chat.completions.create({
model: 'gpt-4',
messages: [
{ role: 'system', content: 'You are a helpful assistant.' },
{ role: 'user', content: prompt }
],
temperature: 0.7,
});
Langchain
For complex AI workflows:
- Multi-step AI reasoning
- Document processing
- RAG (Retrieval Augmented Generation)
- Agent-based systems
HuggingFace
For open-source models:
- Custom model fine-tuning
- Cost optimization
- Privacy-sensitive applications
DevOps & Infrastructure
Docker (Containerization)
Everything runs in containers:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
CMD ["npm", "start"]
Benefits:
- Consistent environments
- Easy scaling
- Simplified deployment
- Isolation
Kubernetes (Orchestration)
For production deployments:
- Auto-scaling
- Self-healing
- Rolling updates
- Service discovery
AWS (Primary Cloud)
Our AWS services:
- EC2/ECS: Compute
- RDS: Managed databases
- S3: Object storage
- CloudFront: CDN
- Lambda: Serverless functions
- SQS/SNS: Message queues
Vercel (For Next.js)
Perfect for Next.js apps:
- Zero-config deployment
- Edge network
- Automatic HTTPS
- Preview deployments
- Excellent DX
Terraform (Infrastructure as Code)
Why we use Terraform:
- Declarative infrastructure management
- Multi-cloud support (AWS, Azure, GCP)
- Version control for infrastructure
- Predictable deployments
- Reusable modules
Example Terraform configuration:
# Define AWS infrastructure
resource "aws_instance" "app_server" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.medium"
tags = {
Name = "AppServer"
Environment = "production"
}
}
resource "aws_db_instance" "postgres" {
engine = "postgres"
instance_class = "db.t3.micro"
allocated_storage = 20
}
Benefits:
- Infrastructure versioned alongside code
- Easy to replicate environments
- Prevents configuration drift
- Audit trail for all changes
Ansible (Configuration Management)
Why we use Ansible:
- Agentless architecture (SSH-based)
- Simple YAML syntax
- Idempotent operations
- Great for server provisioning and configuration
- Extensive module library
Example Ansible playbook:
# Configure web servers
- name: Deploy application
hosts: webservers
become: yes
tasks:
- name: Install dependencies
apt:
name:
- nginx
- nodejs
- npm
state: present
- name: Copy application files
copy:
src: /local/app/
dest: /var/www/app/
- name: Start services
service:
name: nginx
state: started
enabled: yes
Use cases:
- Server configuration and provisioning
- Application deployment automation
- Rolling updates across server fleets
- Security patching and compliance
CI/CD Pipeline
GitHub Actions
Our standard workflow:
name: CI/CD
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- run: npm ci
- run: npm test
- run: npm run lint
- run: npm run build
deploy:
needs: test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- run: npm run deploy
What We Automate:
✅ Testing (unit, integration, E2E)
✅ Linting and formatting
✅ Security scanning
✅ Dependency updates
✅ Deployment to staging
✅ Production deployment (with approval)
Development Tools
Essential Tools:
Version Control:
- Git + GitHub
- Conventional Commits
- Branch protection rules
Code Quality:
- ESLint
- Prettier
- Husky (git hooks)
- CommitLint
Testing:
- Jest (unit tests)
- Playwright (E2E tests)
- Testing Library (React testing)
API Development:
- Postman/Insomnia
- Swagger/OpenAPI
- tRPC (type-safe APIs)
Monitoring:
- Sentry (error tracking)
- LogRocket (session replay)
- Datadog (APM)
- Google Analytics/Plausible
AI-Powered Development Tools
Cursor
Our primary AI-native IDE:
- Context-aware code suggestions across the whole codebase
- Inline edits and refactoring via natural language
- Composer for multi-file changes and feature implementation
- Deep integration with the editor so we stay in flow
Claude
Our go-to for reasoning and review:
- Architecture discussions and system design
- Algorithm optimization and debugging
- Code review and security analysis
- Documentation and RFCs
We use Cursor and Claude together daily—Cursor in the IDE, Claude for deeper reasoning and pair programming. We also use other AI tools (e.g. GitHub Copilot) where they fit; the key is training developers to use the right tool at the right time.
Communication & Project Management
Team Collaboration:
- Slack (communication)
- Linear (issue tracking)
- Notion (documentation)
- Figma (design)
Client Communication:
- Jira (for enterprise clients)
- Zoom/Google Meet
- Loom (async video updates)
Security
Security is non-negotiable:
// Input validation with Zod
import { z } from 'zod';
const userSchema = z.object({
email: z.string().email(),
password: z.string().min(8),
});
// Authentication with JWT
import jwt from 'jsonwebtoken';
const token = jwt.sign(
{ userId: user.id },
process.env.JWT_SECRET,
{ expiresIn: '7d' }
);
Our security stack:
- Auth0/Clerk for authentication
- Helmet.js for security headers
- Rate limiting
- Input validation
- SQL injection prevention
- XSS protection
- HTTPS everywhere
Why This Stack Works
1. Developer Productivity
Our developers can:
- Ship features 40% faster
- Onboard in days, not weeks
- Work across the stack
- Leverage AI tools effectively
2. Reliability
- 99.9% uptime across projects
- Automatic error tracking
- Self-healing infrastructure
- Comprehensive monitoring
3. Cost Efficiency
- Optimized cloud costs
- Efficient caching strategies
- Right-sized infrastructure
- Pay-per-use where possible
4. Scalability
- Horizontal scaling ready
- Database optimization
- CDN integration
- Microservices when needed
Continuous Evolution
This stack isn’t static. We evaluate new technologies quarterly:
Currently exploring:
- Bun (faster Node.js alternative)
- Remix (React framework)
- tRPC (type-safe APIs)
- Supabase (Firebase alternative)
- Edge computing (Cloudflare Workers)
Evaluation criteria:
- Does it solve a real problem?
- Is it production-ready?
- Does it have good community support?
- Does it improve developer experience?
- Is it cost-effective?
Conclusion
The best stack is the one that:
- ✅ Your team knows well
- ✅ Solves your specific problems
- ✅ Scales with your growth
- ✅ Has good community support
- ✅ Improves over time
Our stack checks all these boxes. It’s modern, proven, and optimized for AI-assisted development.
Want to work with this stack? Join our team or hire us for your project.
Have questions about our technology choices? Drop us a message—we love talking tech!
Tags:
Yoana Borissova
Head of Engineering
Technical leader specializing in scalable architecture and modern development practices. Champions clean code and innovation.