Presentator is free and open source design feedback and presentation platform.
It can be used directly via the free hosted service at app.presentator.io or self host it on your own server via a single executable.
-
Download the prebuilt executable for your platform from the Releases page.
-
Start the executable from the terminal:
# run `./presentator --help` for all available commands and options ./presentator serve
-
Navigate to
http://127.0.0.1:8090/_/
to access the super admin dashboard (PocketBase).The first time when you access
/_/
it will prompt you to create a super-admin account in order to configure various application settings like SMTP, files storage, OAuth2, etc. (see Configurations).
And that's it. By default your settings and db data will be stored in the pb_data
directory next to the executable.
Once done with the configurations, you can create a new user from the PocketBase dashboard or navigate to http://127.0.0.1:8090/
to register as regular user.
In order to send emails you'll have to use either a local SMTP server or an external mail service like Mailjet, MailerSend, Brevo, SendGrid, AWS SES, etc.
Once you've decided on a mail service, you could enable the SMTP settings from your PocketBase Admin UI > Settings > Mail settings page (http://localhost:8090/_/#/settings/mail).
Make sure to update also the "Application URL" field located in Settings > Application.
By default Presentator uses the local filesystem to store uploaded files.
If you have limited disk space and plan to store a lot of files, you can use an external S3 compatible storage.
This could be done from your PocketBase Admin UI > Settings > Files storage page (http://127.0.0.1:8090/_/#/settings/storage
).
Presentator supports various OAuth2 providers - Google, Microsoft, Facebook, GitHub, Gitlab, etc.
OAuth2 providers can be enabled from your PocketBase Admin UI > Settings > Auth providers page (http://127.0.0.1:8090/_/#/settings/auth-providers
).
For OAuth2 redirect url/callback you must use https://yourdomain.com/api/oauth2-redirect
.
Note
By default Presentator users are required to have an email so providers that don't return an email will fail to authenticate.
By default uploaded screen images are limited to ~7MB max. The default should be sufficient for most users but if you need to upload larger screens you can increase the limit from your PocketBase Admin UI:
- Temporary enable the Collections create/edit controls from PocketBase Admin UI > Settings > Application > "Hide collection create and edit controls" toggle (http://127.0.0.1:8090/_/#/settings).
- Navigate to PocketBase Admin UI > Collections > screens > "Edit collection" cogwheel and click on the
file
field options to update the "Max file size" input. - Enable back the "Hide collection create and edit controls" toggle from 1) to prevent accidental schema changes.
To specify a "Terms and Conditions" url, that is referenced during the users registration, you can use the --termsUrl
flag when starting the prebuilt executable:
./presentator serve --termsUrl='https://example.com/terms-and-conditions'
To specify footer links (ex. privacy policies, contacts, etc.), you can use the --footerLinks
flag when starting the prebuilt executable:
# comma separated footer links in the format 'title1|url1, title2|url2, ...'
# (use --help for more details)
./presentator serve --footerLinks='Contacts|https://example.com/contacts'
Note
Support for changing the primary colors, logo, etc. of the Presentator UI will be added in the future once custom PocketBase Admin UI settings are implemented.
Deploying your configured local Presentator to a production environment is the same as deploying a PocketBase application.
For simplicity here is one minimal example how to deploy to a Linux server:
-
Consider the following app directory structure:
presentatordir/ pb_data/ presentator
-
Upload the Presentator executable (make sure that it is suitable for your server architecture) and the
pb_data
directory to your remote server, for example usingrsync
:rsync -avz -e ssh /local/path/to/presentatordir/ root@YOUR_SERVER_IP:/root/pr
-
Start a SSH session with your server:
ssh root@YOUR_SERVER_IP
-
Start the executable and specify a domain name so that the application can automatically issue a Let's encrypt certificate (it will bind to
80
and443
ports):[root@dev ~]$ /root/pr/presentator serve yourdomain.com
-
(Optional) You can skip step 3 and create a Systemd service to allow your application to start/restart on its own. Here is an example service file (usually created in /lib/systemd/system/presentator.service):
[Unit] Description = presentator [Service] Type = simple User = root Group = root LimitNOFILE = 4096 Restart = always RestartSec = 5s StandardOutput = append:/root/pr/errors.log StandardError = append:/root/pr/errors.log ExecStart = /root/pr/presentator serve yourdomain.com [Install] WantedBy = multi-user.target
After that we just have to enable it and start the service using
systemctl
:[root@dev ~]$ systemctl enable presentator.service [root@dev ~]$ systemctl start presentator
If you want to deploy Presentator behind a reverse proxy (nginx, apache, caddy, etc.), please refer to the PocketBase - Going to production docs.
To update the prebuilt Presentator v3 executable it is enough to run ./presentator update
.
The command will create automatically a snapshot/backup of your pb_data
(you can disable this with the --backup=0
flag).
If you use Presentator v2 and want to upgrade to v3, please follow the instructions in presentator/v2tov3migrate.
Because Presentator is based on PocketBase, it can be extended in a similar manner using Go or JS.
Warning
Keep in mind that PocketBase in still in active development and there is no backward guarantee before reaching v1.
To extend with JS, it is enough to create pb_hooks/*.pb.js
file(s) next to your executable and restart the application.
For example, here is a pb_hooks/main.pb.js
hook that will print in the console the comment message after its creation:
// pb_hooks/main.pb.js
/// <reference path="../pb_data/types.d.ts" />
onRecordAfterCreateRequest((e) => {
console.log(e.record.get("message"))
}, "comments");
For more details about the available hooks and methods, please refer to PocketBase - Extend with JS.
Presentator is also distributed as regular Go package allowing you to extend it with custom functionality using the exposed Go APIs.
-
Create a new project directory with
myapp/main.go
file inside it. Here is one minimalmain.go
file with a hook that will print in the console the comment message after its creation:package main import ( "log" "github.com/pocketbase/pocketbase/core" "github.com/presentator/presentator/v3" ) func main() { // see https://pkg.go.dev/github.com/presentator/presentator pr := presentator.New() pr.OnRecordAfterCreateRequest("comments").Add(func(e *core.RecordCreateEvent) error { log.Println(e.Record.GetString("message")) return nil }) if err := pr.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, you can run
CGO_ENABLED=0 go build
and then start the created executable with ``./myapp serve`.
You can also use the prebuilt executable main.go
file as a reference located in base/main.go
.
For more details about the available hooks and methods, please refer to PocketBase - Extend with Go.
Presentator is free and open source project licensed under the BSD 3-Clause License.
Presentator is not a business and it doesn't have any monetization plans. It is developed entirely on volunteer basis mostly by me. Therefore to avoid the project getting too complex and unwieldy, I may not always be open for expanding its scope and I may reject your suggestion if I don't think I'll have the time to develop and maintain the requested feature.
With that said, you could help by:
If you discover a security vulnerability within Presentator or its services, please send an email to support at presentator.io.
All reports will be promptly addressed, and you'll be credited accordingly.