cabal-version: 3.0 name: nuthatch version: 0.1.0.0 synopsis: User-facing S3 BFF description: A user-facing web application and API for small S3-compatible object stores. Nuthatch gives OIDC-authenticated users identity-scoped personal roots and a shared root while keeping object-store credentials behind the service. license: BSD-3-Clause license-file: LICENSE copyright: 2026 ms2k author: ms2k maintainer: ms2k@quorate.dev homepage: https://code.quorate.dev/ms2k/nuthatch bug-reports: mailto:ms2k@quorate.dev tested-with: GHC == 9.10.3 category: Network build-type: Simple extra-doc-files: README.md extra-source-files: .dockerignore Dockerfile Makefile THIRD_PARTY_NOTICES.txt cabal.project cabal.project.freeze deploy/kubernetes/*.yaml.in docs/protocol/*.cfg docs/protocol/*.tla docs/spec/*.md sql/001_initial_schema.sql scripts/*.mjs tests/*.sh tests/kind/*.env tests/kind/*.sh tests/kind/*.yaml tests/kind/*.yaml.in tests/kind/fixture/*.sh tests/kind/provider/nerdctl tests/model-correspondence/*.cfg tests/model-correspondence/*.env tests/model-correspondence/*.json tests/model-correspondence/*.mjs tests/model-correspondence/*.sh web/.node-version web/index.html web/package-lock.json web/package.json web/playwright.config.ts web/src/*.css web/src/*.svelte web/src/*.ts web/src/components/*.svelte web/src/generated/*.ts web/src/workflows/*.ts web/svelte.config.js web/test/*.mjs web/test/browser/*.ts web/test/components/*.ts web/test/fixtures/*.json web/tsconfig.json web/vite.config.ts source-repository head type: git location: https://code.quorate.dev/ms2k/nuthatch common shared default-language: Haskell2010 default-extensions: OverloadedStrings RecordWildCards DeriveGeneric DerivingStrategies GeneralizedNewtypeDeriving LambdaCase ScopedTypeVariables TupleSections NamedFieldPuns FlexibleContexts FlexibleInstances DataKinds TypeOperators TypeFamilies MultiParamTypeClasses UndecidableInstances ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wpartial-fields -Wredundant-constraints build-depends: , aeson >= 2.1 && < 2.3 , async >= 2.2 && < 2.3 , aws >= 0.25.2 && < 0.26 , base >= 4.18 && < 5 , base16-bytestring >= 1.0 && < 1.1 , base64-bytestring >= 1.2 && < 1.3 , bytestring >= 0.11 && < 0.13 , case-insensitive >= 1.2 && < 1.3 , containers >= 0.6 && < 0.8 , conduit >= 1.3 && < 1.4 , cookie >= 0.5.1 && < 0.6 , crypton-connection >= 0.4 && < 0.5 , crypton >= 0.34 && < 1.1 , directory >= 1.3 && < 1.4 , entropy >= 0.4 && < 0.5 , envparse >= 0.6 && < 0.7 , filepath >= 1.4 && < 1.6 , hedis >= 0.15 && < 0.16 , http-client >= 0.7 && < 0.8 , http-client-tls >= 0.3 && < 0.4 , http-conduit >= 2.3 && < 2.4 , http-api-data >= 0.7 && < 0.8 , http-media >= 0.8 && < 0.9 , http-types >= 0.12 && < 0.13 , jose >= 0.12 && < 0.13 , lens >= 5.2 && < 5.4 , memory >= 0.18 && < 0.19 , mime-types >= 0.1 && < 0.2 , modern-uri >= 0.3.6 && < 0.4 , mtl >= 2.3 && < 2.4 , network-uri >= 2.6 && < 2.8 , postgresql-simple >= 0.7 && < 0.8 , postgresql-migration >= 0.2.1.8 && < 0.3 , resource-pool >= 0.4 && < 0.5 , resourcet >= 1.3 && < 1.4 , retry >= 0.9 && < 0.10 , scientific >= 0.3 && < 0.4 , servant >= 0.20 && < 0.21 , servant-server >= 0.20 && < 0.21 , stm >= 2.5 && < 2.6 , temporary >= 1.3 && < 1.4 , text >= 2.0 && < 2.2 , time >= 1.12 && < 1.15 , tls >= 2.2 && < 2.3 , transformers >= 0.6 && < 0.7 , unicode-transforms >= 0.4 && < 0.5 , unordered-containers >= 0.2 && < 0.3 , uuid >= 1.3 && < 1.4 , wai >= 3.2 && < 3.3 , wai-extra >= 3.1 && < 3.2 , warp >= 3.3 && < 3.5 , warp-tls >= 3.4 && < 3.5 , xml-conduit >= 1.9 && < 1.11 library nuthatch-internal import: shared hs-source-dirs: src exposed-modules: Nuthatch Nuthatch.Api Nuthatch.App Nuthatch.App.Env Nuthatch.Audit Nuthatch.Browse Nuthatch.Config Nuthatch.Db Nuthatch.Http.Auth Nuthatch.Http.Contract Nuthatch.Http.Error Nuthatch.Http.Server Nuthatch.Mutation.Effects Nuthatch.Mutation.Recovery Nuthatch.Mutation.Service Nuthatch.Oidc Nuthatch.Paths Nuthatch.Product.Limits Nuthatch.Protocol Nuthatch.Redis Nuthatch.Recovery Nuthatch.Runtime Nuthatch.S3 Nuthatch.Session Nuthatch.Streaming Nuthatch.Transfer Nuthatch.Types executable nuthatch import: shared main-is: Main.hs hs-source-dirs: app build-depends: , nuthatch:nuthatch-internal , base ghc-options: -threaded -rtsopts -with-rtsopts=-N executable nuthatch-generate-web-contract import: shared main-is: GenerateContract.hs hs-source-dirs: app build-depends: , nuthatch:nuthatch-internal , base executable nuthatch-web-contract-integration import: shared main-is: WebContractIntegration.hs hs-source-dirs: test build-depends: , nuthatch:nuthatch-internal , base , bytestring , process >= 1.6 && < 1.7 , text ghc-options: -threaded executable nuthatch-storage-integration import: shared main-is: Integration.hs hs-source-dirs: test build-depends: , nuthatch:nuthatch-internal , base , async , bytestring , text ghc-options: -threaded -rtsopts -with-rtsopts=-N executable nuthatch-recovery-probe import: shared main-is: RecoveryPhase.hs hs-source-dirs: test build-depends: , nuthatch:nuthatch-internal , base , bytestring , text ghc-options: -threaded -rtsopts -with-rtsopts=-N executable nuthatch-protocol-conformance import: shared main-is: ProtocolConformance.hs hs-source-dirs: test other-modules: Nuthatch.ModelEvidence build-depends: , nuthatch:nuthatch-internal , base , bytestring , crypton , memory , postgresql-simple , text ghc-options: -threaded -rtsopts -with-rtsopts=-N executable nuthatch-model-evidence import: shared main-is: ModelEvidenceMain.hs hs-source-dirs: test other-modules: Nuthatch.ModelEvidence build-depends: , nuthatch:nuthatch-internal , aeson , base , text executable nuthatch-runtime-probe import: shared main-is: RuntimeProbe.hs hs-source-dirs: test build-depends: , nuthatch:nuthatch-internal , base ghc-options: -threaded -rtsopts -with-rtsopts=-N executable nuthatch-auth-probe import: shared main-is: AuthProbe.hs hs-source-dirs: test other-modules: Nuthatch.Probe.Assert Nuthatch.Probe.Curl Nuthatch.Probe.Http Nuthatch.Probe.Oidc Nuthatch.Probe.ProductClient build-depends: , nuthatch:nuthatch-internal , aeson , base , bytestring , crypton , memory , process >= 1.6 && < 1.7 , temporary ghc-options: -threaded -rtsopts -with-rtsopts=-N executable nuthatch-product-probe import: shared main-is: ProductProbe.hs hs-source-dirs: test other-modules: Nuthatch.Probe.Assert Nuthatch.Probe.Http Nuthatch.Probe.Oidc Nuthatch.Probe.ProductClient build-depends: , nuthatch:nuthatch-internal , aeson , base , bytestring , crypton , memory , process >= 1.6 && < 1.7 , temporary ghc-options: -threaded -rtsopts -with-rtsopts=-N executable nuthatch-idempotency-probe import: shared main-is: IdempotencyProbe.hs hs-source-dirs: test other-modules: Nuthatch.Probe.Assert Nuthatch.Probe.Curl Nuthatch.Probe.Http Nuthatch.Probe.Oidc Nuthatch.Probe.ProductClient build-depends: , nuthatch:nuthatch-internal , aeson , async , base , bytestring , crypton , memory , process >= 1.6 && < 1.7 , temporary ghc-options: -threaded -rtsopts -with-rtsopts=-N executable nuthatch-streaming-probe import: shared main-is: StreamingProbe.hs hs-source-dirs: test other-modules: Nuthatch.Probe.Assert Nuthatch.Probe.Curl Nuthatch.Probe.Http Nuthatch.Probe.Oidc Nuthatch.Probe.ProductClient build-depends: , nuthatch:nuthatch-internal , aeson , async , base , bytestring , crypton , directory , memory , process >= 1.6 && < 1.7 , temporary ghc-options: -threaded -rtsopts -with-rtsopts=-N executable nuthatch-runtime-http-probe import: shared main-is: RuntimeHttpProbe.hs hs-source-dirs: test other-modules: Nuthatch.Probe.Assert Nuthatch.Probe.Http Nuthatch.Probe.Oidc Nuthatch.Probe.ProductClient build-depends: , nuthatch:nuthatch-internal , aeson , base , bytestring , crypton , memory , process >= 1.6 && < 1.7 , temporary ghc-options: -threaded -rtsopts -with-rtsopts=-N executable nuthatch-runtime-audit-probe import: shared main-is: RuntimeAuditProbe.hs hs-source-dirs: test other-modules: Nuthatch.Probe.Assert build-depends: , nuthatch:nuthatch-internal , aeson , base , bytestring , text executable nuthatch-fixture-probe import: shared main-is: FixtureProbe.hs hs-source-dirs: test other-modules: Nuthatch.Probe.Assert Nuthatch.Probe.Http build-depends: , nuthatch:nuthatch-internal , base , bytestring , crypton , memory , postgresql-simple , process >= 1.6 && < 1.7 , temporary , text executable nuthatch-dependency-probe import: shared main-is: DependencyProbe.hs hs-source-dirs: test other-modules: Nuthatch.Probe.Assert Nuthatch.Probe.Curl Nuthatch.Probe.Http build-depends: , nuthatch:nuthatch-internal , base , bytestring , hedis , postgresql-simple , process >= 1.6 && < 1.7 , temporary executable nuthatch-browser-session-fixture import: shared main-is: BrowserSessionFixture.hs hs-source-dirs: test build-depends: , nuthatch:nuthatch-internal , aeson , base , text test-suite nuthatch-unit import: shared type: exitcode-stdio-1.0 main-is: Spec.hs hs-source-dirs: test other-modules: Nuthatch.Test.Config Nuthatch.Test.Http Nuthatch.Test.HttpContract Nuthatch.Test.Identity Nuthatch.Test.Oidc Nuthatch.Test.Path Nuthatch.Test.PathFixture Nuthatch.Test.Product Nuthatch.Test.Protocol Nuthatch.Test.Recovery Nuthatch.Test.Runtime Nuthatch.Test.Streaming Nuthatch.Test.UploadIdentityFixture build-depends: , nuthatch:nuthatch-internal , base , bytestring , hedgehog >= 1.7 && < 1.8 , tasty >= 1.5 && < 1.6 , tasty-hedgehog >= 1.4 && < 1.5 , tasty-hunit >= 0.10 && < 0.11 , text ghc-options: -threaded