How we build

We are software engineers. Before Greppi we built and ran systems that had to keep working — under load, under change, under someone else's deadline. That experience is what the generator encodes, so the code it writes is the code we would write ourselves.

What we believe

Opinionated beats configurable

There is one right way to do each thing here, and the platform takes it. Every project gets apps with their own routing, a Postgres database and migrations that run themselves at startup. You never wire plumbing, and no two projects drift into different shapes.

Code is read far more than it is written

Long descriptive names, files small enough to hold in your head, comments only where the why is not obvious in the code. Our standards ride along with every single change the AI makes — they are not a style guide someone forgot to enforce.

A demo is not a product

Real database, real backend, dev and test and production from the first minute. Nothing resets, nothing is mocked, and what you preview is what deploys.

Scale is a decision you make on day one

Frontends and backends are separate apps with their own containers and addresses. Growing means adding one, not untangling the one you have.

What that looks like in your code

invoice.entity.ts
1@Entity("invoices")
2export class Invoice {
3 @Column({ name: "due_date", type: "date" })
4 dueDate: string;
5}
6 
7synchronize: false,
8migrationsRun: true,

The shape of your data lives in entities and migrations — never in a synchronize flag that quietly drops a column the day you deploy.

Read the code it writes

Describe something, then open the code view and judge it for yourself.