Skip to content

Release: merge develop into main#88

Merged
stevenferey merged 20 commits intomainfrom
develop
Mar 9, 2026
Merged

Release: merge develop into main#88
stevenferey merged 20 commits intomainfrom
develop

Conversation

@stevenferey
Copy link
Owner

Summary

  • Security hardening — sanitize email templates, remove client-side API key exposure, require JWT secrets, auth on upload, in-memory token storage, helmet, SSL verification, cookie secure by default, PII removal from logs
  • Dependency updates — react-helmet-async v3, lucide-react ^0.577.0, remove legacy-peer-deps workaround
  • SEO & meta — SEO component, sitemap/robots.txt plugins, favicon, web manifest
  • DX improvements — ESLint config updates, documentation updates, docker-compose fix

Breaking changes

  • Backend requires JWT_ACCESS_SECRET and JWT_REFRESH_SECRET environment variables (will not start without them)
  • Users will need to re-login after deploy (access token no longer persisted in localStorage)
  • Production DB deployments with self-signed certs must set DB_SSL_REJECT_UNAUTHORIZED=false

Test plan

  • Backend starts with JWT secrets configured
  • Login/logout/refresh flow works correctly
  • Signature upload requires authentication
  • Security headers present on responses (curl -I)
  • SEO meta tags render correctly
  • Sitemap and robots.txt generated on build

🤖 Generated with Claude Code

renovate bot and others added 20 commits February 21, 2026 00:40
fix(deps): update dependency lucide-react to ^0.575.0
fix(deps): update dependency lucide-react to ^0.577.0
fix(deps): update dependency react-helmet-async to v3
Remove `.npmrc` files (root and backend) that globally set
`legacy-peer-deps=true`. This was originally needed because
react-helmet-async v2 didn't declare React 19 support, now
resolved with v3.0.0.

Add a targeted `overrides` in package.json for the remaining
eslint-plugin-react-hooks / ESLint 10 peer dep conflict, which
will be resolved once a stable release supports ESLint 10.

Closes #67

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add escapeHtml() to sanitize firstName before interpolation in
email templates, preventing stored XSS via malicious registration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove VITE_AI_API_KEY from frontend code, env types, and
documentation. VITE_ prefixed variables are bundled into the
client JS and visible to anyone inspecting the source.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the default admin user (admin@crafter.app / admin123) from
the migration file. Admin users should be created via a dedicated
seed script instead of being embedded in migration history.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add authenticate middleware to the upload route on the backend.
On the frontend, include credentials and Authorization header
in the upload fetch request.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Throw a fatal error at startup if JWT_ACCESS_SECRET or
JWT_REFRESH_SECRET are not set, instead of falling back to
predictable default values.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…tgreSQL

Default rejectUnauthorized to true in production. Providers using
self-signed certs (e.g. Railway) can opt out explicitly via
DB_SSL_REJECT_UNAUTHORIZED=false.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace user email addresses with user IDs in backend auth logs.
Remove email from frontend store logs and email service logs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Invert the logic so cookies are secure by default. Only disable
the secure flag when NODE_ENV is explicitly 'development'.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace Zustand persist middleware with in-memory token store.
Access tokens are no longer written to localStorage, reducing
the XSS attack surface. Session recovery after page refresh
relies on the httpOnly refresh token cookie.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add helmet to set security headers (X-Content-Type-Options,
X-Frame-Options, Strict-Transport-Security, etc.) on all
backend responses.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Restore hardcoded admin credentials in the migration file.
The default admin password should be changed manually after
installation on each environment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix(security): address security vulnerabilities across frontend and backend
@stevenferey stevenferey merged commit bb0ecdf into main Mar 9, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant