Web console for Internxt's S3-compatible Object Storage service. It is a single React app that serves different consoles depending on the host/route.
The account hierarchy is: a wholesaler has many partners, and a partner has many sub-accounts, there are no further consoles below that. Each of these entities can also have member accounts of its own (e.g. read-only team accounts), which log in through that same entity's console.
- Management console (
/management/*): internal console for managing accounts, partners and wholesalers. - Wholesalers console (
/wholesalers/*): used by wholesalers and their members to manage the wholesaler's partners. - Partners console (
/partners/*): used by partners and their members to manage the partner's sub-accounts. - Sub-account console (
/subaccount/*): used by sub-accounts and their members. A scoped console with its own branding, buckets, usage, sharing and settings (profile, members, permissions, access keys, billing, audit log).
Object storage operations (buckets, objects, access keys, etc.) talk directly to an S3-compatible API using the AWS SDK (@aws-sdk/client-s3). Account, billing and management operations talk to Internxt's internal APIs.
- Node >= 24
- Access to the
local-environmentstack (or equivalent), which provides thes3-serverandpayments-apiservices this app talks to in development.
-
Copy
.npmrc.templateto.npmrc. -
Copy
.env.templateto.envand fill in/adjust the values for your environment. -
Install dependencies:
npm install
Runs the app in development mode with hot module reloading. Open http://localhost:3000 to view it in the browser.
Type-checks the project and builds it for production into the dist folder.
Serves the production build locally. Run npm run build first, otherwise it will serve a stale or missing build.
Runs ESLint over the project.
Formats the codebase with Prettier.
Runs the unit test suite with Vitest and prints a coverage report.
This project uses Husky for a pre-commit hook that runs the test suite and lints/formats staged files via lint-staged. Hooks are installed automatically on npm install through the prepare script.
The app is organized by console, each with its own routes, context, services and views, plus a components/services/utils layer shared across all of them:
src/
├── components/ # Shared components used across consoles
├── context/ # Shared context
├── services/ # Shared API clients and services
├── utils/ # Shared utilities
├── views/ # Views for the main console
├── management/ # Management console (accounts, partners, wholesalers admin)
├── partners/ # Partners console
├── wholesalers/ # Wholesalers console
└── sub-account/ # Sub-account console (branding, buckets, usage, settings)
├── context/
├── services/
└── views/
Each console folder follows the same internal shape: context/ (auth/session context and hooks), components/ (console-specific components), services/ (API calls) and views/ (pages/routes).