Show HN: PocketBase – Open Source realtime backend in one file
github.com
github.com
Each of these is another encouragement to use pocketbase. I went from "eh, I'll just keep my own wrapper" to "pocketbase has a lot of promise, I should try it"
You could think of PocketBase as a lightweight Firebase/Supabase alternative.
In short, it is an open source Go backend (framework and app) consisting of:
- embedded database (SQLite) with realtime subscriptions\
- backed-in files and users management
- convenient Admin dashboard UI
- simple REST-ish API
And all of this compiles to a single portable binary.
It's still a little rough around the edges, but you could give it a try and share your feedback.
It looks like you put a lot of work into this, what was the motivation behind this project? Did you not like the existing solutions available?
You could read more at https://github.com/presentator/presentator/issues/183, but to summarize - I wanted something that could be self hosted with almost no additional setup and no dependency on 3rd party services.
Does it render pages automatically based on Schema? I see your really simple example under examples, and its so minimal I want to think you just get all the tables and render views from that. Am I crazy? If so this is really neat.
Did you ever consider using something like GORM? Because I could see this working with other databases and being extremely useful. I use Django to build really quick CRUD interfaces, but sometimes I need to be able to customize it more, and the admin UI is not as extensible as I would normally want, they even suggest you just build custom pages if its not doing what you need, which is a bummer because Django Admin covers the majority of my use cases.
The admin UI just shows the collections through the web api (https://pocketbase.io/docs/api-collections/).
I actually started with GORM, but its too complex and I ended up replacing it with a simpler query builder package (ozzo-dbx). While the query builder has abstraction for other databases, I'm not planning supporting them at the moment.
Thank you for following up, I did see you had a package for extending the built-in Go package for SQL.
i have no idea what you mean by a "backend". If it's got a "admin dashboard" it's got a UI which means it's got a front-end which means it's not a backend. I'm assuming "go backend" isn't specific to go but just indicating that it's written in go.
it's got a example code block but doesn't explain the point of it. Why would an existing framework with a UI and everything need me to write a `main` method? Why doesn't it have one already? If it doesn't have one why doesn't it. If it does have one why am i not using it? My thinking here is that there are many existing patterns for registering plugins / extended functionality that don't require altering the main method of the thing you're hooking into. Why aren't you using that? Is this maybe intended to be like... a starter template for a Sinatra like thing with a pre-defined set of functionalty? Kind-of like how Django sets up model administration UIs for you?
re your summary here and the site:
i have no idea what "backed-in files" means and I've been doing web-dev for decades.
"convenient Admin dashboard UI" ... to admin / do what?
"simple REST-ish API" a) why "ish" and not actually REST b) ... that let's me do what?
--- in summary.... this looks useful but i don't get what you're actually offering or what it's intended usage scenario is. This is compounded by the fact that you're using a very atypical definition of one word "backend" and a very uncommon term "backed-in files"
Firebase gives me a list of use cases https://firebase.google.com/use-cases and documentation whose left nav gives me a good insight into the high-level functionality it provides "authentication, storage, hosting, security rules, extensions, machine learning, etc"
I think it's safe to assume you don't provide all of those, but i don't know what subset you DO provide. As a result, if i give you the benefit of the doubt, telling me it's a "replacement for firebase" is not meaningful because i don't know what parts it can replace unless it's just the few listed in which case it's absolutely _not_ a replacement.
"Lightweight replacement" also implies missing features, IMO. This project has - at the minimum - authentication, storage and hosting in a single binary that can be self-hosted. This absolutely can replace Firebase for some use-cases (e.g. on my LAN/homelab)
Aside: your tone is weirdly - and needlessly combative. If you see no value in this project to yourself, that is fine, but it appears to be making you angry for some unfathomable reason.
You can also think of them as software like postgrest but with the addition of authentication and other app oriented features, and with a JavaScript client library out if the box.
This program is doing the same thing in a more lightweight way as a single executable using sqlite.
The idea is that by using this type of generic backend software for your database and authentication, you can basically just write the remainder of a typical app or webapp entirely as client side/frontend software, which is something that you can also do with firebase, but this allows you to easily self host it without having to create your own custom backend software.
I guess you could describe it as "CRUD boilerplate" although that could also make it sound like the main purpose is to provide database table/form views like Microsoft Access which isn't really accurate.
It provides a database rest API like PostgREST with authentication so that you can write whatever frontend you want for it.
Since you say that you're familiar with firebase, imagine you're writing an android app using react native or something that uses firebase as the backend to store users' posts (or whatever they are).
The idea is that if you want to self host it instead of using firebase, you just run this type of software on your server and it will provide the basic functions that any client side app would need on the backend: storage for users' data as well as handling accounts.
I don't think it's really that complicated; it's basically just an interlace to a database, but if you look at something like PostgREST that automatically creates a rest api for a database, you would probably think "wow, I could almost create an app just using this as the backend without having to create my own backend, but I would have to handle authentication/registration myself," so these types of platforms just go a little further and handle that as well.
> PocketBase could be used as a standalone app or as a Go framework/toolkit that enables you to build your own custom app specific business logic and still have a single portable executable at the end.
> a Go framework/toolkit that enables you to build your own custom app specific business logic
that definition applies to literally every framework and toolkit. It tells me nothing.
You're quoting selectively in a way that elides meaningful parts of the sentence, and then stating that the description lacks meaning.
Did you intend to say baked-in? Like it's built-in? If so, I feel it's better to just use "built-in" because it's more familiar. The same typo's in the site too and confused me a bit.
I'm doing something along these lines in Go with Postgres, but I'm definitely not as productive as you.
What do you think about Echo? Was it your first choice as a web framework? How in your opinion is better than Gin for example?
Out of curiosity, how much time did you spend building the admin dashboard? Did you have previous experience with Svelte?
One thing I noticed is you are using server sent events for subscriptions. SSE have a lot of nice properties but do have one nasty limitation (from https://developer.mozilla.org/en-US/docs/Web/API/Server-sent...):
"Warning: When not used over HTTP/2, SSE suffers from a limitation to the maximum number of open connections, which can be especially painful when opening multiple tabs, as the limit is per browser and is set to a very low number (6). The issue has been marked as "Won't fix" in Chrome and Firefox. This limit is per browser + domain, which means that you can open 6 SSE connections across all of the tabs to www.example1.com and another 6 SSE connections to www.example2.com (per Stackoverflow). When using HTTP/2, the maximum number of simultaneous HTTP streams is negotiated between the server and the client (defaults to 100)."
This can lead to some weird bug reports from users.
I’m not fully understanding the response - are you saying that the limit is not imposed if you use https? Or am I reading wrong?
The default limit of ~100 connections should be more than enough for most applications (additionally, the JS SDK client maintains a single SSE connection for a page no matter to how many things the user has subscribed, so that also helps).
Best solution today is to move to http2 on your server -- which has an SSL (TLS 1.2) requirement.
Looks like pocketbase implements this. If you use another server, like nginx, you have to enable this for each site.
One feedback which will probably deviate from everything in 1 file concept but adding an option to upload files to an S3 URL will be awesome. Perhaps a pull request ? I am thinking of use cases like document management using this and if I can have the actual files in S3 (or S3 compatible), that would be a huge plus.
EDIT: I spoke too soon. You already have an option for S3 as I tested the demo. Very cool.
How much work went into this btw ? The github, documentation everything is well done. I envy work like this :)
I've started working on the project ~ 3-4 months ago. The last 4 weeks I've taken a longer break from my day-to-day job so that I could finalize the first release.
Or do you want Litestream somehow embedded in the Pocketbase binary so it's part of the "one file" artefact? They're both written in Go, so I guess that could theoretically be possible.
This could allow you to save a CRDT update operation without needing to read the entire CRDT blob into memory, parse it, and then save it all back to disk.
I've worked with CRDT in the past (yjs), but it may not be very useful in PocketBase considering that the application was designed to run on a single server and db writes are practically queued (you can have only one sqlite writer at a time). I'll investigate it further and may consider it for future release.
1 question: are the docs in a repo anywhere? i don’t see them in the main repo (i might just be missing them somehow) or anywhere in the org. if they are public somewhere would you be open to a docs polishing PR?
I didn't bother open source it because it is kinda messy and a little complicated to be edited by users not familiar with the codebase, but I'll try to find some time in the future and may publish it.
In the meantime, if you find typos or think that some of the wording could be improved, feel free to open an issue or discussion in the main repo and I'll fix them.
One thing that I like about my setup though is that there's a clear migration path to horizontally scale. Do you have a recommended way to move past pocketbase should an app get to that point?
Internally, each Collection creates a standard SQLite table that holds the collection records, so migrating the data structure shouldn't be too troublesome. The only thing that may prove difficult to migrate could be reimplementing the access rules and filters.
But in my opinion, when your application reaches that level of growth requiring multiple servers and services, your business use cases mostly likely will have changed several times already from your initial idea.
The whole concept of edge computing - deploying app servers closer to your users for minimal network latency - seems to go hand in hand with using an embedded database like SQLite. (I haven't tried it in production yet, but looking forward to.)
I've tried them out for some dummy projects and they seem pretty great, and they are continually iterating and pushing new features.
I would like to create a multi-platform app for non-technical users where their data is transparently self-contained/self-hosted. So, they open a single binary and it presents them with a UI, and the data created from within the app would be stored in their local PocketBase database. However, I wouldn't want the user to have to start a server directly (they wouldn't know what a server is).
So, I think the binary would have to start both the PocketBase server and a front-end server, and then launch a browser (similar to Electron) pointed to their front-end server's port.
Does this sound like a good approach? What could you recommend to orchestrate this seamlessly to make for a simple user experience when launching the app?
Thank you.
Alternatively a webview-based framework or something like Lorca might be another option if you don't want to use Electron: https://maori.geek.nz/golang-desktop-app-webview-vs-lorca-vs...
I'm not sure that PocketBase would be suitable for your use case, but it is distributed also as a Go package (see https://pocketbase.io/docs/use-as-framework/) and you could combine it with any other GUI Go package (fyne, go-astilectron, etc.)
The feature set is pretty similar, but I focused mainly on the free form/nosql-ish aspect of it, and although I added support for server-side JavaScript middleware I didn't include authentication OOTB (although it could be implemented or you can integrate with an OAuth2 system - it can validate JWT tokens).
And yes, LiteStore's web app hasn't been updated in years and overall your project looks much more polished than mine.
Good job! Bookmarking ;)
All of this extra complexity associated with multi-tiered multi-microservice arch is not needed for many categories of apps, and especially for small teams.
Question: I am currently evaluating Ory/Kratos as authentication backend for a side project. Ory Kratos is a mature and excellent project. However, it has very little documentation when it comes to self-hosting. Further, I also feel like maintaining code that uses it down the line could is going to be problematic given its shear size and complexity.
How do you think Pocketbase compares with Ory Kratos?
The realtime api implementation could be found at https://github.com/pocketbase/pocketbase/blob/master/apis/re...
This looks like a very interesting project and great for some of the small client projects which I currently use Firebase. I'll be sure to take a proper look in the future!
User defined filters for the subscriptions are not supported, but it's a good idea and I may consider it in the future.
Currently the subscriptions are filtered through the collection's list and view rules - they also act as "admin level filters", aka. filters that are always applied and regular users cannot modify (getList user defined filters are only appended to the search query together with the admin defined filters).
Good luck with the project! Seems like you’ve got some good interest :-)
And it would also give me more time to focus on business logic instead of Auth - i will definitely try this in the future.
PocketBase was specifically designed to be self-contained and running only on a single server.
(I'm founder of Thin)
Please also note that PocketBase is designed to be deployed only on a single server, so it cannot scale horizontally out of the box. Supabase/Nhost are better suited for that.
Also props for the dashboard design, looks and works very nice!
Congrats and thanks for sharing.
Would love to hear your pain points with local development. Always looking for feedback so that we may improve your experience.
looks like document database, but how i can create indexes?
As an alternative, you can always create indexes through DB migrations or add the index directly via the `sqlite3` cli.
You can define schema via migrations or through the admin UI (see https://pocketbase.io/docs/manage-collections/).
Dart SDK (targeting mainly Flutter) is also on the way.
Unfortunately I'm not very uptodate with Android (Kotlin) or iOS (Swift) development and therefore community contributions are more than welcomed.
You could always implement your own custom CMS SPA frontend that interacts with the PocketBase API (that is how I'm planning to use it with the next version of my other open source project - Presentator).