← All repos

tryalist

Static React/CRA marketing page for alist.ae — pushes visitors to an external registration form. No backend, no forms, no API calls.

Primary stackReact 18 + TypeScript (CRA) Last commit2025-02-11 Repo size7.5 MB Files67 Branchmain Health Warning

Executive summary

Tech stack

React 18.3 TypeScript 4.9 Create React App 5.0.1 react-scripts @fontsource/poppins react-blurhash web-vitals No backend No router No state mgmt
CategoryTechnologyVersionNotes
UI frameworkReact + ReactDOM^18.3.1StrictMode, no concurrent features used
LanguageTypeScript^4.9.5strict: true, target: es5, jsx: react-jsx
Build toolreact-scripts (CRA)5.0.1Not ejected. CRA is deprecated upstream.
Fonts@fontsource/poppins^5.0.14Weights 300, 400, 700
Image loadingblurhash + react-blurhash^2.0.5 / ^0.3.0Imported but not used by CustomImage (it rolls its own spinner). Dead deps.
Testing@testing-library/react, jest-dom^13.4 / ^5.17Only the default CRA smoke test exists.
Perf telemetryweb-vitals^2.1.4reportWebVitals() called with no callback — no-op.
Dev workaroundajv^7.2.4 (devDep)Pinned to fix a CRA build break; do not remove blindly.
Server / DB / AuthNone. Pure static SPA.

Architecture

Single-page, single-route React app. index.tsx mounts <App/>, which renders one <Page/> that stacks a hero, mobile-only emoji decorations, five "about" sections, and a footer. All CTAs are external links — nothing here calls an API.

