passwall-server is a free, open source identity & access management (iam) project written in Go and released under AGPL-3.0. It has 767 GitHub stars, 101 forks and 14 open issues, and was last pushed 4 months ago. On this registry it ranks #50 of 54 tracked projects in Identity & Access Management (IAM), with 5 head-to-head comparisons available.

What is passwall-server?

Passwall Server is the Go-based backend that powers the open source Passwall password manager platform, giving self-hosters an API server to store credentials and access them from anywhere.

What it is

Passwall Server is the core backend infrastructure of the Passwall platform: a RESTful API server written in Go that stores passwords and related records, exposes them to clients over HTTP at http://localhost:3625 by default, and authenticates users with token-based JWT authentication. It ships with a companion passwall-cli binary for creating users, and it is released under the AGPL-3.0 licence with 767 stars and 101 forks on GitHub.

The concrete problem it solves is keeping personal secrets encrypted at rest while still retrievable from any device — it encrypts stored values with AES-GCM, backs them with PostgreSQL 13+, and manages schema changes itself through automatic migration, so a self-hoster does not hand-manage the database structure. It also moves several categories of sensitive record out of plain text notes or spreadsheets: alongside passwords, the server holds credit cards, bank accounts, notes and emails as distinct storage types.

Key capabilities

  • Encrypts stored secrets with AES-GCM and authenticates API requests through JWT tokens.
  • Serves a well-documented RESTful API covering the full CRUD surface of the stored records.
  • Holds multiple storage types in one store: passwords, credit cards, bank accounts, notes and emails.
  • Applies security middlewares for XSS protection, SQL injection prevention and rate limiting.
  • Runs automatic database migration to keep the PostgreSQL schema in sync with the code.
  • Provides a passwall-cli binary (docker exec -it passwall-server /app/passwall-cli) for creating the first user.
  • Builds for Linux and macOS from a single Makefile (make build-linux, make build-darwin, make build-all).

Who uses it and how

  • Operators who deploy the whole stack with Docker Compose, running make up and then creating an initial user through the CLI inside the passwall-server container.
  • Developers working locally against a PostgreSQL instance started with make db-up, building and running with make run, or using make dev for hot reloading via Air.
  • Contributors running the standard Go toolchain workflow: go mod download, make lint with golangci-lint, make test and make test-coverage, plus make generate.
  • Teams shipping the project through its Makefile-driven CI path, with make image-build and make image-publish pushing images to Docker Hub, and a Heroku deploy button offered as a hosted option.
  • Users who prefer to fetch build/docker/docker-compose.yml straight from the repository and start services with docker-compose up -d.

Getting started

