CHANGELOG.md
Rama main · réplica de lectura del repositorio original.
# Changelog
All notable changes to Twenty CRM Client Portal are documented here.
This project follows [Semantic Versioning](https://semver.org/).
## [Unreleased]
### Security
- Fixed an authorization bypass in the Twenty file proxy (`/api/twenty/files`) that let any signed-in portal user fetch arbitrary Twenty API paths with the server's integration key, exposing CRM data outside their portal view grants, record scope, and field configuration. The proxy now only serves Twenty file paths, and only when the file belongs to a record the user can see through the requested portal view. Thanks to Kortali Abd for the report.
## [2.1.1] - 2026-07-07
### Highlights
- Polished the 2.1 client and administrator UI refresh with more stable modal layering, portal shell curvature, sidebar branding, and form input rendering.
- Improved first-run and first-login guidance so client onboarding callouts stay attached to the UI elements they describe.
### Added
- Added a client portal onboarding tour that introduces the home dashboard, portal navigation, records, filters, reports, profile settings, and record details.
- Added an invitation success confirmation dialog with a readable direct invite link and copy action after invite emails are sent.
### Changed
- Redesigned record notes and files tabs in the client portal detail sidebar to use fuller, purpose-built layouts instead of cramped embedded sections.
- Updated the client portal sidebar/workspace divider to match the administrator portal's curved shell treatment.
- Standardized client portal collapsed sidebar branding dimensions with the administrator sidebar.
- Normalized text field font metrics and line boxes across the application so special characters do not cause vertical text jumps.
- Improved invite-link contrast in both light and dark mode and changed dark mode link surfaces to neutral gray.
### Fixed
- Fixed invite-user modal handoff issues where the success dialog could clip behind or overlap the Users table while appearing.
- Fixed invite-user modal behavior so successful sends no longer close/reopen the form without showing the invite link.
- Fixed dropdown and icon-picker layering above dialogs.
- Fixed client portal onboarding tour highlighting so the home target is not blurred and the description card appears near the highlighted element.
- Fixed client portal sidebar curvature regressions, including the straight top intersection and extra grey curve fill.
### Upgrade notes
- Docker image version and package manager configuration now use version `2.1.1` / `v2-1-1`. No manual database migrations are required for this release.
## [2.1.0] - 2026-07-06
### Highlights
- Reorganized the client portal record workspace panel into a clean, tabbed interface to separate core fields, file attachments, and note records.
- Introduced a guided out-of-box setup installation experience for new applications, complete with interactive onboarding tours and live installer theme selection.
### Added
- Added tabbed layout navigation (`RecordPanelTabs`) in the client portal record side panel to separate fields, file attachments, and notes.
- Added a step-by-step guided setup walkthrough tour (`AdminOnboardingTour`) for administrators post-installation to introduce dashboard features.
- Added a multi-stage application setup wizard (`SetupForm`) to guide administrators through database connections, SMTP setup, and portal styling.
- Added a setup theme toggle (`SetupThemeToggle`) during installation with browser storage persistence.
- Added manual CRM data refresh capability (`RefreshButton`) inside the tabbed record header.
### Changed
- Enhanced layout, styling, and action triggers for files (`portal-attachments.tsx`) and notes (`portal-notes.tsx`) sections.
- Refined initial setup page styles under `oobe.css` and added OOBE color system classes to `globals.css`.
### Upgrade notes
- Docker image version and package manager configuration now use version `2.1.0` / `v2-1-0`. No manual database migrations are required for this release.
## [2.0.0] - 2026-07-02
### Highlights
- Rebuilt the client and administrator portals around a shared, responsive
workspace shell with compact navigation, anchored headers, consistent icon
states, and coordinated right-side panels.
- Added a client home dashboard with configurable workspace cards, recent
records, portal activity, and clear routes into records and reports.
- Redesigned administrator overview, settings, portal configuration, users,
client accounts, invitations, audit, and health surfaces to use the same
visual system as the client portal.
### Added
- Added multi-record selection, bulk editing, record context menus, local
favorites, favorites-only filtering, and anchored identity columns to portal
record tables.
- Added searchable, custom dropdowns and a complete Lucide icon catalog for
assigning per-view navigation icons and colors.
- Added secure HTTPS dashboard embeds with private-network, credential, and
unsafe-protocol rejection.
- Added editable PDF report titles, subtitles, text blocks, images, card theme,
bleed guides, zoom controls, and a persistent preview toolbar.
- Added redesigned CSV and XLSX export controls in a resizable side workspace.
- Added modal workflows for inviting users and creating client accounts.
- Added client and administrator profile images with local upload or secure
external URL support.
- Added repeatable demo mode data, seeded administrator/client workflows, and
mock Twenty CRM records for local product evaluation.
### Changed
- Replaced native selects across the application with accessible, themed menus
that remain attached to their fields and scroll within the viewport.
- Reworked record, bulk-edit, filter, and export drawers so the table and panel
animate as one layout without reload flashes or empty viewport regions.
- Moved record and export actions into the records/reports command rail and
removed redundant table controls and record subtitle text.
- Unified profile configuration, confirmation dialogs, action buttons, form
spacing, and dark-mode contrast between administrator and client portals.
- Made report and portal configuration command rails sticky while their content
scrolls independently beneath them.
### Fixed
- Fixed ascending and descending table sorting and retained sorting in scoped
exports.
- Fixed collapsed sidebar icon, logo, hover, and active-state alignment.
- Fixed dropdowns and the navigation icon picker rendering behind sticky or
clipped layout layers.
- Fixed account menus opening away from their trigger when a right-side panel
is active.
- Fixed duplicate sign-in loading indicators and added password visibility
controls.
- Fixed administrator metadata visibility and recent-activity capitalization.
### Security
- Validated dashboard embed targets as public HTTPS URLs and rejected local,
private-network, credential-bearing, and malformed destinations.
- Preserved server-side authorization, record scoping, editable-field
validation, and write-rate limiting for bulk record updates.
### Upgrade notes
- Database migrations `0015` and `0016` add application icon color and
per-portal navigation icon/color fields. Container startup applies them
automatically; host deployments must run `npm run db:migrate`.
- Review portal navigation icons after upgrade. Existing views receive safe
default icons and colors.
- The production image, package, Compose default, and deployment identifier now
use version `2.0.0` / `v2-0-0`.
## [1.5.2] - 2026-06-26
### Changed
- Enlarged the reports dashboard visual layout canvas to take up 100% of the horizontal width.
- Eliminated internal scrollbars in the visual canvas container to allow it to expand dynamically without nested scroll zones.
- Moved the dashboard widgets builder settings into a focused pop-up modal dialog triggered via the top action bar.
- Unified the configuration headings on the Reports tab to prevent duplicate titles.
## [1.5.1] - 2026-06-25
### Added
- Introduced a dedicated **Reports Dashboard** tab inside the Portal configuration view, moving the reports widgets list and layout editor out of the general settings and modal overlays.
- Added a widescreen vertical layout stack with a scrollable widgets editor at the top and a full-width visual layout canvas below it to maximize screen real estate.
- Implemented a premium config tab navigation bar with smooth transitions, brand color indicators, and metadata validation safety triggers.
- Centralized all layout, responsive grid wrapping, and tab styling within globals.css.
## [1.5.0] - 2026-06-25
### Added
- Added configurable client portal report dashboards with main-number, bar
chart, and donut chart widgets backed by scoped Twenty CRM records.
- Added administrator dashboard widget configuration and a visual default
layout editor for each portal view.
- Added a Reports tab to portal view previews so administrators can review the
client-facing reports experience before publishing.
- Added a client-facing Reports tab with drag-and-resize dashboard layout
controls and local layout persistence.
- Added a PDF export flow for dashboard reports with preview, PDF-specific
light/dark card styling, print-safe bleed guides, and PDF layout adjustment
before download.
### Changed
- Extended portal view validation and metadata resynchronization to include
dashboard widget fields and chart grouping fields.
- Updated dashboard report printing so only the PDF preview participates in the
print layout, keeping ordinary dashboards on one page when they fit.
## [1.4.0] - 2026-06-24
### Added
- Added inline editing directly in the client portal record sidebar for fields
administrators have marked as editable.
- Added a clearer CSV/XLSX export workflow with record-set, column, and format
steps plus a muted summary of the selected export options.
### Changed
- Refined the export wizard, confirmation pop-ups, note pop-ups, and
notification toasts to respect the configured portal brand color with muted
accents.
- Propagated the configured brand color to body-level portal pop-ups rendered
outside the main application shell, including future modal and toast surfaces.
## [1.3.5] - 2026-06-24
### Fixed
- Fixed the Docker runtime entrypoint on Windows-built release contexts by
normalizing the shell script to Linux line endings inside the image.
- Added repository line-ending attributes for shell scripts and Dockerfile
content so future Docker images keep executable Linux entrypoints.
## [1.3.4] - 2026-06-24
### Added
- Added a portal export wizard for CSV and XLSX downloads from each client
portal view.
- Added export options for current filtered views, all shared portal records,
selected visible columns, and spreadsheet format.
- Added a secured portal export API route that rebuilds portal authorization,
record scoping, saved filters, sorting, and fixed filters server-side before
generating the download.
### Security
- Restricted exports to the columns already exposed by the portal table.
- Escaped CSV cells that could be interpreted as spreadsheet formulas.
- Capped each export at 5,000 rows to avoid runaway downloads.
## [1.3.3] - 2026-06-22
### Added
- Added bounded LRU caching for individual Twenty CRM records with a five-minute
expiration and a 500-record maximum.
- Added client-controlled sorting by any displayed portal field in ascending or
descending order.
- Added per-user saved portal views that retain the current filters and sorting
selection.
### Changed
- Invalidated cached Twenty CRM reads after record writes, deletes, webhook
updates, manual refreshes, and integration-setting changes.
- Removed the empty Appearance section from client portal Settings.
### Security
- Restricted saved views to the current authenticated user and assigned portal.
- Revalidated saved filter operators and sort fields against the active portal
configuration before querying Twenty CRM.
## [1.3.2] - 2026-06-22
### Added
- Added a draggable and keyboard-accessible record sidebar resize handle.
- Persisted the preferred record sidebar width locally, with a maximum width
of half the browser viewport.
- Added note editing directly inside the full-note pop-up.
### Changed
- Kept the record sidebar mounted while loading so its skeleton transitions
directly into the loaded record without replaying the opening animation.
- Refined the record sidebar header, field layout, notes, attachments, spacing,
and surfaces to match the rest of the portal interface.
- Changed note list clicks to select a note in the sidebar; the full-note
pop-up now opens only from the explicit "View full note" action.
- Reduced the brightness and brand tint of the full-note pop-up background.
### Security
- Removed the unused npm and npx runtime tooling from the production image,
eliminating five Docker Scout findings including high-severity
`CVE-2026-33671`.
- Verified the production image with Docker Scout at zero critical, high,
medium, and low vulnerabilities.
## [1.3.1] - 2026-06-22
### Changed
- Updated the full-note pop-up to inherit the configured portal branding color.
- Applied the brand color to the note modal accent, backdrop tint, border,
controls, divider, shadow, and primary action for consistency with the rest
of the client portal.
## [1.3.0] - 2026-06-22
### Added
- Added readable labels for Select and Multi-select values by converting API
names to properly spaced and capitalized text.
- Added a per-portal option to retain raw API names when integrations require
exact values.
- Added a full-note modal in client portal record details so truncated note
previews can be opened and read without leaving the record.
### Changed
- Updated supported production and development dependencies within the
project's Node.js 22, TypeScript 5, and ESLint 9 compatibility range.
- Improved note interactions, keyboard dismissal, focus restoration, and
contributor access to note editing.
- Disabled new SVG uploads; existing SVG branding remains available with
sandboxed response headers.
### Security
- Resolved all npm audit findings, including transitive PostCSS and esbuild
advisories.
- Restricted branding and OAuth URLs to HTTP and HTTPS schemes.
- Forced unsafe proxied CRM file types to download and added MIME-sniffing and
sandbox protections to file responses.
- Limited signed webhook request bodies to 1 MB.
- Disabled Nodemailer filesystem and URL access and removed `unsafe-eval` from
the production Content Security Policy.
## [1.2.3] - 2026-06-19
### Fixed
- Fixed the portal assignment modal background and branding styling to respect the brand color configured in administrator settings.
## [1.2.2] - 2026-06-19
### Added
- Added an interactive "Assign Portals" modal for managing user portal access, replacing the inline forms.
- Added a multi-step portal assignment flow with checkboxes, role selections, and a confirmation summary screen.
## [1.2.1] - 2026-06-19
### Changed
- Moved the exposed Portal View creation settings from the views list page to a dedicated page `/admin/views/new`.
- Replaced the inline creation form in the Portal Views list with an "Add portal view" button.
## [1.2.0] - 2026-06-19
### Added
- Added per-user management for assigning multiple portal views with independent
viewer or contributor roles.
- Added one-click portal access revocation from the administrator Users screen.
- Added Google SSO configuration with optional Google Workspace domain
restriction.
- Added custom OAuth/OpenID Connect configuration using discovery metadata or
explicit authorization, token, and user-info endpoints.
- Added provider callback URL guidance and SSO controls to Admin Settings.
### Security
- Kept SSO invite-only by linking provider identities only to existing active
users with matching email addresses.
- Prevented OAuth providers from creating unapproved portal users.
- Revalidated active-user status before creating authenticated sessions.
## [1.1.1] - 2026-06-19
### Fixed
- Replaced broken corner-positioned deletion prompts with a centered,
accessible confirmation modal.
- Persisted light and dark theme selection across browser reloads and tabs.
- Corrected invitation acceptance so the newly created account replaces any
previously authenticated session.
- Added spacing around the SMTP save action.
### Changed
- Moved client-facing record filters into a right-side filter panel with an
active-filter indicator and one-click disable action.
- Replaced portal table page navigation with continuous record loading as the
user scrolls.
## [1.1.0] - 2026-06-19
### Added
- Added a branded, responsive HTML invitation email template that follows the
portal's configured identity.
- Added administrator-managed invitation email subjects and HTML templates
with supported recipient, branding, and invitation-link placeholders.
- Added a Health settings tab with live portal, PostgreSQL, and Docker Hub
checks.
- Added running-version and latest-published-image comparison with update
availability reporting.
## [1.0.2] - 2026-06-19
### Fixed
- Clarified SMTP encryption configuration by separating STARTTLS/standard SMTP
from implicit TLS.
- Prevented invalid port and encryption combinations from being saved or tested.
- Replaced low-level OpenSSL `wrong version number` failures with actionable
SMTP configuration guidance.
## [1.0.1] - 2026-06-18
### Fixed
- Corrected the bundled Docker migration runtime for Node.js ESM/CommonJS compatibility.
- Replaced the initial setup form with a guided administrator, Twenty CRM,
email, and branding workflow.
- Prevented implicit form submission from completing setup before the explicit
final action.
- Added SMTP connection and credential verification during initial setup.
- Applied the configured brand icon as the application favicon.
- Published multi-architecture Docker images for Linux AMD64 and ARM64.
### Deployment
Docker Compose now pulls the public image instead of building locally:
```bash
docker compose pull
docker compose up -d
```
## [1.0.0] - 2026-06-18
Initial production release of the self-hosted client portal for Twenty CRM.
### Highlights
- Secure invite-only authentication with system administrator, viewer, and contributor access controls.
- Configurable client accounts, portal views, invitations, user access, and record-level permissions.
- Twenty CRM metadata synchronization with validation for deleted or changed objects and fields.
- Person-scoped, filtered, and explicitly selected record access strategies.
- Metadata-driven list, detail, create, and edit experiences for permitted CRM records.
- Application branding, SMTP delivery, Twenty API, and signed webhook configuration.
- Audit history for administrative, authentication, access, and record mutation events.
- Health endpoints and a production-ready Docker Compose deployment with PostgreSQL.
### Deployment
- Node.js 22 and Next.js 16 standalone runtime.
- PostgreSQL 17 with automatic database migrations at container startup.
- Non-root application container with dropped Linux capabilities and `no-new-privileges`.
- Persistent volumes for PostgreSQL data and uploaded files.
- Versioned image metadata through `PORTAL_VERSION` and version-skew protection through the deployment-safe `PORTAL_DEPLOYMENT_ID`.
### Upgrade notes
This is the first stable release. New installations should copy `.env.example` to `.env`, replace every placeholder secret, and run:
```bash
PORTAL_VERSION=1.0.0 PORTAL_DEPLOYMENT_ID=v1-0-0 docker compose up -d --build
```
After the health check passes, open the configured `APP_URL` and complete the one-time `/setup` flow.
[2.1.1]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=2.1.1
[2.1.0]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=2.1.0
[2.0.0]: https://github.com/lilremark/twentycrmclientportal/releases/tag/v2.0.0
[1.5.2]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.5.2
[1.5.1]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.5.1
[1.5.0]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.5.0
[1.4.0]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.4.0
[1.3.5]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.3.5
[1.3.4]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.3.4
[1.3.3]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.3.3
[1.3.2]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.3.2
[1.3.1]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.3.1
[1.3.0]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.3.0
[1.2.3]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.2.3
[1.2.2]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.2.2
[1.2.1]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.2.1
[1.2.0]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.2.0
[1.1.1]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.1.1
[1.1.0]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.1.0
[1.0.2]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.0.2
[1.0.1]: https://hub.docker.com/r/lilremark/twentycrmclientportal/tags?name=1.0.1
[1.0.0]: https://github.com/lilremark/twentycrmclientportal/releases/tag/v1.0.0