Skip to content

Security

What we protect, how, and what we are missing

This page has two parts. The first says what the system does. The second says what it does not. The second is the one that actually informs you, and the one almost nobody publishes.

Top-down view of a desk with several screens of code at night.

Scope of this page

No system is completely secure, and anyone who claims otherwise is selling something. Computronic Jota Systems holds no security certifications, has not been audited by an independent third party and has not undergone a penetration test. What does exist, and what is set out below, is a concrete set of technical controls applied from the design stage: data isolation in the database itself, permissions by role and by column, validation of everything that comes in, and a record of what gets changed. Each one is explained below, followed by an equally detailed list of what we do not yet cover. We publish both, because it is the only way for you to judge for yourself.

The controls that do exist

Six of them, and each one is in the code. Open any of them to see what it protects and what would happen without it.

  • Isolation in the database

    What it protects: That one client cannot see another client’s quotes, projects, payments or data.

    How it works

    The access rules live in Postgres (row-level security), not on the screen. Each table has policies stating which rows each role may see, and they are evaluated inside the database engine. Permissions are also per COLUMN: a person cannot change their own role or grant themselves permissions, because that column is not writable from the application.

    If isolation lived in the screen code, one forgotten filter in one query — or a guessed URL — would be enough for one client to see another’s data. This way, even if the query were written wrongly, the database does not return those rows.

  • Secrets never reach the browser

    What it protects: That the key with full database privileges does not end up in code anyone can read.

    How it works

    The service key lives in a server environment variable and is used in exactly one file. It never goes in a variable starting with `NEXT_PUBLIC_`, because those are baked into the bundle the browser downloads. The file holding the keys is in `.gitignore`, and the example file carries fake values.

    That key bypasses EVERY security policy. Published in the browser, anyone could read and delete the entire database. It is the most common serious flaw in real projects and the easiest to commit: mistyping one variable name is enough.

  • Everything coming in is validated on the server

    What it protects: That a tampered form, or a request made by hand without going through the page, cannot insert invalid or dangerous data.

    How it works

    Every form has a schema defining the shape, type and length of each field, and it is checked ON THE SERVER. Browser validation exists to be kind to whoever is typing; the one that decides is the server’s, because the browser’s is bypassed in three clicks. Queries always use parameters: a query is never assembled by gluing text together.

    Without server-side validation, anyone can send a direct request containing anything. And without parameterised queries, a string like `' OR 1=1 --` would stop being a string and become part of the query: that is plain old SQL injection.

  • Rate limiting per IP address

    What it protects: That nobody can brute-force passwords or fill the public forms with automated junk.

    How it works

    The counter lives in the database, not in server memory: that way it still holds even when the server is running as several copies at once. Each form has its own limit, and the ones that matter most — signing in, registering — fail closed if the control itself breaks, rather than letting requests through. What a signed-in client uploads is counted per account rather than per IP, so one person’s excess never stops someone else on the same network from paying.

    Without a limit, trying the thousand most common passwords against an account is a matter of seconds. With it, it takes over a day. It does not make the attack impossible: it makes it slow enough to stop being worth it.

  • Uploaded files are inspected

    What it protects: That a payment proof or a signed contract is not in fact a program.

    How it works

    Type and size are checked, and the real content of the file — its first bytes — is inspected rather than trusting the extension in its name. Payment proofs and contracts go to PRIVATE storage: they are read through a temporary link that expires, not a public address that can be shared or guessed.

    Renaming `program.exe` to `proof.jpg` is trivial. And if proofs sat at a public address, changing one number in the URL would be enough to see another client’s.

  • Security headers on every response

    What it protects: That another website cannot embed ours in a frame to trick whoever clicks, and that the browser does not guess file types.

    How it works

    They are sent on every response from the project configuration: no framing the site, no content-type guessing, control over what is sent when leaving the site, and the content policy. Private pages additionally carry the instruction not to be cached.

    Without the first, another site can place ours in an invisible frame so that someone who thinks they are clicking their button clicks ours. Without the caching one, somebody’s panel can stay stored in the browser of a shared computer.

What we do NOT have

This list matters as much as the one above, and it is here so you do not have to find it out on your own.

  • No certification, of any kind

    We do not hold ISO 27001 or any other. If you ever see a certification badge on this site, it is a mistake and we want you to tell us.

  • No external audit and no penetration test

    Nobody outside has reviewed this code looking for flaws. The controls above were designed by us, and whoever designs a defence is always the worst placed to see its gaps.

  • The content policy is not fully locked down

    The header that limits what code may run on the page still allows inline styles and scripts (`unsafe-inline`). It is needed because Next.js inlines its own startup code into the HTML. Closing it properly requires a per-request signature scheme that is not in place yet. Until it is, that defence is half-built, and you are better off hearing it from us.

  • Two-factor authentication

    There is no two-step verification for signing in yet. It is planned; today the password is the only thing between someone and an account.

  • Tested backups

    Automatic backups exist. What does not exist is a full end-to-end restore that has actually been performed, and until one has been, the honest thing is to say we have copies, not that we have backups. A copy that was never restored has proved nothing.

  • Legal review of the documents

    The privacy policy, the terms and the contract are drafts that no lawyer has reviewed. They are marked as such on their own pages.

Found a flaw?

Write to computronicjota0406@gmail.com and tell us what you saw. We have no bug bounty programme and cannot pay you, but we can answer you, fix it, and thank you properly. We ask one thing: do not publish the flaw until it is fixed, and do not access data that is not yours in order to demonstrate it.

Top-down view of a hooded figure typing code, face not visible.