Start the stack with Docker Compose by running make up (or download https://raw.githubusercontent.com/passwall/passwall-server/main/build/docker/docker-compose.yml and run docker-compose up -d), then create a user with docker exec -it passwall-server /app/passwall-cli; the published image is passwall/passwall-server on Docker Hub.

How it compares

No list of paid products replaced by this project is given in the available facts, and no comparable tools are named in its README or topic list, so it stands alone in this registry.

When to use it — and when not

A self-hoster must operate PostgreSQL 13+ alongside the server process and reach it through Docker or a Go 1.24+ build environment, so anyone unwilling to run a database and a container stack should look elsewhere. It is a backend only: without a Passwall client or the passwall-cli user-creation step it stores nothing you can read. On the downside, 14 issues are still open, and the README's API documentation and security sections are only partially fleshed out, so integrators should expect to read the source to pin down endpoint behaviour.

project readme (upstream, from github) — read inline

PassWall Server

PassWall Server is the core backend for open source password manager PassWall platform. Using this server, you can safely store your passwords and access them from anywhere.

License GitHub issues Build Status Coverage Status Docker Pull Status
Deploy

📋 Table of Contents

✨ Features

  • 🔐 Secure Password Storage - AES-GCM encryption
  • 🌐 RESTful API - Well-documented API endpoints
  • 🐳 Docker Support - Easy deployment with Docker Compose
  • 🔄 Auto Migration - Database schema management
  • 📦 Multiple Storage Types - Passwords, credit cards, bank accounts, notes, emails
  • 🛡️ Security Middlewares - XSS protection, SQL injection prevention, rate limiting
  • 🎯 JWT Authentication - Secure token-based authentication

🚀 Quick Start

Using Docker Compose (Recommended)

  1. Start the server:
make up
  1. Create a new user:
docker exec -it passwall-server /app/passwall-cli
  1. Access the server:
Server URL: http://localhost:3625

Using Docker Hub Image

# Create directory
mkdir $HOME/passwall-server
cd $HOME/passwall-server

# Download docker-compose.yml
wget https://raw.githubusercontent.com/passwall/passwall-server/main/build/docker/docker-compose.yml

# Start services
docker-compose up -d

# Create user
docker exec -it passwall-server /app/passwall-cli

💻 Development

Prerequisites

  • Go 1.24+ (or latest)
  • PostgreSQL 13+
  • Docker & Docker Compose (optional)
  • Make

Local Development Setup

  1. Clone the repository:
git clone https://github.com/passwall/passwall-server.git
cd passwall-server
  1. Install dependencies:
go mod download
  1. Install development tools:
make install-tools
  1. Start PostgreSQL:
make db-up
  1. Build and run:
make run

Development with Hot Reload

make dev

This will install and use Air for automatic reloading on code changes.

📦 Makefile Commands

Run make help to see all available commands:

General

make help              # Display help message

Build

make build             # Build server and CLI binaries
make build-linux       # Build for Linux
make build-darwin      # Build for macOS
make build-all         # Build for all platforms
make clean             # Clean build artifacts

Development

make generate          # Run go generate
make lint              # Run golangci-lint
make test              # Run tests
make test-coverage     # Run tests with coverage report
make install-tools     # Install development tools

Local Development

make run               # Build and run server locally
make dev               # Run with hot reload (air)
make create-user       # Create a new user with CLI

Docker

make image-build       # Build Docker image
make image-publish     # Build and publish to Docker Hub

Docker Compose

make up                # Start all services (builds if needed)
make down              # Stop all services
make restart           # Restart all services
make logs              # Show logs
make ps                # Show running services

Database

make db-up             # Start PostgreSQL only
make db-down           # Stop PostgreSQL
make db-logs           # Show PostgreSQL logs

CI/CD

make ci                # Run full CI pipeline
make check             # Run lint and test

Information

make version           # Show version information
make info              # Show build information

🐳 Docker Deployment

Build Docker Image

make image-build

Build and Publish to Docker Hub

# Login to Docker Hub first
docker login

# Build and publish
make image-publish

Custom Docker Image Tag

DOCKER_TAG=v2.0.0 make image-build
DOCKER_TAG=v2.0.0 make image-publish

🔧 Environment Variables

Server Configuration

Variable Description Default
PORT Server port 3625
PW_SERVER_USERNAME Admin username -
PW_SERVER_PASSWORD Admin password -
PW_SERVER_PASSPHRASE Encryption passphrase -
PW_SERVER_SECRET JWT secret -
PW_SERVER_TIMEOUT Server timeout 2
PW_SERVER_GENERATED_PASSWORD_LENGTH Generated password length 16
PW_SERVER_ACCESS_TOKEN_EXPIRE_DURATION Access token expire duration 30m
PW_SERVER_REFRESH_TOKEN_EXPIRE_DURATION Refresh token expire duration 7d

Database Configuration

Variable Description Default
PW_DB_NAME Database name passwall
PW_DB_USERNAME Database username postgres
PW_DB_PASSWORD Database password password
PW_DB_HOST Database host localhost
PW_DB_PORT Database port 5432
PW_DB_LOG_MODE Enable DB logging false
PW_DB_SSL_MODE SSL mode disable

📚 API Documentation

API documentation is available at Postman Public Directory

🛡️ Security

  1. AES-GCM Encryption - Passwords are encrypted with AES in Galois/Counter Mode. Passwords can only be decrypted with the passphrase defined in your configuration.

  2. Security Middlewares - Endpoints are protected against XSS attacks and other common vulnerabilities.

  3. SQL Injection Prevention - Using Gorm ORM which automatically sanitizes all queries.

  4. Rate Limiting - Built-in rate limiter for signin attempts to prevent brute force attacks.

  5. JWT Authentication - Secure token-based authentication with access and refresh tokens.

👥 Clients

PassWall Server can be used with:

💖 Support

I promise all the support will be spent on this project!

Become a Patron

🤝 Contributing

For Contributors

  1. Don't send too many commits at once. It will be easier for us to do a code review.
  2. Be sure to check out the dev branch. The latest development version is there.
  3. First try to fix // TODO: items in the code.
  4. Follow the milestones for feature development.
  5. Don't modify the UI without design approval.

Development Workflow

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Running Tests

# Run all tests
make test

# Run tests with coverage
make test-coverage

# Run linter
make lint

# Run full CI pipeline
make ci

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🌟 Star History

If you like this project, please give it a ⭐ on GitHub!


Made with ❤️ by the PassWall Team

Frequently asked questions

Is passwall-server free to use?

passwall-server is open source under the AGPL-3.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does passwall-server do?

Passwall Server is the core backend infrastructure for Passwall platform

What is passwall-server written in?

passwall-server is primarily written in Go. Its source is publicly available at https://github.com/passwall/passwall-server, and it has 767 GitHub stars.