How Katappult works
A simple 4-step process, from idea to deployed application.
Describe your need
Talk to Claude Code or provide your wireframes and specifications.
Katappult generates
Spring Boot backend, React frontend, business rules, unit tests, database migrations — everything is generated automatically.
Customize with AI
Keep working with your favorite AI assistant on the generated code.
Deploy and own
The code is yours. Deploy anywhere you want, on your infrastructure.
The technology
Spring Boot
Enterprise-grade Java backend, secure REST APIs, production-ready microservices.
React
Modern frontend, reusable components, TypeScript, unit tests included.
PostgreSQL + Liquibase
Robust relational database with versioned and reproducible migrations.
Flutter
Cross-platform iOS & Android mobile app from a single codebase. Native performance, smooth rendering.
Docker
Full-stack containerization for consistent, reproducible deployments independent of the target infrastructure.
Native AI
MCP integration for Claude Code, GitHub Copilot, Cursor and all modern AI assistants.
One prompt, one complete feature
A real prompt submitted to Katappult — endpoints, technical rules, response models. Everything described in markdown, nothing to code.
# Backend API – Custom Annonce feature request
## Objectif
Créer une API REST custom pour l'entité **Annonce** avec :
- endpoints publics (sans authentification)
- endpoints sécurisés (JWT requis)
- requêtes optimisées (QueryDSL, sans N+1)
---
## Règles techniques OBLIGATOIRES
- Aucun filtrage en mémoire
- Toutes les requêtes doivent être faites avec QueryDSL
- Utiliser `leftJoin(...).fetchJoin()` pour éviter le N+1
- Respecter l'architecture : Repository → Service → Controller
- Toutes les annonces publiques doivent avoir `lifecycleState = PUBLISHED`
---
## Endpoints publics
**Base path :** `/api/pub/v1/custom-annonce`
**Authentification :** aucune
### GET `/{entityUid}/details`
Retourne le détail complet d'une annonce.
**Contraintes :** Charger les relations (category, boutique, produit) via fetch join.
### GET `/new-annonces`
Retourne les 30 annonces les plus récentes.
**Contraintes :** lifecycleState = PUBLISHED · tri date DESC · limite 30
### GET `/list`
Liste paginée avec filtres optionnels.
| Paramètre | Type | Défaut |
|-------------|---------|-----------------|
| searchTerm | string | - |
| ville | string | - |
| categoryUid | string | - |
| productUid | string | - |
| enStock | boolean | true |
| page | int | requis |
| pageSize | int | requis |
| sort | string | createdDate,desc|
---
## Endpoints sécurisés
**Base path :** `/api/v1/custom-annonce`
**Authentification :** JWT requis
### GET `/annonces-of-user`
Retourne les annonces paginées d'un utilisateur (userUid, page, pageSize, status, sort).
### DELETE `/delete-annonces`
Suppression logique via `DeleteRequest` existant (`com.katappult.core.rest.vo.DeleteRequest`).
Ne pas créer de nouvelle classe.
---
## Modèles de réponse
### `CustomAnnonceListRestModel` — étend `AnnonceListRestModel`
| Champ | Source |
|-------------|-----------------------------------|
| categoryUid | annonce.getCategory().getUid() |
| categoryName| annonce.getCategory().getName() |
### `CustomAnnonceRestResponse` — étend `AnnonceRestResponse`
| Champ | Source |
|-------------|-----------------------------------|
| categoryUid | annonce.getCategory().getUid() |
| categoryName| annonce.getCategory().getName() |
| boutiqueUid | annonce.getBoutique().getUid() |
| boutiqueName| annonce.getBoutique().getName() |
| produitUid | annonce.getProduit().getUid() |
| produitName | annonce.getProduit().getName() |
---
## Agent
| Rôle | Fichier agent |
|------------------------|-----------------------|
| Développement backend | `backend-developer.md` |Ready to turn your ideas into reality?
Join the vibe coding revolution and start building your applications today.
Book a demo