PocketBase - open source backend in 1 file

build Latest releases Go package documentation

[PocketBase](https://pocketbase.io) is an open source Go backend, consisting of: - embedded database (_SQLite_) with **realtime subscriptions** - built-in **files and users management** - convenient **Admin dashboard UI** - and simple **REST-ish API** **For documentation and examples, please visit https://pocketbase.io/docs.** > [!WARNING] > Please keep in mind that PocketBase is still under active development > and therefore full backward compatibility is not guaranteed before reaching v1.0.0. ## API SDK clients The easiest way to interact with the API is to use one of the official SDK clients: - **JavaScript - [pocketbase/js-sdk](https://github.com/pocketbase/js-sdk)** (_browser and node_) - **Dart - [pocketbase/dart-sdk](https://github.com/pocketbase/dart-sdk)** (_web, mobile, desktop_) ## Overview PocketBase could be [downloaded directly as a standalone app](https://github.com/pocketbase/pocketbase/releases) or it could be used as a Go framework/toolkit which allows you to build your own custom app specific business logic and still have a single portable executable at the end. ### Installation ```sh # go 1.21+ go get github.com/pocketbase/pocketbase ``` ### Example ```go package main import ( "log" "net/http" "github.com/labstack/echo/v5" "github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase/apis" "github.com/pocketbase/pocketbase/core" ) func main() { app := pocketbase.New() app.OnBeforeServe().Add(func(e *core.ServeEvent) error { // add new "GET /hello" route to the app router (echo) e.Router.AddRoute(echo.Route{ Method: http.MethodGet, Path: "/hello", Handler: func(c echo.Context) error { return c.String(200, "Hello world!") }, Middlewares: []echo.MiddlewareFunc{ apis.ActivityLogger(app), }, }) return nil }) if err := app.Start(); err != nil { log.Fatal(err) } } ``` ### Running and building Running/building the application is the same as for any other Go program, aka. just `go run` and `go build`. **PocketBase embeds SQLite, but doesn't require CGO.** If CGO is enabled (aka. `CGO_ENABLED=1`), it will use [mattn/go-sqlite3](https://pkg.go.dev/github.com/mattn/go-sqlite3) driver, otherwise - [modernc.org/sqlite](https://pkg.go.dev/modernc.org/sqlite). Enable CGO only if you really need to squeeze the read/write query performance at the expense of complicating cross compilation. To build the minimal standalone executable, like the prebuilt ones in the releases page, you can simply run `go build` inside the `examples/base` directory: 0. [Install Go 1.21+](https://go.dev/doc/install) (_if you haven't already_) 1. Clone/download the repo 2. Navigate to `examples/base` 3. Run `GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build` (_https://go.dev/doc/install/source#environment_) 4. Start the created executable by running `./base serve`. The supported build targets by the non-cgo driver at the moment are: ``` darwin amd64 darwin arm64 freebsd amd64 freebsd arm64 linux 386 linux amd64 linux arm linux arm64 linux ppc64le linux riscv64 linux s390x windows amd64 windows arm64 ``` ### Testing PocketBase comes with mixed bag of unit and integration tests. To run them, use the default `go test` command: ```sh go test ./... ``` Check also the [Testing guide](http://pocketbase.io/docs/testing) to learn how to write your own custom application tests. ## Security If you discover a security vulnerability within PocketBase, please send an e-mail to **support at pocketbase.io**. All reports will be promptly addressed, and you'll be credited accordingly. ## Contributing PocketBase is free and open source project licensed under the [MIT License](LICENSE.md). You are free to do whatever you want with it, even offering it as a paid service. You could help continuing its development by: - [Contribute to the source code](CONTRIBUTING.md) - [Suggest new features and report issues](https://github.com/pocketbase/pocketbase/issues) - [Donate a small amount](https://pocketbase.io/support-us) PRs for new OAuth2 providers, bug fixes, code optimizations and documentation improvements are more than welcome. But please refrain creating PRs for _new features_ without previously discussing the implementation details. PocketBase has a [roadmap](https://github.com/orgs/pocketbase/projects/2) and I try to work on issues in specific order and such PRs often come in out of nowhere and skew all initial planning with tedious back-and-forth communication. Don't get upset if I close your PR, even if it is well executed and tested. This doesn't mean that it will never be merged. Later we can always refer to it and/or take pieces of your implementation when the time comes to work on the issue (don't worry you'll be credited in the release notes). > [!NOTE] > PocketBase was initially created to serve as a new backend for my other open source project - [Presentator](https://presentator.io) (see [#183](https://github.com/presentator/presentator/issues/183)), > so all feature requests will be first aligned with what we need for Presentator v3.