- Add multi-level cache strategy with fallback keys
- Implement conditional installation logic (cache hit/miss)
- Enable cross-job cache sharing to eliminate redundant installs
- Add performance monitoring with timing and status notifications
- Optimize all CI jobs (lint, types, test, test-server, bundle-size)
- Create comprehensive caching strategy documentation
Expected improvements:
- 60-70% reduction in yarn install time across workflows
- Cache hit rate >80% for typical development workflows
- Faster job startup times with shared dependency cache
* fix: New French translations from Crowdin [ci skip]
* fix: New Hebrew translations from Crowdin [ci skip]
* fix: New Hungarian translations from Crowdin [ci skip]
* fix: New Polish translations from Crowdin [ci skip]
* fix: New Korean translations from Crowdin [ci skip]
* fix: New German translations from Crowdin [ci skip]
* fix: New Romanian translations from Crowdin [ci skip]
* fix: New Spanish translations from Crowdin [ci skip]
* fix: New Czech translations from Crowdin [ci skip]
* fix: New Danish translations from Crowdin [ci skip]
* fix: New Italian translations from Crowdin [ci skip]
* fix: New Japanese translations from Crowdin [ci skip]
* fix: New Dutch translations from Crowdin [ci skip]
* fix: New Portuguese translations from Crowdin [ci skip]
* fix: New Swedish translations from Crowdin [ci skip]
* fix: New Turkish translations from Crowdin [ci skip]
* fix: New Ukrainian translations from Crowdin [ci skip]
* fix: New Chinese Simplified translations from Crowdin [ci skip]
* fix: New Chinese Traditional translations from Crowdin [ci skip]
* fix: New Vietnamese translations from Crowdin [ci skip]
* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]
* fix: New Indonesian translations from Crowdin [ci skip]
* fix: New Persian translations from Crowdin [ci skip]
* fix: New Thai translations from Crowdin [ci skip]
* fix: New English, United Kingdom translations from Crowdin [ci skip]
* fix: New Norwegian Bokmal translations from Crowdin [ci skip]
* fix: New Norwegian Bokmal translations from Crowdin [ci skip]
* fix: New Korean translations from Crowdin [ci skip]
* fix: New French translations from Crowdin [ci skip]
* fix: New Hebrew translations from Crowdin [ci skip]
* fix: New Hungarian translations from Crowdin [ci skip]
* fix: New Polish translations from Crowdin [ci skip]
* fix: New Korean translations from Crowdin [ci skip]
* fix: New German translations from Crowdin [ci skip]
* fix: New Romanian translations from Crowdin [ci skip]
* fix: New Spanish translations from Crowdin [ci skip]
* fix: New Czech translations from Crowdin [ci skip]
* fix: New Danish translations from Crowdin [ci skip]
* fix: New Italian translations from Crowdin [ci skip]
* fix: New Japanese translations from Crowdin [ci skip]
* fix: New Dutch translations from Crowdin [ci skip]
* fix: New Portuguese translations from Crowdin [ci skip]
* fix: New Swedish translations from Crowdin [ci skip]
* fix: New Turkish translations from Crowdin [ci skip]
* fix: New Ukrainian translations from Crowdin [ci skip]
* fix: New Chinese Simplified translations from Crowdin [ci skip]
* fix: New Chinese Traditional translations from Crowdin [ci skip]
* fix: New Vietnamese translations from Crowdin [ci skip]
* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]
* fix: New Indonesian translations from Crowdin [ci skip]
* fix: New Persian translations from Crowdin [ci skip]
* fix: New Thai translations from Crowdin [ci skip]
* fix: New English, United Kingdom translations from Crowdin [ci skip]
* fix: New Norwegian Bokmal translations from Crowdin [ci skip]
* fix: New French translations from Crowdin [ci skip]
* fix: New Hebrew translations from Crowdin [ci skip]
* fix: New Hungarian translations from Crowdin [ci skip]
* fix: New Polish translations from Crowdin [ci skip]
* fix: New Korean translations from Crowdin [ci skip]
* fix: New German translations from Crowdin [ci skip]
* fix: New Romanian translations from Crowdin [ci skip]
* fix: New Spanish translations from Crowdin [ci skip]
* fix: New Czech translations from Crowdin [ci skip]
* fix: New Danish translations from Crowdin [ci skip]
* fix: New Italian translations from Crowdin [ci skip]
* fix: New Japanese translations from Crowdin [ci skip]
* fix: New Dutch translations from Crowdin [ci skip]
* fix: New Portuguese translations from Crowdin [ci skip]
* fix: New Swedish translations from Crowdin [ci skip]
* fix: New Turkish translations from Crowdin [ci skip]
* fix: New Ukrainian translations from Crowdin [ci skip]
* fix: New Chinese Simplified translations from Crowdin [ci skip]
* fix: New Chinese Traditional translations from Crowdin [ci skip]
* fix: New Vietnamese translations from Crowdin [ci skip]
* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]
* fix: New Indonesian translations from Crowdin [ci skip]
* fix: New Persian translations from Crowdin [ci skip]
* fix: New Thai translations from Crowdin [ci skip]
* fix: New English, United Kingdom translations from Crowdin [ci skip]
* fix: New Norwegian Bokmal translations from Crowdin [ci skip]
* fix: New French translations from Crowdin [ci skip]
* fix: New Romanian translations from Crowdin [ci skip]
* fix: New Spanish translations from Crowdin [ci skip]
* fix: New Czech translations from Crowdin [ci skip]
* fix: New Hebrew translations from Crowdin [ci skip]
* fix: New Hungarian translations from Crowdin [ci skip]
* fix: New Polish translations from Crowdin [ci skip]
* fix: New Korean translations from Crowdin [ci skip]
* fix: New German translations from Crowdin [ci skip]
* fix: New Danish translations from Crowdin [ci skip]
* fix: New Italian translations from Crowdin [ci skip]
* fix: New Japanese translations from Crowdin [ci skip]
* fix: New Dutch translations from Crowdin [ci skip]
* fix: New Portuguese translations from Crowdin [ci skip]
* fix: New Swedish translations from Crowdin [ci skip]
* fix: New Turkish translations from Crowdin [ci skip]
* fix: New Ukrainian translations from Crowdin [ci skip]
* fix: New Chinese Simplified translations from Crowdin [ci skip]
* fix: New Chinese Traditional translations from Crowdin [ci skip]
* fix: New Vietnamese translations from Crowdin [ci skip]
* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]
* fix: New Indonesian translations from Crowdin [ci skip]
* fix: New Persian translations from Crowdin [ci skip]
* fix: New Thai translations from Crowdin [ci skip]
* fix: New English, United Kingdom translations from Crowdin [ci skip]
* fix: New Norwegian Bokmal translations from Crowdin [ci skip]
* fix: New German translations from Crowdin [ci skip]
* fix: New French translations from Crowdin [ci skip]
* fix: New Hebrew translations from Crowdin [ci skip]
* fix: New Hungarian translations from Crowdin [ci skip]
* fix: New Polish translations from Crowdin [ci skip]
* fix: New Korean translations from Crowdin [ci skip]
* fix: New German translations from Crowdin [ci skip]
* fix: New Romanian translations from Crowdin [ci skip]
* fix: New Spanish translations from Crowdin [ci skip]
* fix: New Czech translations from Crowdin [ci skip]
* fix: New Danish translations from Crowdin [ci skip]
* fix: New Italian translations from Crowdin [ci skip]
* fix: New Japanese translations from Crowdin [ci skip]
* fix: New Dutch translations from Crowdin [ci skip]
* fix: New Portuguese translations from Crowdin [ci skip]
* fix: New Swedish translations from Crowdin [ci skip]
* fix: New Turkish translations from Crowdin [ci skip]
* fix: New Ukrainian translations from Crowdin [ci skip]
* fix: New Chinese Simplified translations from Crowdin [ci skip]
* fix: New Chinese Traditional translations from Crowdin [ci skip]
* fix: New Vietnamese translations from Crowdin [ci skip]
* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]
* fix: New Indonesian translations from Crowdin [ci skip]
* fix: New Persian translations from Crowdin [ci skip]
* fix: New Thai translations from Crowdin [ci skip]
* fix: New English, United Kingdom translations from Crowdin [ci skip]
* fix: New Norwegian Bokmal translations from Crowdin [ci skip]
* fix: New Norwegian Bokmal translations from Crowdin [ci skip]
* fix: New Dutch translations from Crowdin [ci skip]
* fix: New Chinese Simplified translations from Crowdin [ci skip]
* fix: New Chinese Simplified translations from Crowdin [ci skip]
* fix: New Chinese Simplified translations from Crowdin [ci skip]
* fix: New Chinese Simplified translations from Crowdin [ci skip]
* fix: New Chinese Simplified translations from Crowdin [ci skip]
* fix: New German translations from Crowdin [ci skip]
* fix: New Swedish translations from Crowdin [ci skip]
* fix: New French translations from Crowdin [ci skip]
* fix: New Hebrew translations from Crowdin [ci skip]
* fix: New Hungarian translations from Crowdin [ci skip]
* fix: New Polish translations from Crowdin [ci skip]
* fix: New Korean translations from Crowdin [ci skip]
* fix: New German translations from Crowdin [ci skip]
* fix: New Romanian translations from Crowdin [ci skip]
* fix: New Spanish translations from Crowdin [ci skip]
* fix: New Czech translations from Crowdin [ci skip]
* fix: New Danish translations from Crowdin [ci skip]
* fix: New Italian translations from Crowdin [ci skip]
* fix: New Japanese translations from Crowdin [ci skip]
* fix: New Dutch translations from Crowdin [ci skip]
* fix: New Portuguese translations from Crowdin [ci skip]
* fix: New Swedish translations from Crowdin [ci skip]
* fix: New Turkish translations from Crowdin [ci skip]
* fix: New Ukrainian translations from Crowdin [ci skip]
* fix: New Chinese Simplified translations from Crowdin [ci skip]
* fix: New Chinese Traditional translations from Crowdin [ci skip]
* fix: New Vietnamese translations from Crowdin [ci skip]
* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]
* fix: New Indonesian translations from Crowdin [ci skip]
* fix: New Persian translations from Crowdin [ci skip]
* fix: New Thai translations from Crowdin [ci skip]
* fix: New English, United Kingdom translations from Crowdin [ci skip]
* fix: New Norwegian Bokmal translations from Crowdin [ci skip]
* fix: New Turkish translations from Crowdin [ci skip]
* fix: New Ukrainian translations from Crowdin [ci skip]
This adds the sourceMetadata column to the collections table to match
the one on documents. The column is defined as JSONB and allows null values.
Changes:
- Added migration to create sourceMetadata column on collections table
- Added sourceMetadata field to Collection model with SourceMetadata type
- Imported SourceMetadata type in Collection model
Co-authored-by: codegen-sh[bot] <131295404+codegen-sh[bot]@users.noreply.github.com>
* feat: letter-list
* simplify list toggle
* use more common shortcuts for list toggle
* fix toggle list conflict
* wrap letter index to avoid overflow
* ensure the markdown letter representation matches the css representation on overflow
* improve list style validation
* fix list indexing
* fix: Toggling ordered lists from formatting menu
* fix: Ordered list in block menu
---------
Co-authored-by: Tom Moor <tom@getoutline.com>
* fix: when the lightbox active image is deleted in editor, it zooms out to (0, 0) upon closing lightbox
* Update Lightbox.tsx
---------
Co-authored-by: Tom Moor <tom@getoutline.com>
* fix: apply swipe actions on error component
* fix: enable copy and download action btns only when the image is loaded
* Revert "fix: enable copy and download action btns only when the image is loaded"
This reverts commit 9228d5e5df.
* Remove InVision from embed menu, company shut down
* Update Instagram logo
Improve dark mode styling
* Optimised images with calibre/image-actions
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat: POC
* fix: cleanup
* fix: cleanup
* fix: can use existing `UiStore` in favor of `LightboxStore`
* fix: style dialog overlay and content
* fix: style and position action buttons
* fix: keyboard nav
* fix: display caption
* fix: cleanup
* fix: force `Lightbox` to unmount if `DocumentScene` re-renders
* fix: cleanup
* fix: images going out of bounds–trying `object-fit` for first pass
* fix: making `Figure` a flexbox and setting its size to img dimensions,
gets rid of the `object-fit` "letterboxing" effect
* feat: image transition
* fix: match animation to that of `ImageZoom`
* fix: `fade-in` overlay
* fix: match overlay background to main background
* fix: fade out nav if idle for 3s
* fix: width & height transition in firefox
* fix: move nav buttons sideways
* fix: button sizes
* fix: don't let nav buttons become invisible due to image in backdrop
* feat: download btn
* feat: handle swipe left, right & down on mobile, also double tap to open lightbox
* fix: off-by-one
* fix: for img to be visible, if not animating
* fix: cleanup
* just a showcase commit, it's broken and will be reverted
* Revert "just a showcase commit, it's broken and will be reverted"
This reverts commit 63d7cbda9895f92a530cfb3a8402eaacb2414947.
* feat: `animateOnClose`
* fix: prevent body from shifting horizontally
* Revert "fix: prevent body from shifting horizontally"
This reverts commit fcc2d0d1daaab458325ece880d13903b42560dfd.
* fix: lint
* fix: make lightbox resilient to doc changes
* fix: `VisuallyHidden` `Dialog.Title`
* fix: fade in action and nav buttons too
* fix: `fadeOut` overlay, action & nav buttons upon close
* fix: `dom.querySelector` is not a function
* fix: let `objectFit` compute the img dimensions
* fix: flashing caption
* fix: hide nav keys based on whether it's a first or last img
* fix: tooltip for action buttons
* Fixes:
1. `Space` with the image selected should trigger the lightbox
2. There should be a "Zoom in" cursor on the image when selected so you know you can click to zoom
* fix: fade out on close if there's img loading err
* fix: pull animation duration into a const
* fix: upscaled editor image animating unreliably
* fix: lint
* fixes:
1. Model as state machine
2. Replace `transition` with `animation`
* fix: cleanup
* fix: DRY
* fix: cleanup
* fix: img loading indicator
* fix: swipe
* fix: types
* fix: Incorrect transitions when image nodes are duplicated
* Tweaks, translations, aria
* fix: Incorrect transition if image is added while lightbox is open
* fix: review
* Remove ImageZoom, react-medium-image-zoom
* Tweak styling
* fix: Quick fix for multiple open editors
* refactor: Move active lightbox state into editor
* Apply graphite suggestions
---------
Co-authored-by: Tom Moor <tom@getoutline.com>
* Fix file size display to use binary units instead of decimal
- Update bytesToHumanReadable function to use 1024-based units (KB, MB, GB)
- This matches user expectations from operating systems like Windows
- Fixes issue where 87.2MB file was displayed as 91.53MB
- Update unit tests to reflect binary unit calculations
- Resolves GitHub issue #10085
Co-authored-by: Tom Moor <tom@getoutline.com>
* Make file size display platform-aware
- Use decimal units (base 1000) on macOS to match Finder behavior
- Use binary units (base 1024) on Windows to match Explorer behavior
- Import isMac utility from shared/utils/browser
- Update comprehensive tests for both platforms
- Resolves platform-specific file size display discrepancies
Co-authored-by: Tom Moor <tom@getoutline.com>
---------
Co-authored-by: codegen-sh[bot] <131295404+codegen-sh[bot]@users.noreply.github.com>
Co-authored-by: Tom Moor <tom@getoutline.com>
* Add ALLOW_IP_ADDRESS_LIST environment variable
This adds support for allowing specific private IP addresses to be accessed
by the request-filtering-agent, which is useful for OIDC providers and
webhooks on private networks.
The environment variable accepts a comma-separated list of IP addresses
that should be allowed even if they are private IP addresses.
Example: ALLOW_IP_ADDRESS_LIST=10.0.0.1,192.168.1.100
Fixes issue with OIDC providers on private IP addresses being blocked.
* Rename environment variable to ALLOWED_PRIVATE_IP_ADDRESSES
Changed from ALLOW_IP_ADDRESS_LIST to ALLOWED_PRIVATE_IP_ADDRESSES
for better clarity and naming consistency.
---------
Co-authored-by: codegen-sh[bot] <131295404+codegen-sh[bot]@users.noreply.github.com>