Research spike: evaluate whether the Origin Private File System (OPFS) is worth utilizing beside (not instead of) our MinIO/S3 storage for offline + online use — to the maximum extent that is practical.
Verdict: OPFS is worth pursuing as a selective client pin / upload-outbox layer. It is not worth auto-mirroring every object that lands in MinIO.
Uploads remain API-mediated today (browser → multipart → API → staging/workers → MinIO). Presigned URLs are GET-only for serving. OPFS would never bypass ClamAV, ownership checks, or parental controls.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Research spike: evaluate whether the Origin Private File System (OPFS) is worth utilizing beside (not instead of) our MinIO/S3 storage for offline + online use — to the maximum extent that is practical.
Verdict: OPFS is worth pursuing as a selective client pin / upload-outbox layer. It is not worth auto-mirroring every object that lands in MinIO.
Uploads remain API-mediated today (browser → multipart → API → staging/workers → MinIO). Presigned URLs are GET-only for serving. OPFS would never bypass ClamAV, ownership checks, or parental controls.
Context (current architecture)
Server truth = MinIO
Relevant buckets / prefixes (user-facing + pipeline):
uploads(+blogs/,lesson-videos/,code/,media/)ebooksblogslesson-videosdllsassetsphotosvault-filesphotograph-previewsart-asset-artifacts/art-asset-quarantineprofile-imagessensitive-documentsquarantine,ai-models,gitea-packages,reference-dataShared seam:
SpikerSoft.Storage(IObjectStore, keyed stores,GetPresignedUrl, Range reads). Media proxy:S3MediaFallbackMiddlewarefor/blog-pictures,/geography-media,/lesson-videos.Client storage we already have (no OPFS yet)
spikersoft-books-offlinebook-offline-store.service.tsnavigator.storage.persist()art-studio-game-mesh-v1art-asset-mesh-blob-cache.tsspikersoft-offline-preload-v1offline-cache.service.tsngsw)ngsw-config.jsonGap: large binary performance (PDF / GLB / TIFF / video) and offline write staging before MinIO sync.
Size / limit reminders
What OPFS is (and isn't)
navigator.storage.persist(); Safari private = off / limited)Baseline across Chromium / Firefox / Safari since ~2023. Still subject to eviction and shared origin quota.
Recommended layering:
Key on stable object id / hash, not short-TTL presigned URL query strings (same lesson as art #784 / #804).
Use cases & fit (within reason)
sha256hashin IDBExplicit non-goals
Suggested pattern: Upload Outbox
Strongest product ROI is often offline write staging, not download mirroring.
Outbox candidates (first wave)
Outbox rules
Suggested pattern: Pin / Available Offline (downloads)
Product-shaped, opt-in (plus smart defaults):
{ objectKey or domainId, sha256/etag, sizeBytes, pinnedAt, userId }ebooks/{bookId}/file,art/{assetId}/{artifactId}, …)ApprovedBookIds— reconcile on next online syncHard constraints to design for
sha256hash)sensitive-documents; vault only opt-inSuggested architecture / spike
Introduce a small shared client seam, e.g.
LocalObjectStore:bucket/keyor domain-stable ids)Smallest honest prototype (ordered)
Success metrics for the spike:
navigator.storage.persist()Priority recommendation (if we green-light)
LocalObjectStore+ book PDF migration + photo outboxsensitive-documents, quarantine, ai-models, profile pics, blanket mirrorRelated existing work
spikersoft-angularbook-offline-*servicesart-asset-mesh-blob-cache.tsoffline-cache.service.tsdocs/minio-storage-migration.mdApprovedBookIds/SetChildBookApprovalAsk
Treat this as an enhancement / research ticket:
LocalObjectStore+ book PDF + photo outbox).