Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
322 commits
Select commit Hold shift + click to select a range
7902156
fix format on templates
F3l1x1vo Jun 23, 2026
78b6446
#98 fix limiting deleting keys, reset pagination on bucket switch
F3l1x1vo Jun 23, 2026
bf20c7c
#98 fix pagination inside the same bucket
F3l1x1vo Jun 23, 2026
87f9a1c
add svelte check to lint command
F3l1x1vo Jun 23, 2026
44791d0
#153 Allow Upload of Empty Files (#171)
F3l1x1vo Jun 23, 2026
d8d9d68
Merge remote-tracking branch 'origin/feat/s3-file-browser' into feat/…
Copilot Jun 24, 2026
9a96d47
update lock
F3l1x1vo Jun 24, 2026
b7aad81
#98 swap order of action and selection bar
F3l1x1vo Jun 25, 2026
17ed09c
#98 allow for resizing sidebar
F3l1x1vo Jun 25, 2026
e0c6aa0
#98 add copy path and full path actions
F3l1x1vo Jun 25, 2026
079638e
#98 close modals by clicking outside of them
F3l1x1vo Jun 25, 2026
0a4f465
#98 add disconnect confirmation box
F3l1x1vo Jun 25, 2026
433a41f
#98 move api paths to /<app>/api
F3l1x1vo Jun 25, 2026
42709ea
#98 add skip and replace all buttons for upload conflicts
F3l1x1vo Jun 25, 2026
cbe1c15
#98 fix trino unit tests, limit upload concurrency, fix sidebar z index
F3l1x1vo Jun 25, 2026
047ccb8
#98 fix e2e tests
F3l1x1vo Jun 25, 2026
1a66e94
Merge remote-tracking branch 'origin/feat/s3-file-browser' into feat/…
Copilot Jun 25, 2026
b33923b
rebuild server for e2e tests
F3l1x1vo Jun 29, 2026
c636494
Add code editor (#209)
F3l1x1vo Jun 29, 2026
58e4b9c
Add minor visual improvements (#205)
F3l1x1vo Jun 29, 2026
80e7aa6
Feat/s3 file browser preview parquet (#202)
F3l1x1vo Jun 29, 2026
2463e0d
S3 File Browser: Tab View (#178)
F3l1x1vo Jun 29, 2026
6397e0d
fix unconfirmed save button size
F3l1x1vo Jun 29, 2026
d06fba7
Feat/s3 file browser csv zip preview (#203)
F3l1x1vo Jul 1, 2026
d75bf31
#98 add possible checksum calculation to s3 client
F3l1x1vo Jul 1, 2026
f476802
fix unit test
F3l1x1vo Jul 1, 2026
5835bef
#98 fix e2e tests
F3l1x1vo Jul 2, 2026
afd6b7d
fix e2e test, add error message for copy file path
F3l1x1vo Jul 2, 2026
a7f9ffa
Feat/connection editing (#227)
dklOrdix Jul 7, 2026
21e7cbb
Merge branch 'main' into feat/s3-file-browser
dklOrdix Jul 7, 2026
4c1c13e
Merge branch 'feat/s3-file-browser' into feat/s3-file-browser-v1
dklOrdix Jul 7, 2026
1ad6b09
fix: e2e tests
dklOrdix Jul 7, 2026
b48ea63
Merge branch 'feat/s3-file-browser' into feat/s3-file-browser-v1
dklOrdix Jul 7, 2026
f1937bf
#98 add possible checksum calculation to s3 client
F3l1x1vo Jul 1, 2026
d4d177d
fix unit test
F3l1x1vo Jul 1, 2026
5e8635e
#98 fix text truncation, use env for csv max rows, clamp page size
F3l1x1vo Jul 10, 2026
9026983
#98 fix multi select behavior, add image preview limit fallback
F3l1x1vo Jul 10, 2026
f4de415
#98 limit max columns in CSV preview
F3l1x1vo Jul 10, 2026
7e49fa0
fix e2e test, fix replacement character in text editor due to truncation
F3l1x1vo Jul 10, 2026
80ef600
#98 allow overwrites again
F3l1x1vo Jul 13, 2026
f443c9b
#98 fix text preview of binary files
F3l1x1vo Jul 13, 2026
e830d33
#98 csv max columns use feature flag instead of magic number
F3l1x1vo Jul 13, 2026
c2ce945
move tooltips to own component, add orientation, add tooltips to stor…
F3l1x1vo Jul 13, 2026
38e4317
#208 show different connection error messages
F3l1x1vo Jul 13, 2026
5e6c5be
minor spelling change
F3l1x1vo Jul 13, 2026
7ba94c0
fix unit tests
F3l1x1vo Jul 13, 2026
eee9036
fix lint
F3l1x1vo Jul 13, 2026
a78e19d
Refactor/migrate to db (#221)
dklOrdix Jul 14, 2026
1f35d8b
#233 Add JSON Preview via Prettify Processing (#241)
F3l1x1vo Jul 14, 2026
40f3698
#222 add infinite scrolling to CSV, add feature flag for infinite scr…
F3l1x1vo Jul 14, 2026
52d3a60
Feat/s3 file browser copy move rename (#228)
F3l1x1vo Jul 15, 2026
98e5d41
Feat/s3 file browser details pane (#237)
F3l1x1vo Jul 15, 2026
a490fa2
fix: redirect to /storage from bucket page when no active connection …
dklOrdix Jul 15, 2026
34757b4
Filebrowser: Support users explicitly stating S3 bucket names (#186)
dklOrdix Jul 15, 2026
3449abb
Merge branch 'feat/s3-file-browser' into feat/s3-file-browser-v1
dklOrdix Jul 22, 2026
69684f4
Refactor v1 (#247)
dklOrdix Jul 22, 2026
9f19563
refactor: modularize dev setup script and improve logging (#246)
dklOrdix Jul 22, 2026
747be6c
Update Tests to current Feature Set (#256)
F3l1x1vo Jul 24, 2026
b195deb
#223 add copy name and path actions to tab and breadcrumb context men…
F3l1x1vo Jul 24, 2026
4cec1c9
Fix loading error states in storage UI (#259)
dklOrdix Jul 27, 2026
785f253
Keep tabs after page reload (#258)
F3l1x1vo Jul 27, 2026
86f9fcb
#220 #236 bind keys to font size inside code editor, add select all f…
F3l1x1vo Jul 29, 2026
df8629e
CSV column horizontal scrolling (#261)
F3l1x1vo Jul 29, 2026
fcf7bde
fix unicode quotes
F3l1x1vo Jul 31, 2026
208310e
Fitness Function (updated) (#267)
F3l1x1vo Aug 4, 2026
b2e3901
Merge branch 'origin/main' into feat/s3-file-browser-v1
F3l1x1vo Aug 6, 2026
3c76aad
#224 add tooltips to many locations
F3l1x1vo Aug 10, 2026
c4d043b
fix saving newly created files
F3l1x1vo Aug 10, 2026
286a7fb
open connection options on right click as well as button
F3l1x1vo Aug 10, 2026
4d3b8ce
convert toast to portal
F3l1x1vo Aug 10, 2026
cdafe55
Merge branch 'feat/s3-file-browser-v1' into feat/s3-file-browser-v1-t…
F3l1x1vo Aug 10, 2026
9645d4a
fix merge conflict
F3l1x1vo Aug 10, 2026
db0dcea
Add loading bar, use prefetch on main navigation (#285)
F3l1x1vo Aug 13, 2026
4ac24e7
#224 add tooltips to many locations (#286)
F3l1x1vo Aug 13, 2026
d58c4a6
Merge branch 'feat/s3-file-browser-v1' into feat/s3-file-browser-v2
F3l1x1vo Aug 13, 2026
ea867b6
#208 fix actions tooltip, show parquet line number only on data tab
F3l1x1vo Aug 31, 2026
416e78c
use tabs by default, fix tooltips, rename storage routes, operations …
F3l1x1vo Aug 31, 2026
f9bd54d
fix tab and bucket switching behavior
F3l1x1vo Aug 31, 2026
c3da477
Merge branch 'main' into feat/s3-file-browser-v1
F3l1x1vo Aug 31, 2026
6737272
remove close button
F3l1x1vo Aug 31, 2026
f29eedf
fix lint
F3l1x1vo Aug 31, 2026
b0ada4c
fix history.pushState
F3l1x1vo Aug 31, 2026
84df7be
add nvm version
F3l1x1vo Aug 31, 2026
fab1ea7
feat: Add basic search Modal (#288)
dklOrdix Sep 1, 2026
36ffd37
Feat/s3 file browser v2 visual improvements (#297)
dklOrdix Sep 1, 2026
65b2baa
Feat/s3 file browser v2 recent search tabs (#292)
dklOrdix Sep 1, 2026
7b717d9
fix merge regressions that were lost from commit 92773d6
F3l1x1vo Sep 1, 2026
e04a225
Multipart Download and Archived Download (#287)
F3l1x1vo Sep 1, 2026
49c7d1d
fix: Allow running as arbitrary UID for (OpenShift) (#296)
labrenbe Aug 27, 2026
1628632
use tabs by default, fix tooltips, rename storage routes, operations …
F3l1x1vo Aug 31, 2026
2fdfcc2
fix tab and bucket switching behavior
F3l1x1vo Aug 31, 2026
3604c4e
remove close button
F3l1x1vo Aug 31, 2026
dd5a02e
fix lint
F3l1x1vo Aug 31, 2026
3ed1e0e
fix history.pushState
F3l1x1vo Aug 31, 2026
d09e86e
add nvm version
F3l1x1vo Aug 31, 2026
5e76450
pull from v1
F3l1x1vo Sep 1, 2026
297fcc6
fix unit and e2e tests
F3l1x1vo Sep 2, 2026
aac2e50
Merge branch 'main' into feat/s3-file-browser-v1
F3l1x1vo Sep 2, 2026
4a24e5b
Merge remote-tracking branch 'origin/feat/s3-file-browser-v1' into fe…
F3l1x1vo Sep 2, 2026
e00cb8a
fix: hide parallel search button when not on search tab
dklOrdix Sep 2, 2026
8213130
fix: hide browser downloads from operations
dklOrdix Sep 2, 2026
148ed68
fix: improve download history entries
dklOrdix Sep 2, 2026
81f5802
fix: report partial storage search failures
dklOrdix Sep 2, 2026
9e02aec
#180 add pagination to search
F3l1x1vo Sep 3, 2026
03f57a7
#180 add search term history cycling
F3l1x1vo Sep 3, 2026
a210f38
fix lint and unit test
F3l1x1vo Sep 3, 2026
0e50eb5
#180 stream search results
F3l1x1vo Sep 3, 2026
b828fb6
remove mobile e2e test config
F3l1x1vo Sep 3, 2026
4f42efb
fix e2e tests
F3l1x1vo Sep 3, 2026
e53d280
Merge branch 'main' into feat/s3-file-browser-v1
F3l1x1vo Sep 4, 2026
22bbf4c
Merge branch 'main' into feat/s3-file-browser-v1
F3l1x1vo Sep 4, 2026
cc88897
Merge origin/main into feat/s3-file-browser-v1
F3l1x1vo Sep 4, 2026
cb1eec5
Merge branch 'main' into feat/s3-file-browser-v1
F3l1x1vo Sep 4, 2026
cc979f0
Merge branch 'main' into feat/s3-file-browser-v1
F3l1x1vo Sep 4, 2026
e582f1d
fix tab switching issue of not being able to navigate inside multiple…
F3l1x1vo Sep 10, 2026
18190cd
Merge remote-tracking branch 'origin/main' into feat/s3-file-browser-v1
F3l1x1vo Sep 10, 2026
bcad89b
#208 fix bucket shared data, solve i18n violations, remove comment
F3l1x1vo Sep 14, 2026
0ea15e0
Merge branch 'main' into feat/s3-file-browser-v1
F3l1x1vo Sep 14, 2026
6380967
fix e2e test
F3l1x1vo Sep 14, 2026
c1ccfb0
#278 implement changes suggested in code review
F3l1x1vo Sep 16, 2026
5a2a7e7
update comment
F3l1x1vo Sep 16, 2026
ccf16d6
fix unit test
F3l1x1vo Sep 16, 2026
8271e55
fix e2e test
F3l1x1vo Sep 16, 2026
cc43ef3
#278 implement changes suggested in code review
F3l1x1vo Sep 17, 2026
b94619d
#278 strengthen e2e tests to be less flaky
F3l1x1vo Sep 17, 2026
5121fcb
#208 remove TECH_DEBT mentions
F3l1x1vo Sep 18, 2026
5db9aaf
#208 implement changes suggested in code review
F3l1x1vo Sep 18, 2026
71d8828
#208 use eslint size limits
F3l1x1vo Sep 18, 2026
acda359
#208 use eslint check-file
F3l1x1vo Sep 18, 2026
ec02386
#208 merge db migrations
F3l1x1vo Sep 18, 2026
17bdaa9
#208 implement changes suggested in code review
F3l1x1vo Sep 18, 2026
063f694
Merge main into feat/s3-file-browser-v1
F3l1x1vo Sep 18, 2026
98b4f20
#208 fix broken tests and lint from merge
F3l1x1vo Sep 18, 2026
3cebf6d
#208 implement changes suggested in code review
F3l1x1vo Sep 21, 2026
895cd8f
#208 implement changes suggested in code review
F3l1x1vo Sep 21, 2026
9a8a09b
#208 implement changes suggested in code review
F3l1x1vo Sep 22, 2026
0a68c9f
#208 remove username fallback for email
F3l1x1vo Sep 22, 2026
d2ab0c1
#208 implement changes suggested in code review
F3l1x1vo Sep 22, 2026
9e2ec68
#208 implement changes suggested in code review
F3l1x1vo Sep 23, 2026
24b21e6
#208 fix lint
F3l1x1vo Sep 23, 2026
b5a3ed5
#208 implement changes suggested in code review
F3l1x1vo Sep 24, 2026
aca3f2f
#208 add db password for e2e tests
F3l1x1vo Sep 24, 2026
d25554a
#208 add conflict resolve to rename
F3l1x1vo Sep 24, 2026
1468557
#208 add STORAGE_ENCRYPTION_KEY to .env.example
F3l1x1vo Sep 28, 2026
288e97e
#208 remove rar and 7z archive support
F3l1x1vo Sep 30, 2026
68cac8e
#208 add rar support, add 7z fallback
F3l1x1vo Sep 30, 2026
872513b
#208 replace node-unrar-js with @mary/rar, use generic archive type i…
F3l1x1vo Oct 1, 2026
061d0dc
#208 fix build
F3l1x1vo Oct 1, 2026
a14b572
#208 fix e2e test
F3l1x1vo Oct 1, 2026
3c4df6f
#208 remove rar support
F3l1x1vo Oct 1, 2026
c42af24
Merge branch 'main' into feat/s3-file-browser-v1
F3l1x1vo Oct 1, 2026
693a4ec
#235 add file drop zone to file browser
F3l1x1vo Oct 2, 2026
28a7f47
Merge main into feat/s3-file-browser-v1
F3l1x1vo Oct 2, 2026
c3e545e
Merge origin/feat/s3-file-browser-v1 into feat/s3-file-browser-v1
F3l1x1vo Oct 2, 2026
24f27d2
#208 remove jsr registry
F3l1x1vo Oct 2, 2026
997b9d3
#208 fix e2e tests
F3l1x1vo Oct 5, 2026
7756742
#208 fix db migrations
F3l1x1vo Oct 5, 2026
5486d9f
#208 add shutdown sequence to playwright
F3l1x1vo Oct 6, 2026
f8df176
Merge branch 'main' into feat/s3-file-browser-v1
F3l1x1vo Oct 6, 2026
05d7c8d
Merge feat/s3-file-browser-v1 into feat/s3-file-browser-v2
F3l1x1vo Oct 7, 2026
f995494
#289 fix e2e test
F3l1x1vo Oct 8, 2026
92352cb
#289 fix warnings
F3l1x1vo Oct 8, 2026
ec27e50
#289 implement code review
F3l1x1vo Oct 9, 2026
41ddf86
#289 remove typebox override, add override comments
F3l1x1vo Oct 9, 2026
d06b0e0
#289 fix e2e test
F3l1x1vo Oct 9, 2026
55d59bd
fix(storage): keep trailing slash on folder destination keys
Bohreromir Oct 12, 2026
7fd009c
fix(storage): close regex search guard bypasses
Bohreromir Oct 12, 2026
5b03260
fix(storage): treat not-yet-started download jobs as pending
Bohreromir Oct 12, 2026
6195580
fix(storage): evaluate search date filters in the user's time zone
Bohreromir Oct 12, 2026
51afee1
fix(storage): keep connection name when blank, report duplicates
Bohreromir Oct 12, 2026
e272630
fix(storage): report the search result limit as its own error
Bohreromir Oct 12, 2026
b0976d2
fix(storage): count one ZIP64 extra block in the archive size
Bohreromir Oct 12, 2026
4db9993
fix(ui): let Escape close an open popover inside a modal first
Bohreromir Oct 12, 2026
c5c2352
fix(storage): key recent searches by a hash of their parameters
Bohreromir Oct 12, 2026
3f1c414
fix(storage): require the secret key when changing the access key
Bohreromir Oct 12, 2026
368749a
fix(storage): return 404 for manifest ids that are not UUIDs
Bohreromir Oct 12, 2026
a85b49e
fix(storage): allow retrying a failed download with the same job id
Bohreromir Oct 12, 2026
25dc39e
fix(storage): clear download history only for the active connection
Bohreromir Oct 12, 2026
197f2cd
fix(storage): treat a search stream without completion as failed
Bohreromir Oct 12, 2026
a0009f0
fix(storage): match the whole minute for "=" date filters with a time
Bohreromir Oct 12, 2026
ae9f8a0
fix(storage): validate max folder depth before searching
Bohreromir Oct 12, 2026
a8e1b18
fix(storage): share keep-alive agents across S3 clients
Bohreromir Oct 12, 2026
c86d07d
test(e2e): skip the folder rename test without Garage
Bohreromir Oct 13, 2026
7d3321a
fix(storage): sanitise archive entry names
Bohreromir Oct 13, 2026
9a362b2
S3 File Browser v2 (#289)
Bohreromir Oct 13, 2026
978da6e
Merge branch 'main' into feat/s3-file-browser-v1
Bohreromir Oct 13, 2026
c96c6b7
test(e2e): hide app server logs unless E2E_SERVER_LOGS is set
Bohreromir Oct 13, 2026
dc0cfe1
test(e2e): expect archive entries relative to the current folder
Bohreromir Oct 13, 2026
e584e5b
fix(storage): wait for the layout load before checking the active con…
Bohreromir Oct 13, 2026
566587a
test(e2e): drop the browse redirect retry in connectAndOpenPrefix
Bohreromir Oct 13, 2026
683eed9
fix(ui): ignore close events from a destroyed modal
Bohreromir Oct 13, 2026
b9fce76
Merge branch 'main' into feat/s3-file-browser-v1
Bohreromir Oct 13, 2026
ae70e47
fix: typos
Bohreromir Oct 13, 2026
c99ed7d
fix(storage): scope keyboard shortcuts to the object list
Bohreromir Oct 13, 2026
285bd5a
fix(storage): never let paste delete its own source
Bohreromir Oct 13, 2026
f009e7b
fix(storage): repoint the clipboard after a cut with conflicts
Bohreromir Oct 13, 2026
e953ae2
fix(storage): refuse pasting a folder into its own subtree
Bohreromir Oct 13, 2026
acc0769
fix(storage): bound preview offset and limit server-side
Bohreromir Oct 13, 2026
68e1a21
fix(storage): stop saving truncated text previews
Bohreromir Oct 13, 2026
b1a175d
fix(storage): number only the item's own name on collisions
Bohreromir Oct 13, 2026
97d1d8d
fix(storage): move only the dragged item when renaming on conflict
Bohreromir Oct 13, 2026
3eb3b43
fix(storage): expire jobs after inactivity, not after creation
Bohreromir Oct 13, 2026
01c772a
fix(storage): accept all legal S3 keys in operation schemas
Bohreromir Oct 13, 2026
841285e
fix(ui): let Escape close only the topmost layer
Bohreromir Oct 13, 2026
b425d94
fix(storage): keep pagination tokens per history entry
Bohreromir Oct 13, 2026
74e64c9
fix(storage): explain invalid names in create and rename
Bohreromir Oct 13, 2026
d675e5b
docs: correct the DATABASE_PORT default
Bohreromir Oct 13, 2026
ec1fa2a
fix(storage): accept bracketed IPv6 hosts and share the key check
Bohreromir Oct 13, 2026
3fde439
fix(storage): translate save action and restore bucket fallback on er…
Bohreromir Oct 13, 2026
22ac37e
fix(storage): enforce the paste, rename and move flags server-side
Bohreromir Oct 13, 2026
dd7c94b
fix(storage): accept any legal S3 key and request URL-encoded listings
Bohreromir Oct 13, 2026
29b7654
refactor(storage): tidy up key validation after the uniform key rule
Bohreromir Oct 14, 2026
d706f87
fix(storage): reject empty path segments in typed names
Bohreromir Oct 14, 2026
662417e
feat(storage): move copy, move and rename into one server-side transf…
Bohreromir Oct 14, 2026
b5291d5
fix(helm): wire the database and storage encryption key into the chart
Bohreromir Oct 15, 2026
43151d4
fix(storage): stop archive previews from filling /tmp
Bohreromir Oct 15, 2026
910e75d
fix(storage): bound directory size calculation
Bohreromir Oct 15, 2026
f38d9a8
fix(storage): refresh previews when the object changes
Bohreromir Oct 15, 2026
5474896
fix(config): wire v1 settings into the chart and share PUBLIC_ flags
Bohreromir Oct 15, 2026
8025fdf
fix(storage): make search filters, date picker and count badges acces…
Bohreromir Oct 15, 2026
a0633c5
fix(docker): drop unused zip package from the build stage
Bohreromir Oct 15, 2026
7a876c5
fix(storage): stop uploads from overwriting when the conflict check f…
Bohreromir Oct 15, 2026
19afab6
fix(storage): validate stored connection payload and throttle last-us…
Bohreromir Oct 15, 2026
b38c2cc
fix(storage): tidy up search status, depth, dates, excludes and body …
Bohreromir Oct 15, 2026
d78f0a6
fix(storage): show failed bucket info as unavailable and map empty PU…
Bohreromir Oct 15, 2026
1aae86c
fix(storage): ignore Enter in create name input while a create is in …
Bohreromir Oct 15, 2026
9116edf
fix(storage): pin multipart copy parts to the source ETag
Bohreromir Oct 15, 2026
1389eff
fix(storage): run transfer items concurrently and skip the redundant …
Bohreromir Oct 16, 2026
284a968
fix(storage): check new names in the transfer conflict dialog
Bohreromir Oct 16, 2026
2c7b744
test(e2e): log in once per worker and run fully parallel
Bohreromir Oct 16, 2026
cd4d820
refactor(storage): share one page iterator for recursive S3 listings
Bohreromir Oct 16, 2026
b0d673d
chore: ignore Claude Code worktrees in eslint and prettier
Bohreromir Oct 16, 2026
6ff601c
fix(storage): delete directory contents page by page and map listing …
Bohreromir Oct 16, 2026
29942d9
fix(storage): reload the listing after a failed delete
Bohreromir Oct 16, 2026
b5ac3d7
refactor(storage): remove listAllKeys from the storage provider
Bohreromir Oct 16, 2026
7445f70
feat(storage): support a custom CA certificate for S3 connections
Bohreromir Oct 16, 2026
6188a9e
Merge branch 'fix/s3-review-followups' into feat/s3-file-browser-v1
Bohreromir Oct 16, 2026
646b21a
fix(storage): use neutral invalid-name messages that mention control …
Bohreromir Oct 16, 2026
faef6c4
Merge branch 'fix/f16-name-messages' into feat/s3-file-browser-v1
Bohreromir Oct 16, 2026
317f0a2
fix(storage): call an empty folder a folder, not a bucket
Bohreromir Oct 16, 2026
89f976d
fix(storage): list buckets in alphabetical order
Bohreromir Oct 16, 2026
cb4a4c7
fix(storage): focus the name field of the Create popover
Bohreromir Oct 16, 2026
2b0a256
fix(storage): give the conflict and refusal dialogs a heading and a name
Bohreromir Oct 16, 2026
56eddf3
fix(storage): explain links to a storage that is not connected
Bohreromir Oct 16, 2026
c3dbe92
fix(storage): open folders from links with an encoded slash
Bohreromir Oct 16, 2026
bcd45a7
fix(storage): close tabs of a deleted folder
Bohreromir Oct 16, 2026
d52f9e9
fix(storage): confirm a delete with a toast
Bohreromir Oct 16, 2026
ab1f3c8
fix(storage): ask before leaving during an upload
Bohreromir Oct 16, 2026
1828733
Merge branch 'main' into feat/s3-file-browser-v1
Bohreromir Oct 16, 2026
034960a
refactor(test): rename arch tests
Bohreromir Oct 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
38 changes: 38 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,19 @@ STACKABLE_COCKPIT_OIDC_DISCOVERY_URL=https://your-idp.example.com/realms/your-re
STACKABLE_COCKPIT_OIDC_CLIENT_ID=stackable-cockpit
STACKABLE_COCKPIT_OIDC_CLIENT_SECRET=your-client-secret

# Storage encryption key (64 hex characters) used to encrypt sensitive data in storage.
STORAGE_ENCRYPTION_KEY=F000000000000000000000000000000000000000000000000000000000000000
# STACKABLE_COCKPIT_STORAGE_TLS_CA_CERT=/path/to/ca.pem # CA certificate for S3 connections with TLS verification; replaces the system trust store

# PostgreSQL database (required)
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_NAME=cockpit
DATABASE_USER=cockpit
DATABASE_PASSWORD=change-me
# DATABASE_TLS_MODE=verify-full # verify-full, require or disable (default: verify-full in production, disable otherwise)
# DATABASE_TLS_CA_CERT=/path/to/ca.pem # CA certificate for verify-full

# OIDC claim used as the Trino user for impersonation (default: preferred_username)
# STACKABLE_COCKPIT_TRINO_USER_CLAIM=preferred_username

Expand All @@ -30,14 +43,39 @@ STACKABLE_COCKPIT_OIDC_CLIENT_SECRET=your-client-secret
# the specified Trino endpoint is used automatically. By default the logged-in
# user is forwarded to Trino as X-Trino-User (impersonation via the OIDC username).
# STACKABLE_COCKPIT_TRINO_URL=https://trino.example.com:8443
# STACKABLE_COCKPIT_TRINO_PUBLIC_URL=https://trino.example.com # Browser-facing Trino URL for "View in Trino" links (default: the Trino URL used for queries)
# STACKABLE_COCKPIT_TRINO_AUTH_TYPE=basic # "none" (default) or "basic"
# STACKABLE_COCKPIT_TRINO_AUTH_USERNAME=service-account
# STACKABLE_COCKPIT_TRINO_AUTH_PASSWORD=secret
# STACKABLE_COCKPIT_TRINO_USER_IMPERSONATION=false # Disable impersonation: run all queries as the auth user (requires basic auth). Default: true
# STACKABLE_COCKPIT_TRINO_TLS_INSECURE=false # Set to "true" to skip TLS certificate verification
# STACKABLE_COCKPIT_TRINO_TLS_CA_CERT=/path/to/ca.pem # Custom CA certificate file
# STACKABLE_COCKPIT_QUERY_TTL=1800 # Seconds before completed, unaccessed tab queries are evicted (default: 1800)

# Feature flags
# STACKABLE_COCKPIT_COMPLETION_ENABLED=false # Disable SQL editor code completion (default: true)
# STACKABLE_COCKPIT_STORAGE_BROWSER_ENABLED=true # Enable S3/HDFS file browser (default: false)
# PUBLIC_STACKABLE_COCKPIT_STORAGE_RESTORE_TABS=true # File browser: continue where you left off — restore open tabs from the last session (default: false)
# PUBLIC_STACKABLE_COCKPIT_INFINITE_SCROLL_ENABLED=true # Load CSV and Parquet preview rows lazily while scrolling; any other value than "true" disables it (default: true)
# PUBLIC_STACKABLE_COCKPIT_STORAGE_CUT_COPY_ENABLED=true # Enables cut/copy and dragging in the storage browser; client-only, the server work is gated by paste/move (default: false)
# PUBLIC_STACKABLE_COCKPIT_STORAGE_PASTE_ENABLED=true # Enables paste in the storage browser; the transfer API accepts copies only with this, and moves with this or MOVE_ENABLED (default: false)
# PUBLIC_STACKABLE_COCKPIT_STORAGE_RENAME_ENABLED=true # Enables rename in the storage browser; also enforced by the transfer API (default: false)
# PUBLIC_STACKABLE_COCKPIT_STORAGE_MOVE_ENABLED=true # Enables drag-and-drop move in the storage browser (dragging also needs CUT_COPY_ENABLED); the transfer API accepts moves with this or PASTE_ENABLED (default: false)

# Storage browser limits and settings
# STACKABLE_COCKPIT_TEXT_PREVIEW_BYTES=262144 # Max bytes fetched for text, TSV and JSON previews; editable files are fetched completely (default: 262144)
# STACKABLE_COCKPIT_IMAGE_PREVIEW_BYTES=5242880 # Max bytes fetched for image previews (default: 5242880)
# STACKABLE_COCKPIT_PDF_PREVIEW_BYTES=26214400 # Max bytes fetched for PDF previews (default: 26214400)
# STACKABLE_COCKPIT_FILE_PREVIEW_ROWS=250 # Max rows in tabular file previews (default: 250)
# STACKABLE_COCKPIT_FILE_PREVIEW_COLUMNS=50 # Max columns in tabular file previews (default: 50)
# STACKABLE_COCKPIT_ARCHIVE_PREVIEW_MAX_MB=100 # Max size in megabytes of an archive opened for preview, checked against its compressed size, the total size of the listed entries and the size of an extracted entry (default: 100)
# STACKABLE_COCKPIT_ARCHIVE_CACHE_MAX_MB=512 # Max total size of archives cached in /tmp for previews, in megabytes; raised to at least twice ARCHIVE_PREVIEW_MAX_MB (default: 512)
# STACKABLE_COCKPIT_PARQUET_PREVIEW_DISALLOWED_COMPRESSION_TYPES=gzip-no_offset # Comma-separated list of compression types to disallow from parquet data preview (default: "gzip-no_offset")
# BODY_SIZE_LIMIT=6M # adapter-node request body limit; must be at least MAX_EDITABLE_FILE_SIZE (default: 6M in the container image, 512K otherwise)
# PUBLIC_STACKABLE_COCKPIT_MAX_EDITABLE_FILE_SIZE=1048576 # Max file size (in bytes) of editable text files in the storage browser; BODY_SIZE_LIMIT must be at least this large (default: 5 MiB)
# PUBLIC_STACKABLE_COCKPIT_PAGE_SIZES=25,50,100 # Comma-separated page size options for paginated list views (default: 25,50,100)
# PUBLIC_STACKABLE_COCKPIT_DEFAULT_PAGE_SIZE=25 # Page size selected when no user preference is stored; must be one of PAGE_SIZES (default: first page size)
# PUBLIC_STACKABLE_COCKPIT_MAX_RECENT_FILES=15 # Number of recently visited storage locations kept in local storage (default: 15)
# PUBLIC_STACKABLE_COCKPIT_UPLOAD_CONCURRENCY=3 # Maximum number of concurrent file uploads (default: 3)
# STACKABLE_COCKPIT_STORAGE_TRANSFER_CONCURRENCY=8 # Objects copied at once within one copy, move or rename request (default: 8)
# STACKABLE_COCKPIT_DOWNLOAD_HISTORY_RETENTION_DAYS=30 # Days a user's download history is kept; an integer from 1 to 3650, any other value stops startup (default: 30)
15 changes: 14 additions & 1 deletion .env.test
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,23 @@ STACKABLE_COCKPIT_IMAGE_PREVIEW_BYTES=5242880
STACKABLE_COCKPIT_PDF_PREVIEW_BYTES=26214400
STACKABLE_COCKPIT_FILE_PREVIEW_ROWS=250
STACKABLE_COCKPIT_FILE_PREVIEW_COLUMNS=50
PUBLIC_STACKABLE_COCKPIT_STORAGE_AUTO_CONNECT=true
STACKABLE_COCKPIT_PARQUET_PREVIEW_DISALLOWED_COMPRESSION_TYPES=gzip-no_offset
PUBLIC_STACKABLE_COCKPIT_STORAGE_RESTORE_TABS=true
PUBLIC_STACKABLE_COCKPIT_PAGE_SIZES=25,50,100
PUBLIC_STACKABLE_COCKPIT_DEFAULT_PAGE_SIZE=25
PUBLIC_STACKABLE_COCKPIT_MAX_RECENT_FILES=15
PUBLIC_STACKABLE_COCKPIT_UPLOAD_CONCURRENCY=3
PUBLIC_STACKABLE_COCKPIT_INFINITE_SCROLL_ENABLED=true
PUBLIC_STACKABLE_COCKPIT_STORAGE_CUT_COPY_ENABLED=true
PUBLIC_STACKABLE_COCKPIT_STORAGE_PASTE_ENABLED=true
PUBLIC_STACKABLE_COCKPIT_STORAGE_RENAME_ENABLED=true
PUBLIC_STACKABLE_COCKPIT_STORAGE_MOVE_ENABLED=true
# One object at a time, so the cancel E2E test can stop a move mid-way.
STACKABLE_COCKPIT_STORAGE_TRANSFER_CONCURRENCY=1
GARAGE_ADMIN_URL=http://localhost:30902
GARAGE_ADMIN_TOKEN=stackable-cockpit-e2e-admin-token
BETTER_AUTH_URL=http://localhost:4173
BETTER_AUTH_SECRET=stackable-cockpit-e2e-better-auth-secret
DATABASE_PASSWORD=e2e-build-placeholder-password
STORAGE_ENCRYPTION_KEY=a781775ee543107bfa97191691bb23c982dd9d9550542df27194ebc09d617dfd
PREVIEW_PORT=4173
49 changes: 13 additions & 36 deletions .github/workflows/pr_checks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ jobs:
run: python -m pip install pre-commit

- name: Run pre-commit
run: pre-commit run --all-files --show-diff-on-failure --color=always
run: pre-commit run --all-files --hook-stage manual --show-diff-on-failure --color=always

unit-tests:
name: Unit Tests
Expand Down Expand Up @@ -96,10 +96,9 @@ jobs:
with:
file-coverage-mode: changes

e2e-with-garage:
name: E2E Tests with Garage S3
e2e-tests:
name: E2E Tests with Garage S3 and PostgreSQL
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
Expand All @@ -118,35 +117,13 @@ jobs:
- name: Install Playwright browsers
run: npx playwright install --with-deps chromium firefox

- name: Start Garage S3 and initialize bucket
run: |
# GitHub Actions services now support entrypoint + command, but we still
# start Garage manually here because service containers are created before
# actions/checkout runs. The upstream Garage image contains only the
# /garage binary (no /bin/sh), so the service cannot wait for the checked-
# out e2e/garage.toml to appear before it starts.
docker run -d --name garage \
-p 3900:3900 \
-p 3902:3902 \
-e GARAGE_CONFIG_FILE=/workspace/dev/garage/garage.toml \
-v "$PWD:/workspace" \
--entrypoint /garage \
oci.stackable.tech/stackable/dxflrs/garage:v2.3.0 \
server --single-node

# Wait for the S3 API to become available
for _ in $(seq 1 30); do
if curl -s http://localhost:3900 >/dev/null 2>&1; then
break
fi
sleep 1
done

S3_SECRET_ACCESS_KEY="e2e-test-secret-key-for-ci" \
GARAGE_ADMIN_TOKEN='stackable-cockpit-e2e-admin-token' \
S3_ENDPOINT='http://localhost:3900' \
S3_CONFIG_PATH="$PWD/s3-config.json" \
./e2e/init-garage-s3.sh

- name: Run E2E tests with Garage
run: npm run test:e2e:garage
- name: Run E2E tests with Garage and PostgreSQL
run: npm run test:e2e

- name: Upload Playwright traces
if: always()
uses: actions/upload-artifact@v7
with:
name: playwright-traces
path: e2e/test-results/
retention-days: 7
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ src/lib/editor/generated/
.wrangler
.svelte-kit
/build
/reports/

# OS
.DS_Store
Expand All @@ -32,6 +33,7 @@ dist/
# Claude Code - ignore local/personal files, commit shared config
.claude/settings.local.json
.claude/CLAUDE.local.md
.claude/worktrees/

# Vitest coverage reports
coverage/
Expand All @@ -40,6 +42,7 @@ coverage/*
# Playwright
e2e/test-results
e2e/.auth
.playwright/
# Paraglide
src/lib/paraglide
project.inlang/cache/
Expand Down
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
24.21.0
32 changes: 26 additions & 6 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -53,27 +53,45 @@ repos:

- repo: local
hooks:
# ── Fix variant (runs locally on commit — auto-fixes where possible) ──
- id: npm-lint-fix
name: npm lint with --fix (prettier + eslint)
language: system
entry: npm run lint:fix
stages: [pre-commit, pre-merge-commit]
pass_filenames: false
files: \.(svelte|ts|js|css|html|json|md)$

# ── Check-only variant (runs in CI — no auto-fix) ──
- id: npm-lint
name: npm lint (prettier + eslint)
name: npm lint check only (prettier + eslint)
language: system
entry: npm run lint
stages: [pre-commit, pre-merge-commit]
stages: [manual]
pass_filenames: false
files: \.(svelte|ts|js|css|html|json|md)$

# ── Shared hooks (same behaviour locally and in CI) ──
- id: npm-check
name: npm check (svelte-check)
language: system
entry: npm run check
stages: [pre-commit, pre-merge-commit]
stages: [pre-commit, pre-merge-commit, manual]
pass_filenames: false
files: \.(svelte|ts|js)$

- id: npm-arch-test
name: npm arch test (fitness functions)
language: system
entry: npm run test:arch
stages: [pre-commit, pre-merge-commit, manual]
pass_filenames: false

- id: helm-lint
name: helm lint
language: system
entry: helm lint deploy/helm/cockpit
stages: [pre-commit, pre-merge-commit]
stages: [pre-commit, pre-merge-commit, manual]
pass_filenames: false
files: ^deploy/helm/

Expand All @@ -85,7 +103,9 @@ repos:
helm template test deploy/helm/cockpit
--set auth.oidc.discoveryUrl=https://stub
--set auth.oidc.clientId=stub
--set auth.oidc.clientSecret.secretKeyRef.name=stub > /dev/null'
stages: [pre-commit, pre-merge-commit]
--set auth.oidc.clientSecret.secretKeyRef.name=stub
--set database.host=stub
--set database.password.secretKeyRef.name=stub > /dev/null'
stages: [pre-commit, pre-merge-commit, manual]
pass_filenames: false
files: ^deploy/helm/
6 changes: 6 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ build/
.output/
e2e/test-results/
e2e/.auth/
.playwright/
reports/
src/lib/paraglide/
project.inlang/

Expand All @@ -33,3 +35,7 @@ coverage/
# Helm templates
deploy/helm/
dev/garage/
dev/postgresql/

# Claude Code worktrees (full repo copies)
.claude/worktrees/
36 changes: 33 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,10 +188,10 @@ The application uses **Paraglide-JS v2** for type-safe, compiler-based internati

### Node.js Version

The required Node.js version is pinned in `.node-version`. Use `nvm` to install and activate it before running any `npm` commands — `npm` will hard-fail with engine errors otherwise (`.npmrc` sets `engine-strict=true`).
The required Node.js version is pinned in `.node-version` for CI and `.nvmrc` for NVM. Keep both files synchronised. Use `nvm` to install and activate it before running any `npm` commands — `npm` will hard-fail with engine errors otherwise (`.npmrc` sets `engine-strict=true`).

```bash
nvm install # installs the version from .node-version
nvm install # installs the version from .nvmrc
nvm use # activates it in the current shell
```

Expand Down Expand Up @@ -224,6 +224,36 @@ pre-commit run --all-files # Run all checks: lint (prettier + eslint), type ch
# markdownlint, yamllint, shellcheck, actionlint, hadolint, helm lint
```

### Architecture Fitness Functions

```bash
npm run test:arch # Run all architecture fitness function tests (~5 s)
npm run test:arch:report # Same, plus generate HTML dependency/metrics reports in /reports/
Comment thread
F3l1x1vo marked this conversation as resolved.
```

Architecture tests live in `src/architecture-tests/*.spec.ts` and use [ArchUnitTS](https://github.com/LukasNiessen/ArchUnitTS) together with plain Node.js `fs` checks. They run in CI and must remain **green at all times**.

**Run `npm run test:arch` whenever you:**

- Add a new file to `src/lib/server/` (verify it doesn't break client-boundary rules)
- Add a new Svelte component (PascalCase naming and UI-pattern checks)
- Add or remove message keys in `messages/en.json` (both locale files must stay in sync)
- Refactor the Trino sub-layer (circular-dependency rules)

**What the fitness functions enforce:**

| Category | What is checked |
| ------------------------ | ------------------------------------------------------------------------------------------------------------- |
| Server / Client Boundary | `src/lib/client`, `stores`, `storage`, `editor`, `types` must not import `src/lib/server/**` |
| No Circular Dependencies | `src/lib/**` (excluding Trino) and `src/routes/**` must be cycle-free |
| Naming Conventions | Stores → `*.svelte.ts`; lib components → PascalCase `.svelte`; server files → no `.svelte.ts` extension |
| Code Size Limits | `.ts` files < 2 400 LOC; `.svelte` files < 1 100 LOC; test files < 1 000 LOC |
| UI Pattern Enforcement | No native date inputs; `<img>` must have `alt`; no clickable `<div>` or `<span>` (with documented exceptions) |
| i18n Compliance | `messages/en.json` and `messages/de.json` must have the same keys; no static `aria-label="English text"` |

**Extending the fitness functions:**
When you add a new architectural rule (e.g., a new layer, a new naming convention), add a new `.spec.ts` file in `src/architecture-tests/` following the existing patterns. Use archunit for TypeScript dependency/cycle rules and plain Node.js `fs` for content checks on Svelte files.

### E2E Testing

```bash
Expand Down Expand Up @@ -261,7 +291,7 @@ test('example test', async ({ page }) => {

### Authentication

Tests use a saved session from `e2e/.auth/user.json`. If tests fail with auth errors, run the auth setup to re-authenticate via OIDC.
Import `test` and `expect` from `e2e/support/fixtures.ts`, not `@playwright/test`. Its worker-scoped fixture logs each worker in via the mock OIDC server as its own user, so parallel workers never share server-side state. Opt out with `test.use({ storageState: { cookies: [], origins: [] } })`.

## Important Notes

Expand Down
Loading
Loading