Free
To try it out
- 1 project
- Package and code analysis
- Made-up and malicious packages
- Vulnerability summary
Tools
- Technical PDF report
- OpenVEX export
- CycloneDX SBOM
- Key for your CI
Drop your dependency file or your project archive. Tamiso sets aside the alerts that do not concern you and tells you, in plain English, what to fix and how.
3 of the 31 known vulnerabilities affect you.
Update next from version 15.2.2 to 15.2.3 or newer (fixes CVE-2025-29927). Run npm install next@15.2.3 to update package.json and the lockfile. Then run the tests and check that the application starts.
Update path-to-regexp from version 0.1.7 to 0.1.10 or newer (fixes CVE-2024-45296). path-to-regexp is an indirect dependency, pulled in by express: first update express to a version that uses path-to-regexp 0.1.10 or newer; otherwise add path-to-regexp to overrides in package.json, then reinstall with npm. Then run the tests and check that the application starts.
Read the advisory and see whether your application uses the affected function or option. If so, update to 1.6.0. If not, you can ignore these vulnerabilities. Advisory: https://osv.dev/vulnerability/GHSA-wf5p-g6vw-rhxx
src/lib/http.ts:1
src/lib/http.ts:2
lodash 4.17.20 CVE-2021-23337
Command execution on the serverCommand injection through the template function
Dismissed by you: our code never calls the vulnerable part.
Imported in your code: src/lib/http.ts:2
They do not exist on npm. Often a name made up by an AI: someone can publish it later with malicious code. Unless it comes from a private registry, remove it.
stripe-checkout-helper-ts3const stripe = new Stripe("sk_l****")
With this key, anyone can create payments and refunds and read your customers.
2alter table orders disable row level security;
The table becomes readable and writable by everyone with the anon key again.
Without this header, the browser can still open the unencrypted version of the site.
.map files let anyone rebuild the original source code, comments included.
https://boutique-martin.fr/_next/static/chunks/main.js.mapOne project per client app. Tamiso keeps the version history, checks again every day and prepares what you send to your clients.
One place for everything: a dependency file checks the packages, a .zip archive or a GitHub repository checks the code too. Tamiso compares with your decisions and shows you only what is left.
Every day, Tamiso checks the packages of the latest version again against the vulnerability databases and the CISA KEV catalogue. A new vulnerability shows up here and in the history.
Last automatic check on 01/11/2026 at 06:00 UTC. 1 new vulnerability on 30/10.
Code sent as a .zip is not kept: every day, only the packages are checked again. Link the repository so the code is too.
Dependency versions and code analyses, newest first.
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.
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.
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.
Do these updates one by one, running the tests after each: - Update next from version 15.2.2 to 15.2.3 or newer (fixes CVE-2025-29927). Run npm install next@15.2.3 to update package.json and the lockfile. Then run the tests and check that the application starts. - Update path-to-regexp from version 0.1.7 to 0.1.10 or newer (fixes CVE-2024-45296). path-to-regexp is an indirect dependency, pulled in by express: first update express to a version that uses path-to-regexp 0.1.10 or newer; otherwise add path-to-regexp to overrides in package.json, then reinstall with npm. Then run the tests and check that the application starts.
Update next from version 15.2.2 to 15.2.3 or newer (fixes CVE-2025-29927). Run npm install next@15.2.3 to update package.json and the lockfile. Then run the tests and check that the application starts.
Update path-to-regexp from version 0.1.7 to 0.1.10 or newer (fixes CVE-2024-45296). path-to-regexp is an indirect dependency, pulled in by express: first update express to a version that uses path-to-regexp 0.1.10 or newer; otherwise add path-to-regexp to overrides in package.json, then reinstall with npm. Then run the tests and check that the application starts.
Read the advisory and see whether your application uses the affected function or option. If so, update to 1.6.0. If not, you can ignore these vulnerabilities. Advisory: https://osv.dev/vulnerability/GHSA-wf5p-g6vw-rhxx
src/lib/http.ts:1
src/lib/http.ts:2
What Tamiso checked around the packages and the code, and what is missing to harden the project.
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
They do not exist on npm. Often a name made up by an AI: someone can publish it later with malicious code. Unless it comes from a private registry, remove it.
If it is an internal package from your private registry, the risk is still real (dependency confusion): also reserve this name, or the @… scope, on the public registry, and configure the private registry explicitly (.npmrc, --index-url) so installation never looks elsewhere.
stripe-checkout-helper-tsA vulnerability goes to “to fix” if it is actively exploited (CISA KEV catalogue, version makiety), if its EPSS exploitation probability is above 10%, if its severity is critical, or high with an exploitation probability of at least 1%. It is dismissed if its severity is low, or medium with an exploitation probability below 1%, or if the package is only used for development. The rest is “to check”. A single update often fixes several vulnerabilities, so they are grouped by package. Your decision always comes before the rule. Exception: a critical or very likely exploited vulnerability in a development package stays “to check”, because that package runs on your machines and in CI.
A package known to be malicious (OpenSSF malicious packages database) is always “to fix”, even if it is only used for development: it acts as soon as it is installed. This project also has a code analysis (01/11/2026): a vulnerability in a direct package that the code never imports and that no other package needs (according to the lockfile) goes down one level, and if the AI analysis showed that the code does not use the vulnerable part, the vulnerability is dismissed with that reason. Actively exploited vulnerabilities are never dismissed this way.
Your decisions follow the OpenVEX statuses (“not affected” with its justification, or “affected”). The OpenVEX export puts them in a standard JSON file (the same one vexctl, Trivy or Grype read): attach it to your SBOM for your clients and auditors. Vulnerabilities without a decision appear as “under investigation”.
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.
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.
3const stripe = new Stripe("sk_l****")
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.
1create table orders (id uuid primary key, items jsonb, email text);
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()).
2alter table orders disable row level security;
The table becomes readable and writable by everyone with the anon key again.
Delete this line and turn RLS on with per-user rules.
4const res = await pool.query(`SELECT * FROM products WHERE name LIKE '%${q}%'`)
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.
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.
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.
src/lib/stripe.ts:3const stripe = new Stripe("sk_l****")
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.
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()).
supabase/migrations/003_orders.sql:1create table orders (id uuid primary key, items jsonb, email text);
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.
The table becomes readable and writable by everyone with the anon key again.
Delete this line and turn RLS on with per-user rules.
supabase/migrations/003_orders.sql:2alter table orders disable row level security;
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.
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.
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.
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.
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.
A cookie without Secure can travel unencrypted, without HttpOnly an injected script can read it, without SameSite it is sent with requests from other sites.
Add Secure, HttpOnly and SameSite=Lax to session cookies.
session : Secure, SameSiteTamiso found a security problem on my site https://boutique-martin.fr: Cookie without protections (session : Secure, SameSite). A cookie without Secure can travel unencrypted, without HttpOnly an injected script can read it, without SameSite it is sent with requests from other sites. Fix it in the project's code or configuration: Add Secure, HttpOnly and SameSite=Lax to session cookies. Tell me what you changed and what I need to set myself with my host.
Without this header, the browser can still open the unencrypted version of the site.
Add the header Strict-Transport-Security: max-age=31536000; includeSubDomains.
Tamiso found a security problem on my site https://boutique-martin.fr: Strict-Transport-Security header missing (https://boutique-martin.fr). Without this header, the browser can still open the unencrypted version of the site. Fix it in the project's code or configuration: Add the header Strict-Transport-Security: max-age=31536000; includeSubDomains. Tell me what you changed and what I need to set myself with my host.
The http:// version does not redirect to https://: on public Wi-Fi, someone can read or change what the visitor sees.
Turn on automatic redirection to HTTPS in your host's settings.
http://boutique-martin.fr/Tamiso found a security problem on my site https://boutique-martin.fr: The site is still reachable without HTTPS (http://boutique-martin.fr/). The http:// version does not redirect to https://: on public Wi-Fi, someone can read or change what the visitor sees. Fix it in the project's code or configuration: Turn on automatic redirection to HTTPS in your host's settings. Tell me what you changed and what I need to set myself with my host.
.map files let anyone rebuild the original source code, comments included.
Turn off source maps in production (for example productionBrowserSourceMaps: false, build.sourcemap: false) or keep them for your error tracking tool only.
https://boutique-martin.fr/_next/static/chunks/main.js.mapTamiso found a security problem on my site https://boutique-martin.fr: Source code published with source maps (https://boutique-martin.fr/_next/static/chunks/main.js.map). .map files let anyone rebuild the original source code, comments included. Fix it in the project's code or configuration: Turn off source maps in production (for example productionBrowserSourceMaps: false, build.sourcemap: false) or keep them for your error tracking tool only. Tell me what you changed and what I need to set myself with my host.
This header limits the scripts the page can load: it greatly reduces the impact of an XSS flaw.
Add a Content-Security-Policy, starting with default-src 'self' and then the domains you need.
Tamiso found a security problem on my site https://boutique-martin.fr: Content-Security-Policy header missing (https://boutique-martin.fr). This header limits the scripts the page can load: it greatly reduces the impact of an XSS flaw. Fix it in the project's code or configuration: Add a Content-Security-Policy, starting with default-src 'self' and then the domains you need. Tell me what you changed and what I need to set myself with my host.
Another site can show yours invisibly and make your visitors click without knowing it (clickjacking).
Add Content-Security-Policy: frame-ancestors 'self' (or X-Frame-Options: DENY).
Tamiso found a security problem on my site https://boutique-martin.fr: The site can be shown inside another site's frame (https://boutique-martin.fr). Another site can show yours invisibly and make your visitors click without knowing it (clickjacking). Fix it in the project's code or configuration: Add Content-Security-Policy: frame-ancestors 'self' (or X-Frame-Options: DENY). Tell me what you changed and what I need to set myself with my host.
The full address of your pages (with its parameters) can be sent to the sites your pages call.
Add the header Referrer-Policy: strict-origin-when-cross-origin.
Tamiso found a security problem on my site https://boutique-martin.fr: Referrer-Policy header missing (https://boutique-martin.fr). The full address of your pages (with its parameters) can be sent to the sites your pages call. Fix it in the project's code or configuration: Add the header Referrer-Policy: strict-origin-when-cross-origin. Tell me what you changed and what I need to set myself with my host.
Someone who finds a flaw does not know whom to write to. For a product sold in the EU, the Cyber Resilience Act requires a contact for reporting vulnerabilities.
Publish /.well-known/security.txt with at least a Contact: line and an Expires: line (RFC 9116).
Tamiso found a security problem on my site https://boutique-martin.fr: No security.txt file (https://boutique-martin.fr). Someone who finds a flaw does not know whom to write to. For a product sold in the EU, the Cyber Resilience Act requires a contact for reporting vulnerabilities. Fix it in the project's code or configuration: Publish /.well-known/security.txt with at least a Contact: line and an Expires: line (RFC 9116). Tell me what you changed and what I need to set myself with my host.
Each scan also looks for sensitive files (.env, .git, backups, logs), debug mode and consoles, admin tools, API documentation and GraphQL, open redirects, listed folders, old TLS versions, security.txt and CORS. Everything is read-only on your domain: no login, no form sent, no data changed.
Leave the verification code in place: it is checked before each full scan.
|
Atelier Lumen
Security of your application: Boulangerie Martin, boutique-en-lignePrepared for Claire Martin. Version of 01/11/2026: 142 packages analysed. The project's code was analysed too.
2 updates planned
No known vulnerability is being exploited right now against the components of your application. 2 components have a known vulnerability to handle: we are updating them by 15/11/2026. The code contains a secret key to remove and replace. 2updates to do
1package to check
31known vulnerabilities, 28 of them dismissed
4serious problems in the code
What we are fixing
What we are checking
Vulnerability handling registerDeadlines from detection: 7 days for an actively exploited or critical vulnerability, 30 days for high severity, 90 days for medium severity, 180 days for low severity.
What was checkedComponents142 packages checked against the OSV and FIRST EPSS databases and the CISA KEV catalogue.
Made-up or malicious packagesOne package not found in its registry, often made up by an AI.
Keys and passwordsOne secret key in the code: to remove and replace.
Application code3 serious problems to fix (data access, injection or configuration).
A vulnerability is dismissed when it does not affect your application: part of the component not used, very low risk in practice, or a decision checked by our team. The list of the 28 dismissed vulnerabilities, with the reason for each, is available on request from Atelier Lumen. This report does not replace a security audit. Sources: OSV, FIRST EPSS, CISA KEV (catalogue of makiety), PyPI, npm.
Atelier Lumen
Analysis made with Tamiso
|
Each project at a glance: the state of dependencies and code, the daily check and the version history. See details
To try it out
Tools
For solo builders
Tools, on top of Free
For agencies and small teams
Tools, on top of Indie
For software and connected-device publishers
Tools, on top of Studio
In the paid plans, AI is part of the analysis. It reviews the alerts in your code and dismisses the false ones, checks whether your code really calls the vulnerable part of a package, explains each vulnerability in plain language and translates the database descriptions. The free plan analyses with public databases and our rules, without sending your code to an AI model.
Yearly, 2 months free: Indie 190 €, Studio 590 €, Publisher 1 490 € per year, excl. VAT. Paid plans open soon: reserve yours, no payment today. Pro and Partner (consultants, agencies, auditors) are priced on request. Reserve a plan