Open Source realtime backend in 1 file
To update the prebuilt executable you can run
./pocketbase update
.
json
field changes that was causing View collection column expressions recognized as json
to fail to resolve (#4072).To update the prebuilt executable you can run
./pocketbase update
.
Fixed the json
field equal query comparisons to work correctly with plain JSON primitive values like null
, bool
number
, etc. (#4068).
Since there are plans in the future to allow custom SQLite builds and also in some situations it may be useful to be able to distinguish NULL
from ''
, for the json
fields (and for any other future non-standard field) we no longer apply COALESCE
by default, aka.:
Dataset:
1) data: json(null)
2) data: json('')
For the json field filter "data = null" only 1) will resolve to TRUE.
For the json field filter "data = ''" only 2) will resolve to TRUE.
Minor Go tests improvements
To update the prebuilt executable you can run
./pocketbase update
.
Added sleep(milliseconds)
JSVM binding.
It works the same way as Go time.Sleep()
, aka. it pauses the goroutine where the JSVM code is running.
Fixed multi-line text paste in the Admin UI search bar (#4022).
Fixed the monospace font loading in the Admin UI.
Fixed various reported docs and code comment typos.
To update the prebuilt executable you can run
./pocketbase update
.
Added --dev
flag and its accompanying app.IsDev()
method (in place of the previosly removed --debug
) to assist during development (#3918).
The --dev
flag prints in the console "everything" and more specifically:
app.Logger().*
logs (debug, info, warning, error, etc.), no matter of the logs persistence settings in the Admin UIMinor Admin UI fixes:
error
label text wrapping.referer
(when it is from a different source) and details
labels in the logs listing.CAST(x as bool)
expressions.Replaced the default API tests timeout with a new ApiScenario.Timeout
option (#3930).
A negative or zero value means no tests timeout.
If a single API test takes more than 3s to complete it will have a log message visible when the test fails or when go test -v
flag is used.
Added timestamp at the beginning of the generated JSVM types file to avoid creating it everytime with the app startup.
To update the prebuilt executable you can run
./pocketbase update
.
Added expand
, filter
, fields
, custom query and headers parameters support for the realtime subscriptions.
Requires JS SDK v0.20.0+ or Dart SDK v0.17.0+.
// JS SDK v0.20.0
pb.collection("example").subscribe("*", (e) => {
...
}, {
expand: "someRelField",
filter: "status = 'active'",
fields: "id,expand.someRelField.*:excerpt(100)",
})
// Dart SDK v0.17.0
pb.collection("example").subscribe("*", (e) {
...
},
expand: "someRelField",
filter: "status = 'active'",
fields: "id,expand.someRelField.*:excerpt(100)",
)
Generalized the logs to allow any kind of application logs, not just requests.
The new app.Logger()
implements the standard log/slog
interfaces available with Go 1.21.
// Go: https://pocketbase.io/docs/go-logging/
app.Logger().Info("Example message", "total", 123, "details", "lorem ipsum...")
// JS: https://pocketbase.io/docs/js-logging/
$app.logger().info("Example message", "total", 123, "details", "lorem ipsum...")
For better performance and to minimize blocking on hot paths, logs are currently written with debounce and on batches:
- 3 seconds after the last debounced log write
- when the batch threshold is reached (currently 200)
- right before app termination to attempt saving everything from the existing logs queue
Some notable log related changes:
⚠️ Bumped the minimum required Go version to 1.21.
⚠️ Removed _requests
table in favor of the generalized _logs
.
Note that existing logs will be deleted!
⚠️ Renamed the following Dao
log methods:
Dao.RequestQuery(...) -> Dao.LogQuery(...)
Dao.FindRequestById(...) -> Dao.FindLogById(...)
Dao.RequestsStats(...) -> Dao.LogsStats(...)
Dao.DeleteOldRequests(...) -> Dao.DeleteOldLogs(...)
Dao.SaveRequest(...) -> Dao.SaveLog(...)
⚠️ Removed app.IsDebug()
and the --debug
flag.
This was done to avoid the confusion with the new logger and its debug severity level.
If you want to store debug logs you can set -4
as min log level from the Admin UI.
Refactored Admin UI Logs:
Added new filesystem/System.Copy(src, dest)
method to copy existing files from one location to another.
This is usually useful when duplicating records with file
field(s) programmatically.
Added filesystem.NewFileFromUrl(ctx, url)
helper method to construct a *filesystem.BytesReader
file from the specified url.
OAuth2 related additions:
Added new PKCE()
and SetPKCE(enable)
OAuth2 methods to indicate whether the PKCE flow is supported or not.
The PKCE value is currently configurable from the UI only for the OIDC providers.
This was added to accommodate OIDC providers that may throw an error if unsupported PKCE params are submitted with the auth request (eg. LinkedIn; see #3799).
Added new displayName
field for each listAuthMethods()
OAuth2 provider item.
The value of the displayName
property is currently configurable from the UI only for the OIDC providers.
Added expiry
field to the OAuth2 user response containing the optional expiration time of the OAuth2 access token (#3617).
Allow a single OAuth2 user to be used for authentication in multiple auth collection.
⚠️ Because now you can have more than one external provider with collectionId-provider-providerId
pair, Dao.FindExternalAuthByProvider(provider, providerId)
method was removed in favour of the more generic Dao.FindFirstExternalAuthByExpr(expr)
.
Added onlyVerified
auth collection option to globally disallow authentication requests for unverified users.
Added support for single line comments (ex. // your comment
) in the API rules and filter expressions.
Added support for specifying a collection alias in @collection.someCollection:alias.*
.
Soft-deprecated and renamed app.Cache()
with app.Store()
.
Minor JSVM updates and fixes:
Updated $security.parseUnverifiedJWT(token)
and $security.parseJWT(token, key)
to return the token payload result as plain object.
Added $apis.requireGuestOnly()
middleware JSVM binding (#3896).
Use IS NOT
instead of !=
as not-equal SQL query operator to handle the cases when comparing with nullable columns or expressions (eg. json_extract
over json
field).
Based on my local dataset I wasn't able to find a significant difference in the performance between the 2 operators, but if you stumble on a query that you think may be affected negatively by this, please report it and I'll test it further.
Added MaxSize
json
field option to prevent storing large json data in the db (#3790).
Existing json
fields are updated with a system migration to have a ~2MB size limit (it can be adjusted from the Admin UI).
Fixed negative string number normalization support for the json
field type.
Trigger the app.OnTerminate()
hook on app.Restart()
call.
A new bool IsRestart
field was also added to the core.TerminateEvent
event.
Fixed graceful shutdown handling and speed up a little the app termination time.
Limit the concurrent thumbs generation to avoid high CPU and memory usage in spiky scenarios (#3794; thanks @t-muehlberger).
Currently the max concurrent thumbs generation processes are limited to "total of logical process CPUs + 1".
This is arbitrary chosen and may change in the future depending on the users feedback and usage patterns.
If you are experiencing OOM errors during large image thumb generations, especially in container environment, you can try defining the GOMEMLIMIT=500MiB
env variable before starting the executable.
Slightly speed up (~10%) the thumbs generation by changing from cubic (CatmullRom
) to bilinear (Linear
) resampling filter (the quality difference is very little).
Added a default red colored Stderr output in case of a console command error.
You can now also silence individually custom commands errors using the cobra.Command.SilenceErrors
field.
Fixed links formatting in the autogenerated html->text mail body.
Removed incorrectly imported empty local('')
font-face declarations.
To update the prebuilt executable you can run
./pocketbase update
.
Fixed TinyMCE source code viewer textarea styles (#3715).
Fixed text
field min/max validators to properly count multi-byte characters (#3735).
Allowed hyphens in usernames (#3697). More control over the system fields settings will be available in the future.
Updated the JSVM generated types to use directly the value instead of * | undefined
union in functions/methods return declarations.
⚠️ This is a prerelease intended primarily for test purposes.
To update the prebuilt executable you can run
./pocketbase update
.
Added the release notes to the console output of ./pocketbase update
(#3685).
Added missing documention for the JSVM $mails.*
bindings.
Relaxed the OAuth2 redirect url validation to allow any string value (#3689; thanks @sergeypdev). Note that the redirect url format is still bound to the accepted values by the specific OAuth2 provider.
⚠️ This is a prerelease intended primarily for test purposes.