tryalist/ ├── package.json CRA scripts, name is "react-creator" (legacy) ├── tsconfig.json strict TS, target es5 ├── public/ favicons, manifest.json, index.html template │ ├── index.html alist.ae meta + OG tags │ └── logo/ served as /logo/* (not hashed) └── src/ ├── index.tsx CRA entry, StrictMode + Poppins weights ├── App.tsx trivial wrapper ├── index.css global utility classes (.font-color-*, .d-flex-lg, ...) ├── pages/page.tsx composes header / main / footer ├── hooks/useWindowSize.ts isMobile @ <=768 resize listener └── components/ ├── home/ hero + stats + "Get Started" external link ├── emojis/ mobile-only floating emoji PNGs ├── about-section1..5/ 5 scroll sections (millions raised, free │ starter pkg, global launch, help us grow, │ thank you) ├── footer/ social icons + ©2025 └── customImage/ responsive image w/ spinner + gradient halo (~30 props, single largest component)

Security assessment

Full-surface security review of the tryalist static SPA covering source code, dependency tree, build/dev toolchain, git history, and deployment posture. Every finding below is verified against package.json, package-lock.json, and the committed source; secret, injection, crypto, storage, and network dimensions were each grepped to a clean zero. Findings are mapped to industry frameworks and scored with CVSS 3.1 (environmentally adjusted for this repo's actual build-time-only reachability).

OWASP Top 10 2021 OWASP WSTG OWASP API Top 10 2023 OWASP MASVS (mobile only) CWE CVSS 3.1 NIST CSF 2.0
Anthropic cybersecurity-skills playbooks applied to this repo: sca-dependency-audit · secrets-and-credential-scan · injection-and-xss-review · security-headers-and-csp · supply-chain-and-cicd-integrity · client-storage-and-crypto-review · source-map-and-build-artifact-review

Risk narrative

tryalist is a static Create React App marketing single-page site for alist.ae with no backend, no forms, no API/network calls, no client-side storage, no crypto, and no secrets in source or git history (all verified by grep and the full git-history scan). The entire realistic attack surface is the build/dev toolchain: react-scripts 5.0.1 is deprecated and unmaintained, freezing a web of vulnerable transitive dependencies (nth-check ReDoS, webpack-dev-server source disclosure, postcss/cross-spawn/serialize-javascript) that cannot be patched in place because the project defines no overrides. Critically, none of these vulnerable packages ship to the production static bundle — they execute only at build/dev time — so the worst credible outcome is a build-time denial-of-service on a CI runner or developer machine, or disclosure of already-public marketing source via the dev server. Defense-in-depth gaps (no CSP/anti-framing headers, default-on source maps) and a governance gap (no CI/CD or automated SCA) raise the long-term regression risk but present no exploitable runtime path today. Overall risk is medium, driven entirely by the unmaintained-toolchain governance posture rather than any shipped, attacker-reachable runtime vulnerability.

Overall risk Medium
0 P0 0 P1 2 P2 5 P3

OWASP Top 10 2021 coverage

CategoryStatusNotes
A01:2021 Broken Access ControlN/ANo server, no auth, no protected resources — static SPA with no access-control surface.
A02:2021 Cryptographic FailuresCleanNo crypto, no secrets, no PII, no tokens shipped to the browser (env/key/storage/crypto greps all 0; git history clean).
A03:2021 InjectionCleanNo injection sinks: no dangerouslySetInnerHTML, no fetch/axios/XHR, no eval, no user input; image style props are numeric/string dimensions from webpack-imported assets.
A04:2021 Insecure DesignN/ATrivial single-page brochure; no security-relevant design decisions (lead capture lives in the separate business.alist.ae repo).
A05:2021 Security MisconfigurationPartialNo CSP/anti-framing headers (T-06) and default-on source maps (T-07) — defense-in-depth gaps only; no exploitable misconfiguration today.
A06:2021 Vulnerable & Outdated ComponentsVulnerableDeprecated CRA 5.0.1 toolchain (T-01) freezing build-time-only vulnerable transitives (T-02 nth-check, T-03 webpack-dev-server, T-04 postcss/cross-spawn/serialize-javascript); no SCA gate (T-05).
A07:2021 Identification & Authentication FailuresN/ANo authentication anywhere in the repo.
A08:2021 Software & Data Integrity FailuresPartialNo CI lockfile-integrity check, no SBOM, no signed/provenance build (T-05); deploy is manual. No insecure deserialization in app code.
A09:2021 Security Logging & Monitoring FailuresN/ANo server-side component to log; static SPA with no telemetry beyond a no-op reportWebVitals.
A10:2021 Server-Side Request ForgeryN/ANo server and no outbound request construction from user input.

Detailed findings

P0 critical · 0 P1 high · 0 P2 medium · 2 P3 low / info · 5
T-01

Unmaintained build toolchain: react-scripts 5.0.1 (Create React App) deprecated, no override path

P2 A06:2021 Vulnerable and Outdated Components CWE-1104 CVSS 5.9 EPSS n/a confirmed
Description

The repo's entire build/test/dev pipeline depends on react-scripts 5.0.1, the final release of the now-deprecated and unmaintained Create React App. CRA hard-pins a large web of transitive build dependencies (svgo 1.x, css-select 2.x, nth-check 1.x, postcss 7.x via resolve-url-loader, webpack-dev-server 4.x, rollup-plugin-terser, etc.) and will receive no further security patches. Because the project defines no overrides block, the vulnerable transitives documented in T-02/T-03/T-04 cannot be remediated through normal npm update; they are frozen at the versions CRA last shipped. This is the umbrella/root-cause finding that makes every other dependency CVE in this report unfixable-in-place.

Evidence
package.json:18 "react-scripts": "5.0.1" (last CRA release, April 2022; React team officially deprecated CRA Feb 2025) package.json has NO overrides/resolutions block (grep for "overrides"/"resolutions" in package.json returned 0 matches) — transitive security pins inside react-scripts cannot be bumped via npm update without ejecting or adding overrides package.json:47 devDependencies.ajv "^7.2.4" is a manual CRA peer-dep workaround, evidence the toolchain is already fighting bit-rot Prior audit _audits/tryalist/audit.html:116-121 flagged the same deprecated-tooling issue at P1
Attack scenario
An attacker who lands a poisoned asset (e.g. a malicious SVG via a PR) or a compromised transitive dependency exploits one of the frozen vulnerable build packages (T-02 nth-check ReDoS, etc.) to hang or, in the worst case, execute code on a CI runner or developer machine during npm run build/start. Because there is no patch channel for CRA, the window stays open indefinitely.
Impact

Build/dev-time risk only — nothing in this toolchain ships to the production static bundle (npm run build output is plain hashed JS/CSS/assets). Over time the build host and developer workstations accumulate known-vulnerable build/dev tooling with no patch channel, raising the chance a future CI runner or dev build hits a denial-of-service or, worst case, a tooling RCE when processing project assets. The governance consequence is that all transitive CVEs here are stuck until the toolchain is migrated.

Remediation
Migrate off CRA to a maintained bundler — Vite is the React-recommended replacement and a <1-day swap for this no-router, no-env static SPA (use vite-plugin-svgr for SVGs). As an interim measure, add an overrides block to package.json forcing the specific vulnerable transitives (nth-check>=2.1.1, postcss>=8.4.31, webpack-dev-server>=5.2.1, cross-spawn>=7.0.5, serialize-javascript>=6.0.2), then npm install + npm run build to validate. Add automated SCA (npm audit / Dependabot) per T-05 so future drift is caught.
Verifier note

Confirmed against package.json and package-lock.json. Merged the scanner's P2 'EOL toolchain' finding with the prior audit's P1 'Build tooling deprecated' (same root issue). Kept at P2: the prior P1 over-rated it because the impact is strictly build/dev-time for a static marketing site with no shipped runtime exposure.

T-02

ReDoS in nth-check 1.0.2 reachable via svgo 1.3.2 build chain (CVE-2021-3803)

P2 A06:2021 Vulnerable and Outdated Components CWE-1333 CVSS 5.3 CVE-2021-3803 EPSS ~0.3% confirmed
Description

nth-check before 2.0.1 contains an inefficient regular expression enabling Regular Expression Denial of Service. It is the canonical high-severity finding from npm audit on a default CRA 5.0.1 install, reachable through the SVG-optimization branch (svgo 1.3.2 → css-select 2.1.0 → nth-check 1.0.2) that @svgr/webpack uses when CRA imports SVGs as React components.

Evidence
package-lock.json node_modules/svgo/node_modules/nth-check version=1.0.2 (verified) Dependency chain from lockfile: node_modules/svgo (1.3.2) -> css-select 2.1.0 (requires nth-check ^1.0.2) -> nth-check 1.0.2 svgo 1.3.2 is pulled by @svgr/plugin-svgo (5.5.0) inside @svgr/webpack used by react-scripts 5.0.1 for SVG-as-component imports Modern top-level node_modules/nth-check is 2.1.1 (patched); only the legacy svgo 1.x branch retains 1.0.2 (GHSA-rp65-9cf3-cjxr, fixed in 2.0.1)
Attack scenario
A contributor (or a poisoned dependency/PR) introduces a crafted SVG whose attribute structure forces svgo's css-select to evaluate a pathological selector against vulnerable nth-check, hanging the build and consuming CPU on the CI runner or developer machine (build-time DoS).
Impact

Build-time denial-of-service only. svgo runs at build time over SVG assets in the source tree; there is no runtime path feeding untrusted CSS selectors to nth-check (the production bundle contains no svgo/nth-check code). The repo currently uses static SVG assets, so practical exploitability requires a malicious SVG to be introduced into the asset pipeline.

Remediation
Add a package.json override forcing nth-check>=2.1.1 across the tree ("overrides": { "nth-check": "^2.1.1" }), then reinstall and rebuild to confirm SVG handling still works. Durable fix: migrate off CRA/@svgr 5.x to maintained SVG tooling (Vite + vite-plugin-svgr). Treat untrusted SVGs entering the repo as a code-review gate.
Verifier note

Lockfile path verified exactly. CVSS down-adjusted from the scanner's 7.5 network-exploit base to a local/build-time environmental vector (AV:L, UI:R) because the vulnerable code is build-only and the input is not attacker-controlled at runtime; net 5.3, still P2 as the highest-reachability dep issue.

T-03

webpack-dev-server 4.15.2 dev-server source-code disclosure (CVE-2025-30359 / CVE-2025-30360)

P3 A06:2021 Vulnerable and Outdated Components CWE-346 CVSS 4.3 CVE-2025-30360 EPSS ~0.1% confirmed
Description

webpack-dev-server before 5.2.1 performs non-strict origin checks on its dev-server WebSocket/HTTP endpoints, allowing a malicious website a developer visits in the same browser to connect to the running dev server and exfiltrate bundled application source (CVE-2025-30359 via the websocket handshake; CVE-2025-30360 for non-allowed origins).

Evidence
package-lock.json node_modules/webpack-dev-server version=4.15.2 (verified) Invoked at dev time only via `react-scripts start` (package.json:23) GHSA-9jgg-88mc-972h (CVE-2025-30359) and GHSA-4v9v-hfq4-rm2v (CVE-2025-30360); both fixed in webpack-dev-server 5.2.1
Attack scenario
A developer runs react-scripts start and, in the same browser profile, visits an attacker-controlled page; that page connects to the local dev server's WebSocket and reads the bundled source. For this repo the exfiltrated source is non-sensitive marketing code.
Impact

Dev-time only — webpack-dev-server never deploys to production; the shipped artifact is the static npm run build output. The only data leakable is this app's source, which is a public-facing marketing page with no secrets, tokens, or user data (confirmed clean by the secrets-dimension review). Impact is therefore minimal even when triggered.

Remediation
Upgrade webpack-dev-server to >=5.2.1 (requires migrating off CRA, which pins 4.x — see T-01, or an override that may break CRA's dev server). Pragmatically: bind the dev server to localhost, avoid running it on shared/untrusted networks, and don't browse untrusted sites in the same browser profile while it runs. Long-term, Vite's dev server is unaffected.
Verifier note

Version verified. CVSS lowered from scanner's 6.3 to 4.3 (C:H->C:L) because the disclosed asset is confirmed-non-sensitive public marketing source; severity P3 given dev-time-only reach plus zero secret exposure.

T-04

Build-time transitive CVEs unfixable-in-place: postcss 7.0.39, cross-spawn 7.0.3, serialize-javascript 4.0.0

P3 A06:2021 Vulnerable and Outdated Components CWE-1333 CVSS 5.3 CVE-2023-44270 EPSS <0.5% confirmed
Description

Three additional vulnerable transitives are frozen inside the deprecated CRA build tooling (T-01): an EOL postcss 7.0.39 copy carried privately by resolve-url-loader 4.0.0 (CVE-2023-44270 line-break parsing), cross-spawn 7.0.3 (CVE-2024-21538 ReDoS), and a serialize-javascript 4.0.0 copy under the deprecated rollup-plugin-terser (CVE-2024-11831 XSS). In every case the modern top-level copy is already patched; only the loader-/plugin-private legacy copies are affected.

Evidence
postcss: package-lock.json node_modules/resolve-url-loader/node_modules/postcss version=7.0.39 (EOL line; CVE-2023-44270 / GHSA-7fh5-64p2-3v2j, fixed in 8.4.31); top-level node_modules/postcss is 8.4.39 (unaffected) cross-spawn: package-lock.json node_modules/cross-spawn version=7.0.3 (CVE-2024-21538 / GHSA-3xgq-45jj-v275 ReDoS, fixed in 7.0.5) serialize-javascript: package-lock.json node_modules/rollup-plugin-terser/node_modules/serialize-javascript version=4.0.0 (CVE-2024-11831 / XSS, fixed in 6.0.2); top-level node_modules/serialize-javascript is 6.0.2 (patched) rollup-plugin-terser 7.0.2 is itself deprecated (superseded by @rollup/plugin-terser)
Attack scenario
Theoretical only: would require an attacker to introduce maliciously crafted CSS, a crafted command/argument string, or attacker-controlled serialization input into the build pipeline — none of which is reachable in this repo's normal static build. No realistic runtime attack exists.
Impact

Build/minification-time processing of the project's own CSS/JS only — none of these parse attacker-controlled input in this repo, and none execute in the shipped production bundle. postcss 7.x parses the project's own CSS; cross-spawn parses static build/test commands; serialize-javascript serializes the project's own build artifacts (it produces no HTML rendered to end users). Practical exploitability is near zero; tracked for EOL/deprecated-component hygiene.

Remediation
Add package.json overrides forcing postcss>=8.4.31, cross-spawn>=7.0.5, serialize-javascript>=6.0.2, then reinstall and run the build to confirm; or remove resolve-url-loader if no SCSS url() rewriting is needed. All three disappear cleanly once the project migrates off CRA's bundled loader/plugin stack (T-01).
Verifier note

All three lockfile paths/versions verified exactly. Consolidated three separate low-severity scanner findings into one canonical entry: identical class (build-only transitive, non-exploitable here), identical remediation (overrides / CRA migration). CVSS reflects the postcss CVE-2023-44270 base; kept P3 to avoid finding-count inflation on non-reachable issues.

T-05

No CI/CD pipeline and no automated dependency-scanning gate

P3 A06:2021 Vulnerable and Outdated Components CWE-1395 CVSS 0.0 confirmed
Description

There is no CI/CD configuration of any kind. Consequently there is no automated software-composition-analysis gate (npm audit / Dependabot / Snyk) to catch the vulnerable transitives in T-01..T-04, no reproducible build pipeline, no enforced lockfile-integrity check, and no SBOM. Builds and deploys are manual ('tribal knowledge'), weakening supply-chain integrity guarantees.

Evidence
Full file listing (git ls-files) shows NO CI config: no .github/workflows, no bitbucket-pipelines.yml, no .circleci, no Dockerfile, no netlify.toml/vercel.json — only .gitignore as a dotfile (verified by repo-wide find) git remote origin = git@bitbucket.org:ParhamandCo/tryalist.git (Bitbucket) — a bitbucket-pipelines.yml would be the expected CI mechanism and is absent package.json:22-27 defines only start/build/test/eject scripts — no audit/lint/security gate CLAUDE.md and prior audit state deploy is undocumented ('build and dump build/ on a static host')
Attack scenario
A newly disclosed CVE in a frozen CRA transitive, or a compromised dependency version, is silently pulled into a developer/CI build with no audit gate to flag it; the resulting bundle is deployed manually with no provenance check.
Impact

Governance/process gap, not a directly exploitable flaw (CVSS base 0.0). The practical consequence is that dependency drift and newly disclosed CVEs go undetected, and the absence of a controlled build/deploy pipeline means no automated checkpoint prevents a poisoned dependency or tampered build artifact from reaching the static host serving alist.ae.

Remediation
Add a minimal Bitbucket Pipelines (or GitHub Actions) pipeline running npm ci (lockfile integrity), npm audit --audit-level=high, and a Dependabot/Snyk SCA scan on every push/PR, plus the production build. Enable Dependabot/Renovate for automated dependency-update PRs, document the deploy target, pin the Node version, generate and store an SBOM (syft), and pin any third-party CI actions to commit SHAs.
Verifier note

Absence of all CI/host config confirmed by full repo listing. CVSS 0.0 retained — this is a process gap with no in-repo attack vector; kept P3 for tracking.

T-06

No Content-Security-Policy or anti-framing/security response headers (defense-in-depth gap)

P3 A05:2021 Security Misconfiguration CWE-1021 CVSS 2.6 confirmed
Description

The app ships no Content-Security-Policy and no framing/clickjacking protection. There is no server in this repo and no host-level header config tracked, so unless the static host (alist.ae) injects headers out-of-band, the deployed page runs with browser defaults (no CSP, framable). The current React source has no HTML-injection sink (no dangerouslySetInnerHTML, no fetch, no user input — all verified), so this is purely defense-in-depth.

Evidence
public/index.html:1-66 <head> contains favicon/og/manifest meta tags but NO <meta http-equiv="Content-Security-Policy">, no frame-ancestors, no X-Content-Type-Options/Referrer-Policy equivalent (verified by reading the full file) grep -rniE 'Content-Security-Policy|X-Frame-Options|http-equiv' public/ returned 0 matches Repo has no static-host header config (no _headers, netlify.toml, vercel.json, .htaccess, nginx conf) — confirmed by full file listing
Attack scenario
If a future edit introduces an HTML/script-injection sink or a third-party script is compromised, there is no CSP to contain the resulting XSS; separately, the page can be embedded in an attacker iframe for a clickjacking/UI-redress overlay because there is no frame-ancestors directive.
Impact

Defense-in-depth only. No script-execution or framing attack is possible from the current code. A CSP and X-Content-Type-Options/Referrer-Policy would harden the page against future regressions (an added injection sink, a compromised third-party script) and against clickjacking/UI-redress. Low real-world impact for a static brochure with no auth, cookies, or user data.

Remediation
Add response headers at the static host (preferred): Content-Security-Policy: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; script-src 'self'; object-src 'none'; base-uri 'none'; frame-ancestors 'none', plus X-Content-Type-Options: nosniff and Referrer-Policy: strict-origin-when-cross-origin. CRA inlines a small runtime bootstrap script, so a hash/nonce or an 'unsafe-inline' fallback for script-src may be needed — validate the build before enforcing. A <meta http-equiv> CSP in public/index.html is a fallback if host headers are unavailable.
Verifier note

Confirmed: no CSP/headers anywhere, and confirmed there is no injection sink in src (no dangerouslySetInnerHTML, no user input, all external links use rel=noreferrer). Strictly hardening; P3.

T-07

Source maps emitted by default in CRA production build (regression-amplifier; no secrets present today)

P3 A05:2021 Security Misconfiguration CWE-540 CVSS 2.0 likely
Description

Create React App 5.0.1 emits *.js.map source maps in the production build by default because the repo never sets GENERATE_SOURCEMAP=false. Source maps reconstruct the original TypeScript/JSX, including comments. The current source contains no secrets, so today the only exposure is original code and module structure. The finding is a hardening / defense-in-depth concern: this is exactly the path by which a future REACT_APP_* key, analytics token, or inline credential would leak verbatim into a publicly fetchable .map file.

Evidence
package.json:24 build script is `react-scripts build` with NO GENERATE_SOURCEMAP override (grep for GENERATE_SOURCEMAP across repo returned 0 config matches; only unrelated source-map lib entries in package-lock.json) react-scripts pinned to 5.0.1 (package.json:18); CRA defaults GENERATE_SOURCEMAP=true, so build/static/js/*.js.map are emitted and typically deployed alongside the bundle Source confirmed to contain NO secrets (env/key/token greps all returned 0)
Attack scenario
An attacker fetches the deployed bundle's adjacent .map files to reconstruct original source for reconnaissance; if a future commit ever inlines a key or token into the front-end, that secret ships verbatim in the public source map.
Impact

Low today (no secrets in source). Discloses original module structure and developer comments to aid reconnaissance. If any secret is ever introduced into this front-end, it would be exposed in plaintext via the deployed source map with zero additional attacker effort (fetch app.js.map).

Remediation
Set GENERATE_SOURCEMAP=false for production builds (e.g. cross-env GENERATE_SOURCEMAP=false react-scripts build), or configure the static host not to serve *.map files publicly. Add a gitleaks pre-commit hook + CI secret-scan gate (ties into T-05) so a future secret can never reach the bundle/source map.
Verifier note

GENERATE_SOURCEMAP override absent (verified). Confidence 'likely' — whether .map files are actually deployed depends on the un-committed host config, which we cannot inspect from the repo; the build default is the basis.

Remediation roadmap

Immediate
Stop the bleeding on the highest-reachability build-time CVEs without a full migration.
  • Add a package.json overrides block forcing nth-check>=2.1.1, postcss>=8.4.31, cross-spawn>=7.0.5, serialize-javascript>=6.0.2 (T-01, T-02, T-04), then npm install + npm run build to validate SVG/CSS handling.
  • Set GENERATE_SOURCEMAP=false for production builds, or stop serving *.map on the host (T-07).
  • Bind the dev server to localhost and avoid untrusted browsing in the same profile while react-scripts start runs (T-03 interim).
This week
Close the governance gap that lets CVEs go undetected.
  • Add a minimal Bitbucket Pipelines pipeline running npm ci, npm audit --audit-level=high, and the production build on every push/PR (T-05).
  • Enable Dependabot/Renovate for automated dependency-update PRs and document the deploy target + pin the Node version (T-05).
  • Add a gitleaks pre-commit hook + CI secret-scan gate so a future secret can never reach the bundle or source map (T-07).
This month
Eliminate the root cause and the residual dev-server CVE.
  • Migrate off CRA to Vite — a <1-day swap for this no-router, no-env static SPA using vite-plugin-svgr for SVGs. This drops T-01..T-04 cleanly and yields an unaffected dev server, fully resolving T-03 (webpack-dev-server >=5.2.1 / Vite).
  • Generate and store an SBOM (syft) and pin any third-party CI actions to commit SHAs (T-05).
Hardening
Defense-in-depth for a clean-but-future-proofed posture.
  • Add security response headers at the static host: Content-Security-Policy (with frame-ancestors 'none'), X-Content-Type-Options: nosniff, and Referrer-Policy: strict-origin-when-cross-origin; validate the build before enforcing CSP given CRA's inline bootstrap script (T-06).
  • Treat any untrusted SVG entering the repo as a code-review gate (T-02), and coordinate an org-wide CRA→Vite migration + shared CI/SCA template across the A-List Bitbucket repos that share this posture.

Code quality

Run / deploy

Local setup

git clone <bitbucket-url> tryalist
cd tryalist
npm install
npm start          # http://localhost:3000
npm run build      # outputs build/ for static hosting

Environment

Deployment hints

No deploy config is committed. The build/ output is a fully static SPA (single index.html + hashed JS/CSS/asset bundles), so any static host works — S3+CloudFront, Netlify, Vercel, Cloudflare Pages, or even nginx. Confirm with the team where tryalist.alist.ae (or wherever this is served) currently points. The index.html hard-codes og:url to https://www.alist.ae/, hinting at the production target.

What to know before editing