The mistakes AI leaves in the code.

Send the project's .zip archive or the address of a public GitHub repository. Tamiso looks for secret keys, Supabase tables without RLS, SQL built from text and other common mistakes, then shows where the data flows.

boutique-en-ligne

4 problems to fix before publishing. Last analysis on 01/11/2026, boutique-en-ligne.zip.

boutique-en-ligne.zip10 files analysed

Code map

Where the data comes from, which functions it goes through and where it ends up. Problems sit in the function where they appear; pick one to keep only its path.

Where data comes fromCode: files and functionsWhere it ends up src/app/api/orders/route.tssrc/lib/orders.tssrc/lib/stripe.tssrc/lib/mail.tssrc/app/api/search/route.tssrc/lib/products.tssupabase/migrations/003_orders.sql jsonquery: qbody.itemsqitemsemailresend.emails.sendordersqueryrulesrules POST /api/ordersPOST /api/ordersHTTP requestGET /api/searchGET /api/searchHTTP requestPOST(request)POST(request)src/app/api/orders/route.ts:3GET(request)GET(request)src/app/api/search/route.ts:3sendConfirmation(email, id)sendConfirmation(email,…src/lib/mail.ts:5createOrder(items, email)createOrder(items, emai…src/lib/orders.ts:5total(items)total(items)src/lib/orders.ts:12searchProducts(q)searchProducts(q)src/lib/products.ts:3createPayment(amount)createPayment(amount)src/lib/stripe.ts:5const stripe = new Stripe("sk_l****")const stripe = new Stri…src/lib/stripe.ts:3create table orders (id uuid primary key, items jsonb, email text);create table orders (id…supabase/migrations/003_orde…alter table orders disable row level security;alter table orders disa…supabase/migrations/003_orde…DatabaseDatabasePostgreSQL, SupabaseEmailsEmailssending
problem in this function entry point the data comes from path of the problem where the data ends up

Pick a problem

The map then keeps only its path: the entry point the data comes from, the functions it goes through and the place where it ends up.

Map built by reading the code (Python, JavaScript and TypeScript) without running it: a dynamic call or a decorator can slip through. Only the names of functions and routes and the line numbers are kept.

criticalCWE-798
Stripe secret key in the code

With this key, anyone can create payments and refunds and read your customers.

Revoke the key in the Stripe dashboard, then read it from a server-side environment variable.

1 place in the code
  • src/lib/stripe.ts:3const stripe = new Stripe("sk_l****")
See the prompt

In src/lib/stripe.ts:3: Stripe secret key in the code. Revoke the key in the Stripe dashboard, then read it from a server-side environment variable. Fix only these places, then explain the change to me.

criticalCWE-284
Supabase table without RLS

Without Row Level Security, your app's public anon key is enough to read and change the whole table.

Add “alter table … enable row level security;” then rules that restrict each row to its owner (auth.uid()).

1 place in the code
  • supabase/migrations/003_orders.sql:1create table orders (id uuid primary key, items jsonb, email text);
See the prompt

In supabase/migrations/003_orders.sql:1: Supabase table without RLS. Add “alter table … enable row level security;” then rules that restrict each row to its owner (auth.uid()). Fix only these places, then explain the change to me.

criticalCWE-284
RLS turned off on a table

The table becomes readable and writable by everyone with the anon key again.

Delete this line and turn RLS on with per-user rules.

1 place in the code
  • supabase/migrations/003_orders.sql:2alter table orders disable row level security;
See the prompt

In supabase/migrations/003_orders.sql:2: RLS turned off on a table. Delete this line and turn RLS on with per-user rules. Fix only these places, then explain the change to me.

highCWE-89
SQL query built from user text

If a value comes from the user, they can read or wipe the database (SQL injection).

Use parameters (%s, ?, $1) or the ORM instead of pasting values into the query.

1 place in the code
  • src/lib/products.ts:4const res = await pool.query(`SELECT * FROM products WHERE name LIKE '%${q}%'`) Data sent by the user in src/app/api/search/route.ts:4, passed on by searchProducts (src/app/api/search/route.ts:5), used here without checking.
See the prompt

In src/lib/products.ts:4: SQL query built from user text. Use parameters (%s, ?, $1) or the ORM instead of pasting values into the query. Fix only these places, then explain the change to me.

What the code analysis checks

Keys and passwords written in the code (Stripe, AWS, GitHub, GitLab, OpenAI, Anthropic, Hugging Face, SendGrid, Slack, Telegram, Google, npm and PyPI tokens, database addresses with a password, private keys, .env files), the application secret key hard-coded, secrets exposed to the browser (NEXT_PUBLIC_, VITE_…), the Supabase service_role key in the browser, Supabase tables without RLS or with open policies (across all the project's migrations), Firebase rules that are open or in “test mode”, Supabase views and functions that bypass RLS, SQL queries and system commands built from text, requests, files and redirects chosen by the user (also when the value goes through a variable a few lines earlier), data saved without choosing the fields, data loading that can run code, passwords hashed with MD5 or compared to a fixed value, weakened CSRF protection or session cookies, tokens in localStorage or drawn with Math.random, debug mode on, TLS or JWT verification turned off, CORS open with credentials and HTML inserted without sanitising. Example values (your-key, xxxx), default local passwords, comments, tests and test configurations are not reported, except for secrets.

In a project, the analysis also notes which packages are imported in the code: a vulnerability in a package that the code never imports, and that no other package needs according to the lockfile, goes down one level, with the reason. Dependency files found (package-lock.json, requirements.txt, composer.lock…) directly give a new version of the dependency analysis.

The code is read in memory and then forgotten: Tamiso keeps only the file name, the line and a short excerpt with secrets masked. Dependency and build folders (node_modules, dist…) are skipped. A rule-based analysis does not replace a security review.

How it works

Rules for common mistakes

Secrets, Supabase and Firebase, SQL injections, open redirects, debug mode left on. Each rule has its CWE identifier and a one-sentence fix.

The code map

Where data comes from (routes, scripts), which functions it goes through and where it ends up: database, e-mails, files, external services. Each problem is placed on its path.

The code is not kept

The archive is read in memory, then forgotten. Tamiso keeps the file, the line, the rule and a short excerpt with the secret masked.

Included in the free planWith the Indie plan, AI dismisses false alarms, says why and checks whether your code calls the vulnerable part of a package.
Analyse your code