ClientShare is a secure, branded client portal for teams that need a better way to send files, collect uploads, and keep sensitive document exchange out of email threads.
ClientShare prioritizes self-hosted deployments, with sensible defaults for small firms and room to grow into more advanced hosted setups. Out of the box, it gives you a private portal for sharing files, requesting documents, managing access, and presenting a more professional client experience.
- Keep client files in one place instead of scattered across inboxes and shared links.
- Give clients a clean upload and download experience with branded portal settings.
- Control access with users, roles, permissions, and secure links.
- Start with SQLite and local storage, then move to Postgres, MySQL, or S3-compatible storage when needed.
- Run it yourself without stitching together separate tools for auth, file exchange, and portal UX.
- Secure client portal for sending files and collecting uploads
- Expiring secure links for controlled external access
- User and role-based access control
- Client, folder, and file organization
- Email-driven workflows for invites and password resets
- Branding controls for site title, logo, and primary color
- Local-first self-hosting defaults with optional hosted-oriented tenancy mode
- Vue frontend bundled into the Go app for a single deployable service
The ClientShare user guide covers client workspaces, file exchange, secure links, invitations, and portal administration. Its public site is built with Bun and VitePress 2.0 alpha.
Run it locally with bun install --cwd guide followed by make run-guide. All tenancy modes default to the bundled guide at /docs/; make run, make build, and Docker builds include it. Set server.docs.url in server configuration to opt into a different documentation site without rebuilding the frontend. server.docs.site_link configures the bundled guide's optional header link back to your site.
Build the standalone hosted site with make build-guide (guide/.vitepress/dist), or regenerate the embedded /docs/ version with make build-guide-embedded (internal/static/guide/dist).
- Docker
- Docker Compose
mkdir clientshare
cd clientshare
mkdir config data storage
wget https://raw.githubusercontent.com/pixelcop/clientshare/refs/heads/main/docker/docker-compose.yml
wget https://raw.githubusercontent.com/pixelcop/clientshare/refs/heads/main/config/config.yaml.sample -O config/config.yamlUpdate these values in config/config.yaml:
auth.jwt_secretauth.invite_token_secretsecure_links.signing_keyadmin.bootstrap_emailadmin.bootstrap_password
The sample config defaults to:
- single-tenant mode
- SQLite
- local file storage
docker compose up -dRun this from the repository root so Docker uses docker-compose.yml. The container mounts your local config, data, and storage directories, so configuration, database files, and uploads persist on the host.
Open http://localhost:8080.
- Go
- Bun
- GNU Make
- A C toolchain with SQLite development headers for local Go builds
Build frontend and backend components:
make build-web buildThis produces the main server binary plus the migration and import tools:
clientsharegooseimportclients
make build-dockerThis uses docker/Dockerfile to build the frontend, generate email templates, compile the Go binaries, and package the runtime image.
make runmake run-webWith dev_mode: true, the Go app can proxy to the Vite dev server during development.
make test
make test-web
make test-allmake migrate
make migrate-down
make migrate-create name=add_featureMost runtime settings live in config/config.yaml.sample.
Useful defaults and options include:
tenancy.mode:singleorhosteddatabase.driver:sqlite,postgres, ormysqlstorage.type: local filesystem or S3-compatible object storagebranding: site title, logo path, and primary colorinternal_api: disabled by default for self-hosted installs
Verify a config file against the schema built into the current server version:
./clientshare config verify --config config/config.yamlThe report lists missing required and optional fields, including a default value where the server has one and an introduction date for versioned settings. Structural errors such as unknown fields or incorrect value types prevent server startup; missing optional fields produce a startup warning. To inspect or save the generated JSON Schema:
./clientshare config schemaFor local development overrides, see docs/env.md.
- Go backend
- Fiber web server
- GORM models and Goose-style migrations
- Vue 3 frontend with Vite
- SQLite by default for the easiest self-hosted setup
- cmd entrypoints for the server and import tools
- internal/handlers HTTP handlers and route registration
- internal/services business logic and supporting services
- internal/models application models
- internal/database/migrations schema migrations
- web Vue frontend
- public static assets
ClientShare defaults to a simple self-hosted setup:
- SQLite database
- local storage under
./storage - bundled frontend served by the Go application
For more advanced deployments, you can switch to Postgres or MySQL, use S3-compatible storage, and enable hosted-oriented tenancy features when needed.
ClientShare is an active open-source project focused on secure client document exchange and self-hosted deployments.
If you need a branded client portal for file requests, sensitive uploads, or recurring document handoff, this repo is the place to start.
AGPL, Copyright (C) 2026 Pixelcop Research, Inc.