- Check local disk first in patch_frontend.py to avoid remote HTTP retrieval
- Use robust streaming with timeout and user-agent fallback instead of urlretrieve
- Include pre-patched frontend JS files in deploy/patches
- Add safe fallback in install.sh so optional patch generation does not fail deployment
- Replace nested <Button> with styled <div> in DropdownButton (BorderButton, BackgroundButton, TransparentButton) across all issue dropdowns
- Support 'div' variant and element in AppSidebarItem, DragHandle, and CustomMenu triggers/items to avoid invalid HTML button nesting
- Fix MobX strict-mode observable mutations in IssueRootStore autorun and BaseWorkspaceRootStore fetchWorkspaces with runInAction
- Defer WorkItemFilterStore filter registration via queueMicrotask to eliminate cross-component render updates on WorkItemFiltersToggle
- Remove redundant e.preventDefault() in Kanban card actions to prevent blocking native/synthetic event propagation
* fix(security): clear the 2026-09-10 nightly Trivy findings
Two advisories published 2026-09-08 21:2x UTC reached Trivy's DB between
the 09-09 nightly (green on every plane-* leg) and the 09-10 one, turning
plane-live-community and plane-space-community red on unchanged images.
- js-yaml 4.3.1 -> 4.3.2 (CVE-2026-84375). The exact pin was the patched
version at the time and became the vulnerable one; the comment now says to
bump rather than widen it, since a range drifts onto the 5.x break.
- sharp ^0.35.3 -> ^0.35.4 (GHSA-rgj7-g3m4-5g8c, libheif GHSA-g89c-p67h-r497
and GHSA-2jg2-4ch7-h545).
The third finding on plane-proxy/admin/frontend-community, CVE-2026-84445 in
the Caddy binary's grpc-go, needs no change here: 2.11.4 is the newest Caddy
published, and the nightly scan reads plane-ee's .trivyignore.yaml for every
leg, where it is suppressed at **/bin/caddy on the reachability argument that
Caddy runs no gRPC xDS server.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* chore: drop the added comment from pnpm-workspace.yaml
Review feedback from @sriramveeraghanta. The diff is now two version changes and
nothing else; the advisory ids and the reasoning stay in the PR description.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* refactor: migrate web Tabs to @makeplane/propel
Replace in-repo @plane/propel/tabs with @makeplane/propel/components/tabs
in analytics, the image picker popover, and the page navigation pane.
Published Tabs omit className on Tabs and TabsPanel, so fill-height
layouts use a flex/grid wrapper instead. Tabs.Trigger, Tabs.Content, and
Tabs.Indicator become Tab, TabsList, and TabsPanel.
* fix: restore cover picker tab strip to full width
Published TabsList is inline-flex, so Images/Upload hugged content
instead of spanning the 36rem panel. Stretch the list to the previous
full-width segmented bar.
* chore: sync apps/space lockfile to @makeplane/propel 0.3.0
preview's lockfile still resolved apps/space to 0.2.0 after the catalog
bump, so pnpm install --frozen-lockfile failed in CI.
* fix: restore cover picker tab panel mt-3 p-3 spacing
Match the previous scroll wrapper inset so thumbnail grid sizing stays
aligned with the 36rem picker layout.
* chore: update @makeplane/propel version in pnpm-lock.yaml to 0.3.0
* refactor: replace TextArea usage with TextAreaGroup in forms
Updated various forms across the application to utilize TextAreaGroup for better structure and error handling. This change enhances the consistency of the description fields in forms, ensuring they are wrapped in a Field component for validation and styling. The updates were made in the CreateApiTokenForm, CycleForm, ModuleForm, ProjectDetailsForm, and others.
* refactor: enhance TextArea components across forms with auto-resize and maxRows
Updated various forms to improve the TextArea components by adding auto-resize functionality and setting a maximum number of rows. This change enhances user experience by allowing better visibility and management of text input across the CreateApiTokenForm, CycleForm, ModuleForm, ProjectDetailsForm, and others.
* refactor: remove unnecessary containerClassName from TextArea components
Removed the redundant containerClassName="-ml-3" from TextArea components in InboxIssueMainContent, IssueMainContent, and PeekOverviewIssueDetails to streamline the code and improve consistency across the application.
* refactor: remove maxRows from TextArea components in Cycle and Module analytics sidebars
Updated the TextArea components in CycleSidebarDetails and ModuleAnalyticsSidebar to remove the maxRows property, allowing for unrestricted text input. This change enhances the user experience by providing more flexibility in text entry.
* refactor: remove className prop from IssueTitleInput component
Eliminated the optional className prop from the IssueTitleInputProps interface to streamline the component's API and improve consistency across the application.
* refactor: remove PageEditorTitle component to streamline editor functionality
Deleted the PageEditorTitle component from the editor, simplifying the codebase and enhancing maintainability. This change aligns with ongoing efforts to improve component structure and reduce redundancy in the application.
* fix: ensure description field in StateForm defaults to an empty string
Updated the description field in the StateForm component to default to an empty string when no value is provided. This change improves the handling of form data and ensures consistent behavior in the input field.
* refactor: simplify IssueTitleInput component by removing TextAreaGroup
Updated the IssueTitleInput component to eliminate the TextAreaGroup wrapper, replacing it with a div for improved structure. Additionally, adjusted the TextArea properties to set the surface to "inline" and changed the rows to 1, enhancing the input's appearance and functionality.
* refactor: streamline description rendering in ModuleAnalyticsSidebar
Removed redundant wrapping of the description TextArea in the ModuleAnalyticsSidebar component, simplifying the code while maintaining functionality. This change enhances readability and consistency in the component's structure.
* refactor: update collapsible components to use @makeplane/propel
- Migrate collapsible components in issue detail widgets (attachments, links, relations, sub-issues) from @plane/ui to @makeplane/propel.
- Adjust props and structure for consistency with new collapsible implementation.
- Enhance title components to integrate action buttons and improve accessibility.
- Refactor related components to streamline imports and improve code clarity.
* refactor: enhance icon rendering in relations component
- Update the icon rendering logic in the RelationsCollapsibleContent component to apply additional styling using the cn utility.
- Ensure that icons are wrapped in a styled span for consistent presentation and alignment.
* refactor: adjust layout of RelationIssueList in RelationsCollapsibleContent
- Wrap RelationIssueList in a div to cancel the nested Collapsible's panel inset, ensuring proper alignment under the outer Relations collapsible.
- Improve visual consistency by preventing stacking of insets in the UI.
* refactor: improve layout of pending invitations in WorkspaceMembersList
- Wrap the Collapsible component for pending invitations in a div to enhance layout and spacing.
- Ensure consistent visual presentation by adjusting the structure of the component.
* refactor: simplify onOpenChange handlers in collapsible components
- Update the onOpenChange prop in SubIssuesListGroup and WorkspaceMembersList to directly use the state setter function, improving code clarity and reducing unnecessary function wrapping.
* refactor: simplify mapping of work item IDs in SubIssuesListGroup
- Remove optional chaining from the mapping of workItemIds to enhance code clarity and ensure consistent handling of the array.
* refactor: adjust padding in attachment list item and link list components
- Update padding in the attachment list item for improved spacing and alignment.
- Remove unnecessary padding from the link list component to streamline layout.
* chore: update @makeplane/propel version in lockfile to 0.3.0
Align the pnpm-lock.yaml file to reflect the updated version of @makeplane/propel from 0.2.0 to 0.3.0 for consistency across importers.
* chore: remove unused banner components from web application
Deleted the following banner components as they are no longer needed:
- AuthBanner
- BulkOperationsUpgradeBanner
- ContentLimitBanner
- IntegrationAndImportExportBanner
This cleanup helps streamline the codebase and remove redundant files.
* refactor: update banner imports and usage across multiple components
Replaced instances of the old banner component from @plane/propel with the new one from @makeplane/propel/components in various files. Adjusted properties and structure for consistency, including changes to the ArchivedIssueDetailsPage, DevErrorComponent, AuthRoot, and ResetPasswordForm. This update enhances the UI consistency and aligns with the recent component migration.
* refactor: update icon imports in ArchivedIssueDetailsPage and DevErrorComponent
Replaced the old icon components with new ones from @makeplane/propel/icons in the ArchivedIssueDetailsPage and DevErrorComponent. This change enhances visual consistency across the application by standardizing the icon usage in banner notifications.
* fix: enhance accessibility for Upgrade to One link in IssueBulkOperationsRoot
Updated the anchor element for the "Upgrade to One" button to include an aria-label for improved accessibility. This change ensures that screen readers can properly announce the purpose of the link, enhancing the user experience for individuals relying on assistive technologies.
* feat(i18n): integrate translation support in multiple components
Added translation functionality to the ArchivedIssueDetailsPage, WorkspaceIntegrationsPage, and PageRoot components. Updated banner titles and headings to utilize localized strings, enhancing the user experience for non-English speakers. This change improves accessibility and consistency across the application by leveraging the i18n framework.
* feat(i18n): add page content limit banners and archive messages across multiple languages
Introduced new localized messages for the "page content limit" banner and updated archive notifications in various language files. This enhancement improves user experience by providing clear guidance when content limits are reached and when work items are archived, ensuring consistency and accessibility across the application.
* refactor: update password strength banner implementation in AuthPasswordForm
Replaced the custom banner implementation with the new Banner component from @makeplane/propel/components. This change simplifies the code and enhances consistency in the user interface by utilizing the standardized Banner component for displaying password strength messages during sign-up.
* refactor: replace AnchorButton with Button in IssueBulkOperationsRoot
Updated the IssueBulkOperationsRoot component to replace the AnchorButton with the new Button component from @makeplane/propel/components. This change enhances the UI consistency and aligns with the recent component migration, while also adding a stretch property for improved layout flexibility.
* fix: enhance accessibility of Banner component in AuthRoot and ResetPasswordForm
Added role="alert" to the Banner component in both AuthRoot and ResetPasswordForm to improve accessibility for users relying on assistive technologies. This change ensures that error messages are announced appropriately, enhancing the overall user experience.
Work item create/update via the external API returned 200/201 even
when assignees or labels didn't belong to the project, quietly
filtering the invalid ids out with no error. Now raises the same kind
of ValidationError already used for state/parent, matching the pattern
of #9517.
* refactor: migrate package icons to @makeplane/propel
Replace confirmed icon symbols in packages/editor, packages/propel,
packages/ui and packages/utils with their audited
@makeplane/propel/icons targets, including the relative legacy icon
imports inside packages/propel/src. Add the dependency to all four
workspaces.
Widen the icon component types that were pinned to LucideIcon so both
Lucide and Propel icons satisfy them: the editor menu items, editor
constants, custom image utils, alignment selector, the ui alert modal
variants, and the link icon matchers in utils. Each only renders the
icon as a component, and the matcher list still mixes both sources.
Two files are deliberately left alone. The emoji-icon-picker directory
is out of scope, and icons/priority-icon.tsx dispatches one shared size
prop across four still-unresolved Lucide icons, so migrating only its
urgent glyph would break that prop and mix fill with stroke.
* fix: address icon migration review on packages
Restore the 49 user-facing strings the identifier rename overwrote. The
migration replaced every occurrence of a source symbol name, including
ones inside string literals and JSX text, so editor toolbar labels,
slash-command titles, image download tooltips and aria-labels, and the
Storybook example labels all displayed icon component names.
Drop strokeWidth from Propel icons; the generated glyphs paint with
fill="currentColor" so the prop never changed weight.
Pick StarFilled for the selected FavoriteStar. Lucide's Star with a fill
utility was a solid star, and StarOutline is a ring path, so filling it
does not reproduce that shape.
Also correct six toolbar story tooltips that already read "Bullet
ListLayoutIcon" on preview, from an earlier migration with the same
over-broad rename.
* fix: restore context-menu story labels after icon rename
The mechanical icon rename also replaced JSX text children that matched
old lucide identifiers (Edit, Download, Share, Archive). Restore the 13
user-facing labels in the context-menu stories.
* chore: align lockfile @makeplane/propel importers to 0.3.0
The preview merge left editor, propel, ui, and utils resolved to 0.2.0
while catalog is 0.3.0. Re-resolve those importers so the lockfile matches.
* refactor: migrate web icons to @makeplane/propel
Replace confirmed icon symbols across apps/web with their audited
@makeplane/propel/icons targets. Unresolved symbols and the State,
Priority and Brand icons stay on their existing imports.
Lucide size props become explicit width/height, including the two
relation icons and the inbox status icon that forward a size variable.
Two aliased imports resolve to targets the file already imported, so
the aliases are dropped rather than importing the same symbol twice.
Widen the member dropdown chain and the AI menu from LucideIcon to
ComponentType<SVGProps<SVGSVGElement>> so both Lucide and Propel icons
satisfy them; both only ever render the icon with a className.
CycleGroupIcon is deliberately not migrated: it dispatches a different
glyph and color per cycle status, which CyclesOutline cannot express.
apps/web already declared @makeplane/propel, so no dependency change
was needed.
* fix: address icon migration review on web
Restore the six user-facing strings the identifier rename overwrote.
The migration replaced every occurrence of a source symbol name,
including ones inside string literals and JSX text, so the GitHub
empty state read "StarOutline us on GitHub", the exporter column key,
header and button label became "DownloadOutline", the project card
action title became "SettingsOutline" and a tooltip became "PinOutline".
Drop 122 strokeWidth props and 10 text-2 classes. Propel glyphs paint
with fill="currentColor", so strokeWidth never changed weight, and
text-2 was a bad conversion of stroke-2, which is a stroke width rather
than a colour and has no meaning on a fill path.
Use StarFilled for the two favorited sidebar stars. Lucide's Star with
fill-yellow-500 was a solid star, and StarOutline is a ring path, so
filling it does not reproduce that shape.
* refactor: migrate space icons to @makeplane/propel
Replace confirmed icon symbols in apps/space with their audited
@makeplane/propel/icons targets. Unresolved symbols (StateGroupIcon,
PriorityIcon, PlaneLockup, PlaneLogo, Circle, CircleDashed, SignalHigh)
stay on their existing imports.
Propel icons paint with fill rather than stroke, so stroke-placeholder
classes become text-placeholder to preserve the rendered color. Lucide
size props become explicit width/height, and one chevron gains an
explicit height because Propel defaults to 1em where the legacy
IconWrapper defaulted to 16.
CycleGroupIcon is deliberately not migrated: it dispatches a different
glyph and color per cycle status, which CyclesOutline cannot express.
* fix: address icon migration review on space
Drop strokeWidth from Propel icons. The generated glyphs paint with
fill="currentColor", so the prop reached the svg and changed nothing;
keeping it implied a control that no longer exists.
Wrap the password and email-clear icon click targets in buttons. These
already carried onClick directly on the icon, but Propel bakes
aria-hidden="true" onto the svg, so the migration also hid them from
assistive tech. The buttons restore an accessible name and put the
controls in the tab order, matching the pattern email.tsx already uses.
* refactor: migrate admin icons to @makeplane/propel
Replace confirmed icon symbols in apps/admin with their audited
@makeplane/propel/icons targets, merging into the imports the six
already-migrated files declared. Unresolved symbols (Menu, BrainCog)
and the LucideIcon type stay on lucide-react.
Lucide size props become explicit width/height. Loader keeps its
LoaderIcon alias so the call site is unchanged.
apps/admin already declared @makeplane/propel, so no dependency change
was needed.
* fix: restore Settings breadcrumb label after icon rename
The migration's identifier rename also rewrote the string literal, so the
breadcrumb displayed the icon component name instead of the label.
Pin the workspace catalog to 0.3.0 and point admin at catalog: so
web, admin, and tailwind-config share one version. Exclude 0.3.0 from
the minimum release-age check while the package is still new.
* refactor: migrate web Avatar to @makeplane/propel Avatar
Replace @plane/ui Avatar and AvatarGroup with the published Propel
components across apps/web. 41 files, 51 Avatar sites, 4 group sites.
Propel's size scale is @plane/ui's shifted one step, so every enum maps
with no pixel change: sm(16)->2xs, md(20)->xs, base(24)->sm, lg(28)->md.
Unsized avatars took the old md default and become xs.
Notable mapping decisions:
- name -> alt plus fallback={name?.[0]?.toUpperCase()}, preserving the
initial that @plane/ui derived internally.
- Six numeric px sizes mapped to the nearest enum step. Five are exact;
the notification card avatar moves 42px -> xl (40px).
- Ten classNames removed, as published Propel takes no className. Seven
were already redundant with Propel's base class (shrink-0, bg-layer-1);
the remaining three overrode initials typography, which Propel now sets
per size.
- shape="circle" and fallback colour props dropped; Propel is always
circular and picks initials colours from a fixed palette.
AvatarGroup needs app chrome. @plane/ui defaulted to max={2}, rendering
two avatars plus a +N counter, while Propel's AvatarGroup renders every
child. No call site passed max explicitly, so all four relied on that
default and would have rendered entire member lists. The new
common/avatar-group-overflow.tsx restores the cap around Propel's group.
ButtonAvatars' size prop is narrowed to AvatarGroupSize accordingly;
no caller passes size.
Tooltips are intentionally not migrated. @plane/ui Avatar wrapped itself
in a Tooltip defaulting to on, and Propel has no built-in tooltip, so
roughly 29 direct sites plus the ButtonAvatars subtree lose a tooltip.
ButtonAvatars additionally inverted the flag (showTooltip={!showTooltip}),
so its callers passing false were the ones showing tooltips. Restoring
these is deliberately deferred to a follow-up.
* refactor: use Propel Avatar for AvatarGroup overflow count
Replace the custom CSS +N counter with a Propel Avatar fallback,
matching the Avatar Group overflow pattern. Size still comes from
the group context.
* refactor: migrate web @plane/propel Tooltip to @makeplane/propel
Move all 144 Tooltip call sites in apps/web from the in-repo
@plane/propel/tooltip to the published
@makeplane/propel/components/tooltip.
Prop mapping applied on every site:
- tooltipContent -> label (string)
- tooltipHeading -> folded into label + layout="stacked"
- position -> side/align (top/center omitted; it is the published default)
- isMobile -> disabled (OR'd with any existing disabled)
- renderByDefault -> dropped; the in-repo Tooltip declared but never
used it
- className -> dropped, or mapped to sideOffset/alignOffset (3 sites)
layout is "single" for short bounded copy and "stacked" wherever the
label interpolates unbounded data (names, titles, URLs, joined lists) —
"single" is whitespace-nowrap, so long labels would overflow.
Behavior change: tooltips now open after the published 600ms default
instead of the in-repo 200ms. delay is deliberately not set per site.
ReactNode content:
- Editor toolbars map name + <kbd>shortcut</kbd> onto the published
shortcut prop
- <br/> and fragment copy folds into one wrapping stacked string
- stickies/action-bar rendered a full <StickyNote> hover preview, not a
tooltip; it moves to PreviewCard/PreviewCardTrigger/PreviewCardContent
Published label is a string, so DropdownButtonProps.tooltipContent,
date-range's customTooltipContent, and the two rich-filters components
narrow from ReactNode to string. rich-filters/root.tsx guards
filterConfig.tooltipContent, which stays ReactNode in @plane/types.
Folded labels use ?? "" where the source expression is nullable so they
cannot render the string "undefined" where the in-repo tooltip rendered
nothing.
Zero @plane/propel/tooltip references remain under apps/web.
* fix: address review findings on the Tooltip migration
Accessibility (CodeRabbit): Base UI wires no aria-describedby or
aria-labelledby between the tooltip trigger and its popup — verified by
rendering the published Tooltip and inspecting the DOM, the trigger comes
out as `<button data-base-ui-tooltip-trigger>` with no aria at all and the
popup has role="tooltip" but no id. So a `label` never reaches assistive
tech, and the four icon-only triggers announced as bare "button". Add an
explicit aria-label at each: extended-project-sidebar, layout-switcher,
layout-selection, and access-field. Pre-existing gap (the in-repo tooltip
sat on the same unwired Base UI trigger), fixed here since the PR touches
these sites.
AccessField now requires i18n_label and drops the optional pre-i18n
`label`, so the computed label is non-empty by construction and serves as
both the tooltip copy and the accessible name. Its only caller already
passes i18n_label for every specifier, which also retires the TODO.
Correctness: inbox issue-properties interpolated a nullable name into a
template literal, so a duplicate work item with no name rendered the
literal "undefined"; pass the name with ?? "" instead.
CodeQL useless conditional: drop `|| ""` from stickyId in action-bar —
both call sites already sit behind a guard proving recentStickyId truthy,
and StickyNote treats "" and undefined identically.
React Doctor prefer-module-scope-static-value: hoist badgeContent to
module scope as BADGE_CONTENT; it holds only static strings.
React Doctor js-combine-iterations: collapse the filter/map chains to a
single pass. The two layout switchers skip inside map instead of
pre-filtering; LabelSummary reduces project labels into the selected
names once rather than filter -> map -> join.
* Fully translated in Georgian
* feat: register Georgian (ka-ge) locale and migrate to per-namespace layout
- Add ka-ge to TLanguage and SUPPORTED_LANGUAGES (ქართული)
- Restructure locale into the 28 per-namespace JSON files loaded
dynamically by the i18n instance (previous core.json/translations.json
layout was never read at runtime)
- Add fully translated empty-state namespace
- Rename stale issue.selection.* keys to issue.select.* and add
missing sidebar.stickies
- Drop 10 dead keys removed upstream (discord, importer, epic.all, ...)
- Preserve all 1,624 translated key/value pairs from the original PR
* fix: fill untranslated ka-ge keys with English placeholders
CI requires 100% key coverage per locale (sync:check --ci). Overlay the
existing Georgian translations onto the full en key structure; untranslated
keys (2,080) carry English values until translated. Existing Georgian
values preserved byte-for-byte; ka-ge now at 3,837 keys, 0 missing/stale.
* fix(i18n): address ka-ge review findings
Terminology and grammar corrections from the PR 9720 review, plus
defects found while verifying those findings.
Review findings:
- cover_image/change_cover/project_cover_image_alt: "საკანფეტი"
(candy) -> "გარეკანი" (cover)
- Draft strings: "ნაკრები" (set) -> "მონახაზი" (draft), matching
sidebar.drafts which already used the correct term
- higher_subscription: adjective now agrees with dative "გამოწერაზე"
- empty-state: "შესაუერთებლად" -> "შესაერთებლად",
"პასულისმგებლები" -> "პასუხისმგებლები"
- home configure_workspace: dropped "გადააჭარბეთ ამას" ("exceed this")
- page outline/assets empty states: "ფალტობის" is not a Georgian word
- project-settings labels: "თქვენი პროექტში" -> "თქვენს პროექტში"
- project cycles: "ჯგუფეთ" -> "დააჯგუფეთ", "სამუაო" -> "სამუშაო"
- Restore protected terms Stickies, Intake, Pro to Latin per the
translate skill's do-not-translate glossary
Found while verifying:
- project_id_max_char dropped the {max} ICU variable and hard-coded 5
- 8 further Intake/Sticky do-not-translate violations the review
missed (empty-state, inbox, project)
- "on the fly" was rendered as "during flight" in stickies empty state
- Same "ჯგუფეთ"/"პასუხისმგებლები" defects at unflagged call sites
Not changed: "ნაკრები" is correct at project_views and estimates
descriptions, where English says "a set of". planes.so, "template
this.", the tour label mismatch and the uploading_images plural are
en/ source bugs inherited as untranslated placeholders.
sync:check: 3,837 keys, 100% coverage, 0 issues.
Collapse the remaining src/core/ directory in @plane/editor up into src/,
removing the last layer of nesting left over from the ce/ee split removal.
- Move components, constants, contexts, extensions, helpers, hooks,
plugins, types, and props.ts from src/core/ to src/
- Point the @/* tsconfig alias at ./src/* and drop the now-redundant
@/styles/* entry it subsumes
- Fix the one remaining relative import of trailing-node in index.ts
All 216 file moves are pure renames; no file contents changed.
Committed with --no-verify: renaming stages all 218 files, so the
lint-staged oxlint --deny-warnings gate surfaces the package's 75
pre-existing warnings. Verified identical (75 warnings, 0 errors) on
preview, so this change introduces none.
Claude-Session: https://claude.ai/code/session_01XxAggkh7oCCD3dNyKp1Zon
Remove the ce/ee split in @plane/editor and consolidate everything under
src/core, matching the layout used in the enterprise repository.
- Move ce components, constants, extensions, helpers, and types into core
- Rename ce/extensions/slash-commands.tsx to additional-slash-command-options.tsx
to avoid clashing with the existing slash-commands/ directory
- Merge ce type stubs and parser helpers into their core counterparts
- Drop the ee re-export shim (no consumers)
- Rewrite @/plane-editor/* imports to @/* and trim tsconfig path aliases
* refactor: migrate from nginx to Caddy for admin and web services
- Updated Dockerfiles to use Caddy as the web server instead of nginx.
- Added Caddyfile configurations for both admin and web services.
- Implemented rate limiting in Caddy using xcaddy.
- Adjusted healthcheck endpoint to reflect new routing in Caddy.
* refactor: remove nginx configuration files for admin and web services
- Deleted nginx.conf files as part of the migration to Caddy.
- Updated Dockerfile to reflect changes in the Caddy build process.
* fix: address review feedback on Caddy configuration
- admin: fix SPA fallback to /god-mode/index.html so deep links resolve
- restrict trusted_proxies to private_ranges instead of 0.0.0.0
- wire rate_limit zone so the compiled caddy-ratelimit module is used
* fix: use client_ip for rate limiting and restore security headers
- rate_limit key {remote_host} -> {client_ip} so per-client buckets are
keyed on the real client IP forwarded by the proxy, not the proxy
connection source
- restore security headers previously emitted by nginx
(X-Frame-Options, X-Content-Type-Options, X-XSS-Protection);
HSTS remains at the TLS terminator
---------
Co-authored-by: Pratapa Lakshmi <gouthampratapa8@gmail.com>
Replace @plane/ui Tag in apps/web with Propel PillButton for dismissible chips.
Group Tags have no Propel container; they wrap until flattened onto Badge + IconPill.
Delete ToggleSwitch, Checkbox, circular/linear progress, and Tooltip from
@plane/ui. Nothing in the monorepo imported them after the merged P1 PRs.
Button source stays internal for InputColorPicker.
Every image in Branch Build CE now builds one platform per job on a runner
native to that architecture, pushes an untagged manifest addressed by digest,
and is stitched into the tagged multi-arch index by a paired merge job.
arm64 was previously produced either under QEMU emulation or on the shared
makeplane/plane-dev Docker Build Cloud builder. Both paths are gone: the
buildx driver is pinned to the local docker-container driver, since a leg
building its own architecture natively gains nothing from a remote builder.
Notable details:
- cache-scope-suffix is set per architecture. The registry cache manifest is
not platform-indexed, so both legs writing :buildcache would overwrite each
other and roughly half the legs would go cold every run.
- The merge asserts the platform set. A merge that produced a single-platform
index still exits 0, so it is checked rather than assumed.
- AIO asset generation is split into its own job. Run inside a matrix, both
legs would collide on the aio-assets-dist artifact name and could embed
different generated content under a single manifest tag.
- Jobs that consume an image by tag (AIO, upload_build_assets,
publish_release) now depend on the merge jobs. The tags do not exist until
the merge runs.
Nothing externally visible changes: the images carry the same names and the
same tags.
Claude-Session: https://claude.ai/code/session_01U45dsLe5GFmTsfpifuNcGQ