Getting started
PocketBase can be used as regular Go package that exposes various helpers and hooks to help you implement your own custom portable application.
A new PocketBase instance is created via pocketbase.New() or pocketbase.NewWithConfig(config) .
Once created you can register your custom business logic via the available event hooks and call app.Start() to start the application.
Below is a minimal example:
- Install Go 1.23+
Create a new project directory with
main.gofile inside it.
As a reference, you can also explore the prebuilt executableexample/base/main.gofile.package main import ( "log" "os" "github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase/apis" "github.com/pocketbase/pocketbase/core" ) func main() { app := pocketbase.New() app.OnServe().BindFunc(func(se *core.ServeEvent) error { // serves static files from the provided public dir (if exists) se.Router.GET("/{path...}", apis.Static(os.DirFS("./pb_public"), false)) return se.Next() }) if err := app.Start(); err != nil { log.Fatal(err) } }- To init the dependencies, run
go mod init myapp && go mod tidy. - To start the application, run
go run . serve. - To build a statically linked executable, run
go buildand then you can start the created executable with./myapp serve.
Custom SQLite driver
The general recommendation is to use the builtin SQLite setup but if you need more advanced configuration or extensions like ICU, FTS5, etc. you'll have to specify a custom driver/build.
Note that PocketBase by default doesn't require CGO because it uses the pure Go SQLite port modernc.org/sqlite , but this may not be the case when using a custom SQLite driver!
PocketBase v0.23+ added support for defining a DBConnect function as app configuration to load custom SQLite builds and drivers compatible with the standard Go database/sql.
The DBConnect function is called twice - once for pb_data/data.db (the main database file) and second time for pb_data/auxiliary.db (used for logs and other ephemeral system meta information).
If you want to load your custom driver conditionally and fallback to the default handler, then you can call core.DefaultDBConnect .
As a side-note, if you are not planning to use core.DefaultDBConnect fallback as part of your custom driver registration you can exclude the default pure Go driver with go build -tags no_default_driver to reduce the binary size a little (~4MB).
Below are some minimal examples with commonly used external SQLite drivers: