Tom Moor
26f5bb9784
fix: Unable to search drafts without a collection ( #12079 )
...
* fix: Unable to search drafts without a collection
* PR feedback
2026-04-16 17:37:25 -04:00
Tom Moor
d4dec42bc5
fix: Validate host parameter stored in OAuth state on failure redirect ( #11956 )
...
* fix: Validate host parameter stored in OAuth state on auth failure path
* fix: Validate OAuth state host to prevent open redirect
Sanitize the host parameter from OAuth state before using it in error
redirects. Adds userinfo stripping to parseDomain's normalizeUrl to
prevent bypasses like "subdomain.base@evil.com ", validates custom
domains against registered teams, and introduces Team.findByDomain
with input normalization for consistent domain lookups.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-04-04 16:13:54 -04:00
Tom Moor
b2aad71cb4
chore: Move welcome email to processor ( #11939 )
...
* chore: Move welcome email to processor
* fix: Restore welcome email on invite acceptance
2026-04-02 20:16:47 -04:00
Tom Moor
b91d9e9a72
feat: Extract search into pluggable provider system ( #11448 )
...
* feat: Extract search into pluggable provider system
Refactors the monolithic SearchHelper into a pluggable search provider
architecture, enabling alternative search backends (Elasticsearch,
Turbopuffer, etc.) while preserving PostgreSQL full-text search as the
default. The SEARCH_PROVIDER env var selects the active provider.
- Add BaseSearchProvider abstract class and SearchProviderManager
- Add Hook.SearchProvider to the plugin system
- Move PostgreSQL search logic into plugins/postgres-search/
- Add SearchIndexProcessor for event-driven index sync
- Update all callers to use the provider manager directly
- Keep SearchHelper as a deprecated thin wrapper for backwards compat
Closes #11347
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
* refactor: Remove deprecated SearchHelper wrapper
All callers now use SearchProviderManager directly, so the thin
delegation wrapper is no longer needed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
* refactor: Rename postgres-search plugin to search-postgres
Renames the plugin folder and id so that future search provider plugins
(e.g. search-elasticsearch, search-turbopuffer) will be colocated
alphabetically.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
* refactor: Remove special-case plugin import from SearchProviderManager
Make PluginManager.loadPlugins resilient to individual plugin load
failures so SearchProviderManager can use the standard getHooks path
without needing to directly import the search-postgres plugin.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
* test: Add missing search provider tests for full coverage parity
Adds all tests that existed in the old SearchHelper.test.ts but were missing
from PostgresSearchProvider.test.ts, including searchTitlesForUser status
filters, collection filtering, group memberships, and sorting tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
* feedback
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-25 23:01:26 -04:00
Tom Moor
c2ccdb6fd4
fix: Prevent registration of duplicate passkeys on the same device ( #11870 )
...
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-24 22:54:43 -04:00
Tom Moor
0390f30e1d
Restore enterprise translations
2026-03-22 21:56:11 -04:00
Tom Moor
0ba310e027
Remove unused files and dependencies ( #11850 )
...
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-22 18:44:51 -04:00
Tom Moor
5693618de4
Add translation hooks to transactional emails ( #11785 )
...
* First pass
* fix: Missing translations
* fix: Missing translations
* welcome
* Apply suggestions from code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com >
* translations
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com >
2026-03-20 23:28:51 -04:00
Copilot
500c3f91b0
Support GitLab work_items URL structure in unfurl integration ( #11795 )
...
* Initial plan
* Support GitLab work_items URL structure in parseUrl
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
2026-03-17 22:40:47 -04:00
Tom Moor
1a893b0e45
Group sync framework ( #11684 )
...
Adds group sync from external authentication providers, allowing team group memberships to be automatically managed based on provider data on sign-in in the future.
2026-03-14 23:02:20 -04:00
Liam Stanley
b1a192c078
fix: don't force prompt for Discord OAuth2 ( #11757 )
...
Signed-off-by: Liam Stanley <liam@liam.sh >
2026-03-14 19:20:13 -04:00
Copilot
22138957ab
Add Project unfurl support to GitLab plugin ( #11752 )
...
* Initial plan
* Add GitLab Project unfurl support
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* Fix TypeScript errors: add explicit return type to parseUrl
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* tweaks
* progress
* Remove log noise
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
Co-authored-by: Tom Moor <tom@getoutline.com >
2026-03-14 19:14:35 -04:00
Copilot
d1203408b5
Add GitHub Project V2 unfurl support ( #11753 )
...
* Initial plan
* Add GitHub Project V2 unfurl support to the GitHub plugin
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* Various fixes
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
Co-authored-by: Tom Moor <tom@getoutline.com >
2026-03-14 17:13:35 -04:00
Copilot
36d555f3fb
Add Linear project unfurling support ( #11525 )
...
* Initial plan
* Add Project type and unfurl implementation for Linear projects
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* Fix linter issues - remove unused import and rename unused parameter
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* Make actor parameter optional in unfurl helper methods
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* fix: Resolve type errors in Linear project unfurl
Use project.status (ProjectStatus object) instead of the deprecated
project.state (string) field, add satisfies constraint, and fix
exhaustive return in unfurl switch.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
* Determine mention type
* styling
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
Co-authored-by: Tom Moor <tom@getoutline.com >
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-14 11:03:04 -04:00
Copilot
83977f85bd
Use filtered fetch in Figma and Linear plugins ( #11701 )
...
* Initial plan
* chore: use filtered fetch in Figma and Linear plugins
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
2026-03-09 23:04:18 -04:00
Tom Moor
257d01af89
fix: Missing check for enabled passkeys in verification endpoint ( #11689 )
2026-03-08 18:46:13 -04:00
Tom Moor
c875930430
fix: Improved resiliency to invalid GitLab data ( #11669 )
2026-03-05 19:48:17 -05:00
Tom Moor
0565616b02
fix: Add skip error for multi-source Notion databases
2026-03-03 19:32:33 -05:00
Copilot
b298456126
Increase request timeout for files.create to support large file uploads ( #11570 )
...
* Initial plan
* Add 30-minute timeout for files.create endpoint to handle large file uploads
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
2026-02-28 09:02:28 -05:00
Tom Moor
0dfab5b245
perf: Raise Notion pageSize 25 -> 100
2026-02-28 08:52:23 -05:00
Tom Moor
9288ac87e0
fix: Webhook held in memory after timeout ( #11580 )
2026-02-26 08:52:40 -05:00
Tom Moor
3c3d18637e
fix: Ignored child page mentions in Notion importer ( #11567 )
2026-02-25 16:28:48 -05:00
Tom Moor
496b89c7f8
chore: Remove gitbeaker dep on client ( #11517 )
...
Add dupe detection to gitlab install
2026-02-22 00:38:10 -05:00
Tom Moor
46dd13fc7f
Update integrations directory to color icons ( #11516 )
2026-02-22 02:37:04 +00:00
Salihu
cad670f19c
feat: GitLab integration ( #10861 )
...
Co-authored-by: Tom Moor <tom@getoutline.com >
closes #6795
2026-02-21 17:52:27 -05:00
Tom Moor
7be893f9a3
Refactor templates ( #11027 )
...
closes #8674
2026-02-20 18:53:00 -05:00
Tom Moor
7ff6f1defb
feat: Add webhooks for file attachments ( #11494 )
2026-02-19 17:28:50 -05:00
Copilot
2e0bc66ad1
Fix React Doctor error-level issues ( #11483 )
...
* Initial plan
* Fix React Doctor errors: aria-selected, key props, alt attributes, layout animation, nested component, reduced motion
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* Fix remaining React Doctor errors: refactor useTrackLastVisitedPath to avoid useEffect
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* Revert useMeasure change
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
Co-authored-by: Tom Moor <tom@getoutline.com >
2026-02-18 19:47:56 -05:00
Tom Moor
c758f0d93a
chore: Upgrade Zod to version 4 ( #11465 )
2026-02-15 22:54:50 -05:00
Tom Moor
0722b42613
fix: Potential task queue saturation in Notion importer ( #11428 )
...
* fix: Potential task queue saturation in Notion import
* Reduces concurrent Notion API pressure from 3× the recursive call depth down to 1
2026-02-12 21:56:00 -05:00
Copilot
c8fbdc35fb
Ignore table_of_contents blocks in Notion import ( #11424 )
...
* Initial plan
* feat: Add handler to ignore table_of_contents Notion block
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
2026-02-12 18:51:43 -05:00
Tom Moor
dc9aad99e9
fix: Test snapshot ( #11395 )
2026-02-08 18:28:35 -05:00
Tom Moor
eb59aed5b7
test: Fix snap ( #11391 )
2026-02-07 22:07:41 +00:00
Copilot
a097676e9c
Map Notion toggle blocks to container_toggle nodes ( #11371 )
...
* Initial plan
* Add toggle block support to Notion importer
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* Support toggle headings
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
Co-authored-by: Tom Moor <tom@getoutline.com >
2026-02-07 16:40:06 -05:00
Copilot
d9e15d2441
Fix passkey registration with non-standard HTTPS ports ( #11329 )
...
* Initial plan
* Add getExpectedOrigin helper to handle non-standard ports in passkeys
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* Fix linting error in passkeys test
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* Fix trailing whitespace in passkeys.ts
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* Export getExpectedOrigin and test it directly
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
2026-02-04 18:43:34 -05:00
Tom Moor
03493ea3dc
fix: Non-members cannot see public ACL attachments ( #11326 )
...
closes #11324
2026-01-31 15:53:03 -05:00
Copilot
9858d160d5
Separate user input errors from internal errors for Sentry reporting ( #11308 )
...
* Initial plan
* Add explicit error categorization with isSentryReported property
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* Rename isSentryReported to isReportable
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
* Update Discord plugin errors to use isReportable
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com >
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com >
2026-01-30 05:55:28 -05:00
Tom Moor
bdb97d63d8
fix: Improve error when passkey is missing in db ( #11291 )
2026-01-27 22:50:50 +00:00
Raphael
8324859de9
fix(passkeys): show Passkeys settings to non-admin users ( #11286 )
2026-01-27 08:14:36 -05:00
Tom Moor
00fb4d1af7
chore: Update node style imports ( #11277 )
...
- crypto → node:crypto
- fs → node:fs
- fs/promises → node:fs/promises
- path → node:path
- http → node:http
- https → node:https
- stream → node:stream
- buffer → node:buffer
- url → node:url
- os → node:os
- net → node:net
- dns → node:dns
- events → node:events
- readline → node:readline
- querystring → node:querystring
- util → node:util
2026-01-26 20:51:50 -05:00
Tom Moor
ef0f8301bc
Allow non-platform Passkeys ( #11265 )
2026-01-25 03:31:05 +00:00
Hemachandar
5584089441
feat: Figma integration ( #11044 )
...
* OAuth
* store logo
* unfurl support
* refresh token
* support for list
* embed list
* mention menu for all embeds in a list
* multi-level list
* logo
* account level connection
* tsc
* Update Icon.tsx
* coderabbit feedback
* RFC 6749 suggestion
---------
Co-authored-by: Tom Moor <tom@getoutline.com >
2026-01-15 20:27:00 -05:00
Tom Moor
bcee4893f4
perf: Add timeout and optimize URL unfurl performance ( #11149 )
...
* perf: Add timeout and optimize URL unfurl performance
Fixes issue where urls.unfurl endpoint could take 15+ seconds due to external API timeouts and sequential plugin execution.
Changes:
- Add timeout support to fetch utility with AbortController (defaults to no timeout, configurable per request)
- Add 10 second timeout to Iframely plugin requests
- Add early URL pattern validation to GitHub and Linear plugins to avoid unnecessary database queries
- Add try-catch error handling to URL parsing in GitHub and Linear plugins
This reduces worst-case unfurl time from 15+ seconds to ~10 seconds maximum, and eliminates unnecessary overhead for URLs that don't match plugin patterns.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
* lint
---------
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-01-10 18:03:19 -05:00
Tom Moor
b123762e86
chore: Remove collection.url, fix post-signin redirect ( #11139 )
2026-01-10 16:19:23 +00:00
Tom Moor
974c5f9f70
fix: Embedded PDF rendering in Safari ( #11107 )
2026-01-07 21:59:12 -05:00
Tom Moor
57b6e9aca4
feat: Passkey support ( #11065 )
...
closes #6930
2026-01-05 19:58:46 -05:00
Tom Moor
b1cb6e4a41
fix: Improve handling of object_not_found individual blocks ( #11042 )
2026-01-02 20:55:03 -05:00
Tom Moor
a3b2615edf
chore: Remove future public bucket usage ( #10977 )
...
* No longer upload avatars to public bucket
* Public redirect
* tests
* test
* test
2025-12-24 20:24:58 -05:00
Tom Moor
fbd4ded5b4
feat: Add authentication provider management ( #10997 )
...
* Gemini first-pass
* Prevent post-connect login
* stash
* stash
* Add OIDC logo
* Separate security page
* test
* Update icon
* test
* ui
* Add extra guards for disabling auth provider
* refactor
* test
2025-12-24 09:09:24 -05:00
Tom Moor
bf45e97641
chore: Enforce type import consistency ( #10968 )
...
* Update types
* fix circular dep
* type imports
* lint type imports and --fix
2025-12-19 23:07:02 -05:00