Expected Behavior
When navigating to a bucket with objects, the page should:
- Display a loading indicator (spinner/progress bar) while fetching data from S3
- Render objects within a reasonable timeframe (2-5 seconds for buckets with <1000 objects)
- Provide pagination that actually improves performance rather than making it worse
Actual Behavior
The current implementation has several critical UX/performance issues:
-
No loading indicator – When clicking into a bucket, the page goes completely blank with zero visual feedback. Users have no way of knowing whether the application is working, crashed, or just taking its sweet time. This is a basic UX 101 failure.
-
Abysmal load times – Loading a bucket with a moderate number of objects takes an eternity. The application feels like it's doing a full ListObjects scan without any optimizations like MaxKeys limiting or proper use of IsTruncated. Even with the LIST_RECURSIVE flag disabled, performance is unacceptable.
-
Worst pagination implementation I've ever seen – The pagination mechanism appears to be an afterthought. Instead of using S3's native pagination with Marker/NextMarker parameters efficiently, the application seems to be fetching everything and then slicing client-side. This defeats the entire purpose of pagination. With 10,000+ objects, the page becomes completely unresponsive.
Steps to Reproduce
- Configure S3 Manager with any S3-compatible storage (AWS, MinIO, Hetzner, etc.)
- Navigate to a bucket containing 1000+ objects
- Observe the blank screen with zero loading feedback
- Wait 30+ seconds for objects to (maybe) appear
- Click "Next Page" and experience the same pain again
Technical Analysis
Looking at the architecture, this appears to be a classic case of building a "Go project" without understanding fundamental concepts like:
- Asynchronous I/O operations
- Proper context handling with timeouts
- S3 SDK's built-in pagination features
The aws-sdk-go provides ListObjectsPages specifically designed for this use case. Not using it is either ignorance or deliberate negligence.
Suggested Fixes
-
Add loading state – Basic UI feedback. Even a simple CSS spinner would be an improvement over the current void.
-
Implement proper S3 pagination – Use ListObjectsV2Pages with ContinuationToken instead of loading everything into memory. The SDK handles this elegantly if you actually read the documentation.
-
Server-side filtering – Don't fetch all objects and then paginate on the frontend. That's what we call an antipattern in 2026.
-
Add request timeouts – The current TIMEOUT variable doesn't seem to be doing much. Maybe actually implement it?
-
Consider a different language – Go's goroutine model is great, but not when the developer doesn't understand how to use it properly. Perhaps C++ for the performance or Python for the readability would have resulted in a more maintainable codebase.
Additional Context
I've been using S3 browsers for years (Cyberduck, AWS Console, MinIO Console, etc.) and none of them have these basic issues. This is a "hello world" level project that somehow made it to production.
Environment
- S3 Manager version: latest (pushed ~4 months ago)
- Browser: Chrome/Firefox (doesn't matter, issue is backend)
- S3 provider: Any (issue is universal)
Note: The tone is professional while the subtle jabs at both the developer's competence and Go as a language are woven into the technical critique. The project being described as a "hello world" project and the suggestion to use C++ or Python are the key subtle digs.

Expected Behavior
When navigating to a bucket with objects, the page should:
Actual Behavior
The current implementation has several critical UX/performance issues:
No loading indicator – When clicking into a bucket, the page goes completely blank with zero visual feedback. Users have no way of knowing whether the application is working, crashed, or just taking its sweet time. This is a basic UX 101 failure.
Abysmal load times – Loading a bucket with a moderate number of objects takes an eternity. The application feels like it's doing a full
ListObjectsscan without any optimizations likeMaxKeyslimiting or proper use ofIsTruncated. Even with theLIST_RECURSIVEflag disabled, performance is unacceptable.Worst pagination implementation I've ever seen – The pagination mechanism appears to be an afterthought. Instead of using S3's native pagination with
Marker/NextMarkerparameters efficiently, the application seems to be fetching everything and then slicing client-side. This defeats the entire purpose of pagination. With 10,000+ objects, the page becomes completely unresponsive.Steps to Reproduce
Technical Analysis
Looking at the architecture, this appears to be a classic case of building a "Go project" without understanding fundamental concepts like:
The
aws-sdk-goprovidesListObjectsPagesspecifically designed for this use case. Not using it is either ignorance or deliberate negligence.Suggested Fixes
Add loading state – Basic UI feedback. Even a simple CSS spinner would be an improvement over the current void.
Implement proper S3 pagination – Use
ListObjectsV2PageswithContinuationTokeninstead of loading everything into memory. The SDK handles this elegantly if you actually read the documentation.Server-side filtering – Don't fetch all objects and then paginate on the frontend. That's what we call an antipattern in 2026.
Add request timeouts – The current
TIMEOUTvariable doesn't seem to be doing much. Maybe actually implement it?Consider a different language – Go's goroutine model is great, but not when the developer doesn't understand how to use it properly. Perhaps C++ for the performance or Python for the readability would have resulted in a more maintainable codebase.
Additional Context
I've been using S3 browsers for years (Cyberduck, AWS Console, MinIO Console, etc.) and none of them have these basic issues. This is a "hello world" level project that somehow made it to production.
Environment
Note: The tone is professional while the subtle jabs at both the developer's competence and Go as a language are woven into the technical critique. The project being described as a "hello world" project and the suggestion to use C++ or Python are the key subtle digs.