Skip to content

About

ClientShare is a secure, branded client portal for teams

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

ClientShare logo

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.

Why ClientShare

  • 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.

Feature Highlights

  • 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

User Guide

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).

Quick Start

Prerequisites

  • Docker
  • Docker Compose

1. Setup and configure

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.yaml

Update these values in config/config.yaml:

  • auth.jwt_secret
  • auth.invite_token_secret
  • secure_links.signing_key
  • admin.bootstrap_email
  • admin.bootstrap_password

The sample config defaults to:

  • single-tenant mode
  • SQLite
  • local file storage

2. Start ClientShare with Docker

docker compose up -d

Run 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.

Building

Source build prerequisites

  • Go
  • Bun
  • GNU Make
  • A C toolchain with SQLite development headers for local Go builds

Build from source

Build frontend and backend components:

make build-web build

This produces the main server binary plus the migration and import tools:

  • clientshare
  • goose
  • importclients

Build a Docker image

make build-docker

This uses docker/Dockerfile to build the frontend, generate email templates, compile the Go binaries, and package the runtime image.

Development

Backend

make run

Frontend dev server

make run-web

With dev_mode: true, the Go app can proxy to the Vite dev server during development.

Tests

make test
make test-web
make test-all

Migrations

make migrate
make migrate-down
make migrate-create name=add_feature

Configuration

Most runtime settings live in config/config.yaml.sample.

Useful defaults and options include:

  • tenancy.mode: single or hosted
  • database.driver: sqlite, postgres, or mysql
  • storage.type: local filesystem or S3-compatible object storage
  • branding: site title, logo path, and primary color
  • internal_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.yaml

The 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 schema

For local development overrides, see docs/env.md.

Stack

  • 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

Project Layout

Deployment Notes

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.

Status

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.

License

AGPL, Copyright (C) 2026 Pixelcop Research, Inc.

About

ClientShare is a secure, branded client portal for teams

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages