[HN Gopher] Supabase - Realtime: Multiplayer Edition
       ___________________________________________________________________
        
       Supabase - Realtime: Multiplayer Edition
        
       Author : samwillis
       Score  : 294 points
       Date   : 2022-08-18 14:45 UTC (8 hours ago)
        
 (HTM) web link (supabase.com)
 (TXT) w3m dump (supabase.com)
        
       | moralestapia wrote:
       | Great day for the backend :D
       | 
       | Cool announcements for Pinecone, PlanetScale and Supabase.
        
       | bebrws wrote:
        
       | kabes wrote:
       | Not directly related to the realtime server. But anybody that
       | tried both Supabase and Hasura and can give their thoughts on how
       | they compare?
        
       | danielvaughn wrote:
       | So I'm just at the tail end of a project where I'm attempting to
       | build a collaborative text editor, and it's been absolute hell. I
       | figured it would be a tricky problem, but I had no idea how far
       | down the rabbit hole goes. I kept thinking, gosh, there's gotta
       | be a backend service that bakes this in, if there isn't it would
       | be a great business opportunity.
       | 
       | I almost want to scrap all of my code and move it to Supabase.
       | Congrats to the team on this launch, very cool.
       | 
       | edit: actually, after thinking it through, I'm not clear on what
       | Supabase is calling multiplayer. Presence is one thing, but when
       | I think multiplayer, I'm thinking conflict resolution. Is this an
       | OT/CRDT implementation? Or is it just presence?
        
         | samwillis wrote:
         | It's broadcast and presence they have released, both building
         | blocks for multiplayer. It's unfortunate that HN rules meant a
         | mods changed the title to the blog posts title. I had gone with
         | a slightly edited (for length) sentence from the second
         | paragraph as I thought it was clearer:
         | 
         |  _... general availability of Realtime 's multiplayer features,
         | Broadcast and Presence._
        
           | upupandup wrote:
           | how does the pricing compare to liveblocks? was really offput
           | by their pricing (charging $0.01 for every time a client
           | connects)
        
             | chasers wrote:
             | Pricing is still tbd unfortunately. Currently every project
             | gets these features with some limitations:
             | 
             | - 25 concurrent channels
             | 
             | - 25 channel joins per second
             | 
             | - 200 concurrent connections
             | 
             | - 100 broadcast messages per second avg over 60 seconds
             | (not including db changes) (aka 6,000 per minute rolling)
             | 
             | I think these are probably pretty close to where we'll land
             | for free projects. They can be changed per project so if
             | you (or anyone) needs a limit increased in the short term
             | we can do that.
        
             | stevenfabre wrote:
             | Hi there,
             | 
             | Im Steven, co-founder of Liveblocks. Thanks for your
             | feedback on pricing. We try to have a fair pricing for
             | everyone and for companies of all sizes.
             | 
             | We're working on a new pricing that will make this much
             | more affordable, even free in most cases.
             | 
             | Would love to get your feedback on that if you're up for
             | it?
             | 
             | Thanks!
        
         | mathgladiator wrote:
         | I haven't documented it yet, but my serverless board game
         | platform supports collaborative text editing. I'm using
         | Codemirror 6 which has a very simple operational transform
         | scheme, and I baked Codemirror's OT scheme into my back-end. It
         | works great, but this was because I had all the realtime stuff
         | sorted out (connection management, multiplexing, etc...)
         | 
         | https://www.adama-platform.com/
        
         | tekacs wrote:
         | One thing that... might be useful depending on what exactly
         | you're building here is https://hocuspocus.dev, which is an
         | incredibly easy to use server for Y.js.
         | 
         | It's written by the team behind https://tiptap.dev, which is an
         | amazing WYSIWYG text editor, but HocusPocus does a great job of
         | syncing state of a variety of WYSIWYG editors out of the box.
         | Getting the server running is a couple of minutes worth of work
         | and scaling it is quite easy.
         | 
         | In addition to editor state, it also has built-in support for
         | 'Awareness' (info on current users), as well as any other Y.js
         | datatype, including other things with a bridge into Y.js.
        
           | zvsmith wrote:
           | +1 for tiptap, and yjs, used both to build
           | https://www.buildmemo.com 's collaborative editor. Did not
           | use hocuspocus but found it trivial to implement our own node
           | ws backend.
        
             | wahnfrieden wrote:
             | Just fyi your page has text headline cutoff issues on
             | iPhone X
        
             | danielvaughn wrote:
             | How are you persisting the data? Are you storing them as
             | ydocs?
        
           | qwertox wrote:
           | Related to this is also an example from ProseMirror (which
           | TipTap uses as the editing component) [0][1]
           | 
           | I'm not completely sure, but I think at ProseMirror they're
           | using Yjs [2] for the collaborative editing part. If not,
           | checking out Yjs is worth it in and of itself.
           | 
           | > Yjs is a CRDT implementation that exposes its internal data
           | structure as shared types. Shared types are common data types
           | like Map or Array with superpowers: changes are automatically
           | distributed to other peers and merged without merge
           | conflicts.
           | 
           | > Yjs is network agnostic (p2p!), supports many existing rich
           | text editors, offline editing, version snapshots, undo/redo
           | and shared cursors. It scales well with an unlimited number
           | of users and is well suited for even large documents.
           | 
           | > Conflict-free replicated data types (CRDT) for
           | collaborative editing are an alternative approach to
           | operational transformation (OT). [3]
           | 
           | OT was what Google Wave was based on and I think current
           | colab editing in Google Docs and other of their office
           | products use this.
           | 
           | [0] https://prosemirror.net/examples/collab/#edit-Example
           | 
           | [1] https://marijnhaverbeke.nl/blog/collaborative-
           | editing.html
           | 
           | [2] https://github.com/yjs/yjs
           | 
           | [3] https://github.com/yjs/yjs#Yjs-CRDT-Algorithm
        
             | jahewson wrote:
             | > I think at ProseMirror they're using Yjs
             | 
             | No, ProseMirror has its own approach to sync.
             | 
             | > OT was what Google Wave was based on and I think current
             | colab editing in Google Docs and other of their office
             | products use this.
             | 
             | Yep.
        
               | samwillis wrote:
               | ProseMirror has its own OT system developed by its lead
               | developer. However the developer behind Yjs has created
               | Yjs bindings for it that are first class!
               | 
               | The team behind TipTap (built on top of ProseMirror),
               | created the Hocuspocus server backend for Yjs and
               | collaborative text editing.
        
           | TranquilMarmot wrote:
           | We use tiptap/hocuspocus at Vowel (https://www.vowel.com/)
           | for our collaborative notes editor. It's really slick!
        
             | jahewson wrote:
             | Ooh I like your product.
        
             | danielvaughn wrote:
             | Very nice. One of my hard requirements is that the data
             | itself has to be persisted as a string.
             | 
             | So I've had to implement a system where a new yDoc is
             | created when the session begins, and then is converted back
             | into a string when the session ends.
             | 
             | Did you have to do anything similar? And if so was it easy
             | with hocuspocus? I wasn't able to get a clear answer from
             | the docs.
        
             | tekacs wrote:
             | Ha, that's good to know -- I've been enjoying using Vowel
             | and was wondering what the in-call notes editor was powered
             | by. Vowel is really slick too -- nice job! :)
        
           | danielvaughn wrote:
           | I'm using TipTap actually, but decided not to go with
           | hocuspocus since it's in beta (at least that's how they
           | position it).
           | 
           | edit: also, I couldn't get a good look at their documentation
           | outside of the paywall, so I have no idea how they implement
           | the backend. It's important, because I need to persist my
           | documents as html strings, not as y docs.
        
             | tekacs wrote:
             | Just so you know, I've used it since the early part of this
             | year and found it to be robust and fully-featured (most
             | functionality comes from Y.js after all), but definitely
             | defer to them on how ready they consider it. :)
        
         | ZeroCool2u wrote:
         | I think what you want is probably https://replicache.dev/
        
           | wahnfrieden wrote:
           | They take rent
        
             | aboodman wrote:
             | We'd like to ensure that Replicache continues to exist and
             | that we can continue to support it. So yeah, we proudly
             | charge for it.
        
               | wahnfrieden wrote:
               | It's just a fact to consider in tradeoffs. There are
               | several economic models that support tool businesses, or
               | returns for investors. Please don't take offense at
               | noting which of those several valid approaches
        
               | aboodman wrote:
               | Not offended. Our team has a long history in open source
               | and have seen both the triumphs and challenges over the
               | years. It's very difficult to build a sustainable client-
               | side open source tool without some other business off to
               | the side that supports it (example: nextjs/vercel).
               | 
               | I like the simplicity and clarity of just directly
               | charging for the valuable thing. Nothing wrong with the
               | other models, they just aren't for us.
        
           | kiwicopple wrote:
           | replicache has a great "Linear" example using Supabase:
           | https://doc.replicache.dev/examples/repliear
        
         | sureglymop wrote:
         | How are you currently building the collaborative features?
         | Using web sockets i imagine, right?
        
           | danielvaughn wrote:
           | yeah, websockets + yjs + y-prosemirror
        
             | kabes wrote:
             | That sounds like a stack that should be up for the job.
             | Used these myself and found making a collaborative editer
             | with those quite a breeze actually. What issues do you have
             | with them? Or did it just take a long time before arriving
             | at that combination?
        
         | cpursley wrote:
         | This is where Erlang/Elixir really shines.
         | 
         | https://elixir-lang.org/blog/2020/11/17/real-time-collaborat...
         | 
         | https://www.youtube.com/watch?v=HTB4mQyMAmg
         | 
         | And supabase uses elixir to listen to database changes and push
         | then over websockets.
        
         | berjin wrote:
         | Fluid Framework looks interesting. Since it's open source you
         | can either use a cloud service (Azure Fluid Relay) or run it on
         | Kubernetes with Routerlicious. https://fluidframework.com/
        
         | kevsim wrote:
         | Definitely feel your pain. We did a full OT implementation for
         | our startup [0] and it was a beast. We based it on Slate.js
         | which has a nice concept of operations that maps nicely to OT,
         | but it was still a lot of work to get it working well (and
         | there are still rough edges we try to improve all of the time).
         | We did base it on Postgres in the backend so really looking
         | forward to what the Supabase team comes up with going forward
         | and seeing if they can help us delete some complex code :-)
         | 
         | Happy to have a chat on collaborative editing anytime if that'd
         | be helpful (email in profile).
         | 
         | 0: https://kitemaker.co
        
         | btown wrote:
         | For a collaborative text editor, you need two things: (1) a
         | full-stack system that maintains a running list of data events
         | such that everyone sees everyone else's events eventually, and
         | (2) frontend code that adapts that set of events, along with
         | your text cursor position and current changes, into a cohesive
         | view of a document at any moment in time.
         | 
         | Supabase and Replicache can absolutely help with (1). But for
         | (2) you will need OT or CRDT.
         | 
         | https://docs.yjs.dev/getting-started/a-collaborative-editor is
         | a good place to start - it uses Quill and CRDTs for (2) and can
         | have a persistence layer built in (or custom written, to work
         | on top of Supabase etc.) for (1).
        
           | eduardosalaz wrote:
           | Quill Deltas are a very interesting concept, I used Quill
           | myself along with Supabase for realtime sharing (not
           | collaboration) of text and it was almost a breeze.
        
           | aboodman wrote:
           | Several teams use yjs on top of Replicache, it's a real easy
           | match.
        
       | didip wrote:
       | It seems like Elixir is the language of choice for building a
       | large scale real time solution, then?
        
       | tlarkworthy wrote:
       | What happens over an unreliable network connection such as
       | mobile?
        
         | wenbo wrote:
         | Wen Bo from the Supabase Realtime team here!
         | 
         | Client will seek to continuously reconnect to the WebSocket
         | when there's a connection issue and server must receive at
         | least one heartbeat in a 60 second window; otherwise it will
         | clean up the WebSocket connection.
         | 
         | We built Supabase Realtime on top of Phoenix Channel, and along
         | with our clients, handles unreliable network connections
         | gracefully, including on mobile.
        
           | tlarkworthy wrote:
           | So you will lose messages.
           | 
           | "Phoenix uses an at-most-once strategy when sending messages
           | to clients. If the client is offline and misses the message,
           | Phoenix won't resend it. Phoenix doesn't persist messages on
           | the server. If the server restarts, unsent messages will be
           | gone. If our application needs stronger guarantees around
           | message delivery, we'll need to write that code ourselves.
           | Common approaches involve persisting messages on the server
           | and having clients request missing messages. For an example,
           | see Chris McCord's Phoenix training: client code and server
           | code."
           | 
           | https://hexdocs.pm/phoenix/channels.html
           | 
           | It will be impossible to build a reliable mobile experience
           | on top of such shaky foundations.
        
             | wenbo wrote:
             | > So you will lose messages.
             | 
             | This is true but you can store your messages inside your
             | database and on reconnect you can fetch the messages you
             | missed.
        
               | tlarkworthy wrote:
               | you need a queue to do that properly, do your users have
               | to manage that queue?
        
               | wenbo wrote:
               | Yes, developers will have to do this themselves for now.
        
         | wenbo wrote:
         | I see that you worked on Firebase's Realtime database back in
         | the day. How did your team handle such cases?
        
           | tlarkworthy wrote:
           | queues either end. Clients are given a session ID, server
           | (and client) replays missing messages on reconnect. It's the
           | only way to achieve causal consistency, which is what you
           | need for a sane programming model
           | 
           | https://observablehq.com/@tomlarkworthy/redis-backend-1
        
             | wenbo wrote:
             | Thanks, will take a look at your article!
        
       | jayd16 wrote:
       | Is server authroity and broadcast permissions handled or left as
       | a task for the user? Can channels be locked down to a list of
       | users? Can users be kicked from a channel? Is message
       | spam/flooding/DDOSing users in a channel protected?
       | 
       | Quickly skimming the docs, I don't see any examples of this.
       | 
       | Server authority and some of this security can be added app level
       | but I think the message throttling needs to be built in if its
       | going to support any kind of pvp/untrusted peer scenario.
       | 
       | Anyone know the story there?
        
         | wenbo wrote:
         | > Is server authroity and broadcast permissions handled or left
         | as a task for the user? Can channels be locked down to a list
         | of users?
         | 
         | Broadcast permissions is currently not handled by the server
         | and left to the developer to implement. We have discussed this
         | internally and will prioritize Broadcast authorization
         | accordingly because we've gotten feedback about this from a
         | number of developers.
         | 
         | > Can users be kicked from a channel?
         | 
         | Not at the moment but again we've gotten feedback about this as
         | well and will prioritize it.
         | 
         | > Is message spam/flooding/DDOSing users in a channel
         | protected?
         | 
         | We have built rate limiting and other protections so bad actors
         | don't affect the good in the cluster. A colleague of mine
         | posted these limitations of Supabase Realtime to prevent abuse:
         | https://news.ycombinator.com/item?id=32511586.
        
       | majestic5762 wrote:
       | I've been watching Supabase for a long time and wanted to try it
       | out. I had the chance to use it in a couple of projects that I
       | started, but I feared it will cause me problems down the road,
       | and eventually I decided to build the backend services myself.
       | I'm comfortable with NestJS which is not supported in Deno, and I
       | felt that my productivity would've been harmed if I picked up
       | Supabase. But definitely I have to build up confidence by
       | starting a personal project. Is there anyone who uses Supabase in
       | production? Do you have any feedback?
        
         | abcdjdjd wrote:
         | I don't get the advantage of using supabase or things like it.
         | It feels like you are basically relying on a third party to do
         | the work for you and you are paying them to do it.
         | 
         | Doesn't seem portable at all. If you make your own code, you
         | can move it wherever you want in whatever system you want. It
         | seems like if you use this product, it will get you stuck in
         | that environment and if you need to upgrade, then you are going
         | to have to do the work later on anyways.
         | 
         | What exactly is so great about this product? I'm not saying its
         | bad, I'm just not fully understanding the advantages of using
         | it?
         | 
         | Why would someone want to use this over something like a
         | framework for the backend (that is free) and a database they
         | want and then host it wherever they want? I don't really get
         | why someone who knows how to code would want to pay extra money
         | to build a backend.
        
       | erulabs wrote:
       | Congrats to the Supabase team! Presence in general is a problem
       | I'm tired of solving - so this will be a nice replacement for in-
       | house solutions!
        
       | krzyk wrote:
       | What is supabase? The page doesn't have description that is
       | easily accessible from mobile.
       | 
       | All I know is that it has a real time server and multiplayer.
       | Sounds like a game.
        
         | kiwicopple wrote:
         | From our homepage:
         | 
         | > Supabase is an open source Firebase alternative. Start your
         | project with a Postgres Database, Authentication, instant APIs,
         | Realtime subscriptions and Storage.
         | 
         | Our docs give details about the architecture for each project:
         | https://supabase.com/docs/architecture
        
       | rosmax_1337 wrote:
       | This is intresting. I've been thinking about using the web for
       | more multiplayer games for a while, and a tool like this is more
       | or less exactly what I'm looking for. Noone wants to make
       | netcode.
       | 
       | (Comment also acts as a bookmark) :)
        
         | shakezula wrote:
         | multiplayer web is at a cool spot right now. I'm writing an app
         | in graphQL / Go and it's been awesome for real-time player
         | experiences.
        
         | kolanos wrote:
         | There's a "favorite" link you can use above to bookmark.
        
       | samwillis wrote:
       | This is really neat, I have been keeping an eye on Supabase, this
       | (presence) is the feature that will finally push me to build a
       | side project with it. I have one in mind.
       | 
       | Anyone from Supabase here, do you have any plans to build in
       | support for CRDT toolkits such as Yjs or AutoMerge for these
       | features? It would make working with them so much easer if there
       | was a plug and play backend.
       | 
       | The one other thing I would love to see next from them is an
       | offline sync product, so you could partially sync a users dataset
       | to their device and save back any changes later (bonus points for
       | then combing that with CRDTs). Maybe the WASM Postgres yesterday
       | [0] could be a foundation for such a product.
       | 
       | https://news.ycombinator.com/item?id=32498435
        
         | Xeoncross wrote:
         | Agree, I would love to see CRDT (or related) multiplayer
         | resolution as that's a big time sink for a lot of new
         | collaboration product ideas around dashboards, documents,
         | spreadsheets, online games, mindmaps, and flows (like figma).
        
         | danielvaughn wrote:
         | Yeah this actually confused me a bit - at first I thought
         | "multiplayer" meant CRDT, but now I'm not sure. I got really
         | excited there for a bit, lol.
        
         | kiwicopple wrote:
         | > CRDT
         | 
         | It's definitely something we'll support (we mention it briefly
         | in the blog post). We'll extend this service so that it works
         | well with WebRTC, and we have a few ideas for making it easy
         | for development.
         | 
         | > Maybe the WASM Postgres yesterday
         | 
         | This was mind-blowing! Very cool what the crunchy team have
         | done there. It would be awesome to replicate from a remote
         | Postgres database to a "per-user" database to the browser. I
         | think WASM support needs to improve before it can become
         | generally useful for offline-sync, but the tech seems withing
         | reach.
         | 
         | We're working on various ideas for offline-sync, but the
         | Realtime server will be central to whatever implementation we
         | land on.
        
           | samwillis wrote:
           | Both of those sound super exiting!
           | 
           | I previously experimented with building an offline syncing
           | CRDT db using Pouch/CouchDB and combining it with Yjs for
           | automatic conflict resolution. But Postgres would be so much
           | better as the foundation. If only I had time it is something
           | I would love to work on...
        
             | kiwicopple wrote:
             | perhaps we can help you find some time (contact details are
             | in my profile)
        
           | pcthrowaway wrote:
           | Any idea if Realtime might support Postgres streaming
           | replication in the future? We were incredibly excited to use
           | Realtime with TimescaleDB, but couldn't get it working.
           | 
           | I assumed it was related to
           | https://docs.timescale.com/timescaledb/latest/how-to-
           | guides/... (even though we were only running it single-node,
           | my understanding is that Realtime works by tapping into the
           | replication feed)
        
             | kiwicopple wrote:
             | Realtime uses logical replication, and from your link it
             | looks like it should work with Timescale (although not
             | recommended):
             | 
             | > Using logical replication with TimescaleDB is not
             | recommended, as it requires schema synchronization between
             | the primary and replica nodes and replicating partition
             | root tables, which are not currently supported.
             | 
             | As long as logical replication is supported, this won't be
             | an issue for Realtime because the purpose is to receive
             | data changes (which come in a JSON format) and the end-user
             | doesn't need to persist schema modifications.
             | 
             | > but couldn't get it working
             | 
             | If you send me some error logs, I can take a look or
             | forward to one of the team.
             | 
             | > support Postgres streaming replication
             | 
             | This is the first time I've heard it requested - I don't
             | think it's something we'd do unless there was a good reason
             | and strong demand. If we were to do any work in this
             | direction we'd prefer to try contribute DDL streaming to
             | PostgreSQL's logical streaming. We've been thinking about
             | this for a while (Michel has built metagration -
             | https://github.com/michelp/metagration which has prompted a
             | few ideas for core patches)
        
               | pcthrowaway wrote:
               | > If you send me some error logs, I can take a look or
               | forward to one of the team.
               | 
               | I really appreciate the offer. I don't have the logs
               | handy unfortunately and haven't been interacting with the
               | Timescale instance in a few months. If I move back to
               | that side of things I most definitely will take you up on
               | that.
               | 
               | For what it's worth, I don't think the error was in
               | running or connecting to Realtime; rather, I think what
               | happened is there were duplicate, missing, or truncated
               | messages. Thinking on it some more, I think TimescaleDB
               | is using multiple tables under the hood for the tables
               | they expose. Unfortunately, it's out of my depth of
               | Postgres knowledge right now, so I can't tell you more
        
           | lagrange77 wrote:
           | > We're working on various ideas for offline-sync, but the
           | Realtime server will be central to whatever implementation we
           | land on.
           | 
           | Are you also working on optimistic updates (which may be
           | related to offline-sync)?
        
             | kiwicopple wrote:
             | I should have been more clear - when I say "working on", it
             | means "debating internally what would be the best long-term
             | strategy" (from a technical POV).
             | 
             | But yes, optimistic updates is one of the requirements. In
             | the meantime, if you need something great, I can recommend
             | Replicache and WatermelonDB - both are excellent.
        
               | lagrange77 wrote:
               | > Replicache and WatermelonDB - both are excellent.
               | 
               | Nice, thank you.
        
       | kiwicopple wrote:
       | hey hn, supabase ceo here
       | 
       | we're excited about this release - it adds a few neat features to
       | our Realtime server[0]. For those who don't read the post (it's
       | quite long), our Realtime server was initially built for
       | subscribing to Postgres changes via websockets. We've added
       | Broadcast functionality (for "ephemeral" messages that don't need
       | to be persisted to Postgres) and Presence (similar to Broadcasts,
       | but it retains an eventually-consistent state between users).
       | 
       | We were planning a larger write-up with all the technical details
       | but it became a bit long. Some highlights:
       | 
       | - Realtime is built with Elixir an Phoenix[1]
       | 
       | - We've moved to a single, global cluster - We're using
       | `Phoenix.Tracker` to globally distribute the Erlang PIDs of all
       | of our Postgres connections. This guarantees there is only a
       | single connection to each database.
       | 
       | - We've implemented a "leaky-bucket" rate-limiter using Erlang's
       | `:counters` module[3] for "per tenant" rate-limiting. We'll move
       | this to a global rate-limiter in the future
       | 
       | - We're currently seeing ~2000 concurrent connected users - it
       | will be interesting to see what this spikes up to now that this
       | is on HN
       | 
       | It's still in heavy development, and we'll make sure to detail
       | all the choices we take as we continue solve problems. A few of
       | the Realtime team will be here answer questions - @chasers,
       | @wenbo, @abc3erl.
       | 
       | [0] Realtime: https://github.com/supabase/realtime
       | 
       | [1] Phoenix Framework: https://www.phoenixframework.org/
       | 
       | [2] rate limiter: https://en.wikipedia.org/wiki/Leaky_bucket
       | 
       | [3] :counters: https://www.erlang.org/doc/man/counters.html
        
         | fintechjock wrote:
         | I have almost zero coding experience. Seriously, I've read a
         | couple of books and I've taken a couple of MOOCs and that is
         | about it. I've never 'launched' any project of my own, and I
         | have zero front-end or back-end experience.
         | 
         | I say that because I just used Supabase for the first time, and
         | I was able to build and launch the Slack clone in ~15 minutes.
         | Seriously cool. Thank you for sharing
        
           | kiwicopple wrote:
           | That's awesome. I've shared your comment with the team - they
           | will really enjoy your feedback. Good luck building
        
         | pixelbyindex wrote:
         | Hi Supabase & Team
         | 
         | What are the chances of an official C# library being in the
         | works? I think this would greatly fill the needs for unity
         | devs. I use firebase on almost all game backends because of how
         | quickly I can get set up with auth and a db.
         | 
         | I used supabase in my latest project and it served my needs but
         | there were a few difficulties to overcome. The greatest
         | shortcoming was the lack of real time support (C#), and I had
         | to do everything via REST api.
         | 
         | I am planning on publishing the game as OSS and making some
         | learning videos about it
        
           | kiwicopple wrote:
           | They're unofficial, but @acupofjose has been working hard on
           | some community C# libraries:
           | 
           | https://github.com/supabase-community/#client-libraries
           | 
           | They won't support the functionality we outline in our blog
           | post yet (we are still figuring it out on our official JS
           | libraries), but I'll send him your message.
           | 
           | As an aside, if anyone is reading this and wants to help
           | maintain the C# libraries, please reach out.
           | 
           | [0] acupofjose: https://github.com/orgs/supabase-
           | community/people/acupofjose
        
         | guykdm wrote:
         | Hey Kiwi, any chance of getting temporal.io style features for
         | supabase edge functions? would love to have a one-stop-shop
         | solution for all my real and not-real time needs.
        
           | kiwicopple wrote:
           | (I'm assuming you want a queue/workflow engine)
           | 
           | Temporal has done an incredible job of ensuring there will be
           | no side-effects (even with external systems), so I doubt
           | we'll be able to do something as extensive as they have. That
           | said, we will probably build a simple Postgres queue/workflow
           | engine (similar to pgboss[0]). It will live in the Postgres
           | database (as an extension), but will be nicely integrated
           | with Edge Functions. We haven't started this yet, so I don't
           | have any timelines.
           | 
           | [0] pgboss: https://github.com/timgit/pg-boss
        
             | joisig wrote:
             | Take a look at Oban, it very well might fit the bill.
             | 
             | https://github.com/sorentwo/oban
        
               | kiwicopple wrote:
               | we used Oban for a very early product (which we put on
               | ice) called Supabase Workflows:
               | https://supabase.com/blog/supabase-workflows
               | 
               | The reason we paused it was the realisation that it's far
               | more powerful to co-locate this sort of product with the
               | data. In this case, Workflows would be more powerful as a
               | Postgres extension - you can store the workflows into
               | your database, create them using SQL, and the workflows
               | would have direct access to your operational data. We'll
               | probably re-write this using pgx[0] at some stage (if
               | anyone is reading this and wants to attempt this, please
               | reach out).
               | 
               | [0] pgx: https://github.com/tcdi/pgx
        
         | samokhvalov wrote:
         | It would be great to see monitoring of this thing under load -
         | I mean the Postgres part of it, how it's loaded, how many
         | connections used, query analysis, etc.
        
           | kiwicopple wrote:
           | cool - we can include that in the next blog post
        
         | cpursley wrote:
         | Any chance of open sourcing the rate limiter bit for Elixir?
        
           | chasers wrote:
           | Yeah I plan to. Have some things to prep next week for
           | ElixirConf but am going to get back to it after that.
        
           | maxloh wrote:
           | Isn't it open source? https://github.com/supabase/realtime
        
             | cpursley wrote:
             | As a stand-alone Elixir package.
        
         | timwis wrote:
         | Really exciting! I've been checking your blog every couple
         | weeks waiting for this release.
         | 
         | Does the global cluster architecture make it much harder to
         | self-host supabase? Not that I plan to, but having the promise
         | of portability is really important.
        
         | ForrestN wrote:
         | Love to see Barbz running/naming cool things!! Why be simple
         | when you could be stunning???
        
         | tandyman wrote:
         | LOVE Supabase. Building a project over the last several months
         | for a client and very excited to launch the beta soon. Thanks
         | for all you are doing...very exciting stuff.
         | 
         | Creating dev and staging environments is a feature that I am
         | most looking forward to. Hopefully that is on the road map.
        
         | jahewson wrote:
         | Given that Phoenix.Tracker is eventually consistent, how does
         | it guarantee that there's only one Postgres connection?
        
           | chasers wrote:
           | Yeah the database ultimately guarantees that. This lets us
           | distribute the fact that a connection exists (in the form of
           | a PID) so that we don't have to go back to the db on every
           | connection request. This helps quite a bit in the case of a
           | lot of connections coming in very quickly, especially when
           | those connections are geographically far from the database or
           | the database is under load from some other system.
           | 
           | If no connection exists yet, you're right, two connections
           | could try to establish themselves at the same time. In which
           | case, whoever gets to the db first wins. But then the loser
           | is still connected to PubSub, so they'll now start getting
           | changes just the same.
        
       | wiradikusuma wrote:
       | Why would I use Supabase instead of Firebase since the latter is
       | more mature and has richer ecosystem?
       | 
       | [v] Can host myself
       | 
       | [v] Can access from China (since Firebase is blocked)
       | 
       | [v] ...anything else?
       | 
       | (Btw they should put this in FAQ or something)
        
         | jitl wrote:
         | Postgres is more mature than Firebase
        
           | digianarchist wrote:
           | Firebase doesn't even have good search support and it's a
           | Google product...
        
             | gitgud wrote:
             | That has always annoyed me, the one thing that _isn 't_
             | integrated into Firebase...
        
         | wenbo wrote:
         | Wen Bo from the Supabase Realtime here!
         | 
         | Also, every single person on the Supabase team actively does
         | support so if you would like world class support than look no
         | further!
        
         | burggraf wrote:
         | Supabase developer here. Coming from Firebase myself, the
         | biggest driver for me can be summed up with: relational data.
         | PostgreSQL rocks.
        
       | mh- wrote:
       | In case someone from Supabase sees this: there's something weird
       | with the blog layout on iPhone. It goes really narrow. Main site
       | renders fine.
        
         | kiwicopple wrote:
         | thanks - fix going out now
        
         | prox wrote:
         | Also there is no page on what Supabase is, flicking through a
         | few pages I still have no idea!
        
           | samwillis wrote:
           | At the top their homepage (which admittedly doesn't have a
           | link to it other than the logo):
           | 
           | > Supabase is an open source Firebase alternative. Start your
           | project with a Postgres Database, Authentication, instant
           | APIs, Realtime subscriptions and Storage.
           | 
           | https://supabase.com/
        
             | prox wrote:
             | Ah gotcha, not really obvious.
        
           | [deleted]
        
         | samwillis wrote:
         | It's the embedded YouTube live video at the bottom of the post
         | throwing the layout off.
        
           | mildmustard wrote:
           | Fixed :) thanks
        
       | tiborsaas wrote:
       | The demo page is broken on mobile: https://imgur.com/a/BoLErlH
       | 
       | Android 11 | Chrome 104
        
         | wenbo wrote:
         | Thanks, the demo isn't mobile responsive quite yet.
        
       | tsycho wrote:
       | Are you planning to provide native iOS/Android APIs? Any ETA if
       | yes?
        
         | kiwicopple wrote:
         | Yes, we are - but no ETA yet (sorry, we've been focused on the
         | infrastructure).
         | 
         | There are some community-developed libraries here:
         | https://github.com/supabase-community. We sponsor developers to
         | maintain these - at some point we'll hire someone to work full-
         | time on these (and we'll start with iOS/Android)
        
       | nabakin wrote:
       | multiplayer.dev character limit is client-side fyi. Chat messages
       | are encoded into HTML Entities so thankfully XSS doesn't seem
       | possible
        
         | wenbo wrote:
         | Wen Bo from the Supabase Realtime team!
         | 
         | Just want to confirm that we did put in place a client-side
         | character limit.
        
       | sidcool wrote:
       | One author of the post has title of engineering while the other
       | has title of engineers. Typo?
        
         | kiwicopple wrote:
         | thanks - fixed: https://github.com/supabase/supabase/pull/8492
        
       | alberth wrote:
       | Am I wrong in understanding that some of these capabilities
       | sounds similar to what mnesia offers?
       | 
       | https://www.erlang.org/doc/man/mnesia.html
        
       | fsiefken wrote:
       | I'm probably not the only one who thought this was about Supaplex
       | https://supaplex.me/ - .a popular extended boulderdash clone -
       | because of the term 'Multiplayer' before clicking the link. For
       | those who didn't know, the dos game is now freeware and there is
       | a reverse engineered open source multi-platform port. There is no
       | multiplayer mod, yet.
        
       | gavi wrote:
       | I built backend for my typing app using supabase with row level
       | security(RLS) and OAuth providers to track.
       | 
       | https://typingkit.com
       | 
       | Supabase + SvelteKit + Cloudflare
        
       | cpursley wrote:
       | It sounds like Supabase is pulling out the WAL listening bits
       | into its own library?
       | 
       | https://supabase.com/blog/supabase-realtime-multiplayer-gene...
       | 
       | If so, y'all might want to look into: https://github.com/elixir-
       | ecto/postgrex/blob/master/lib/post...
        
         | wenbo wrote:
         | Wen Bo from the Supabase Realtime team here!
         | 
         | We actually use https://github.com/supabase/walrus to get the
         | database changes and we're planning on moving to a Rust worker
         | (https://github.com/supabase/walrus/tree/worker/worker) for
         | better performance especially in the RLS-enabled use case.
         | 
         | I promised Jose that I would check out
         | Postgrex.ReplicationConnection and we might add it in to our
         | Supabase Realtime some time in the future.
        
         | kiwicopple wrote:
         | The database listener in this version of Realtime uses Postgrex
         | - it's great
        
           | cpursley wrote:
           | Super! Y'all are doing amazing things.
           | 
           | Where can I see that in the code? Or is not quite out yet?
        
             | wenbo wrote:
             | We started developing Realtime: Multiplayer version many
             | months ago in a private repo just to experiment with
             | Phoenix's Broadcast and Presence and over time we just
             | added to it.
             | 
             | We plan to move all the code over to
             | https://github.com/supabase/realtime in the next couple of
             | weeks and you'll be able to see the code in its entirety.
        
       | squeaky-clean wrote:
       | FYI multiplayer.dev breaks the browser back button. At least on
       | mobile safari. Is that a glitch in that demo specifically? Or is
       | it a supabase realtime glitch?
        
         | kiwicopple wrote:
         | I imagine it's a glitch caused by the way the demo "redirects"
         | a user to a room. Probably you hit back and then get redirected
         | again. Sorry about that - it's not intentional. I'll let the
         | team know.
        
         | wenbo wrote:
         | Wen Bo from the Realtime team here!
         | 
         | That back button glitch is specific to the demo. We had to do a
         | few redirects based on Presence sync and load balancing each
         | room. I'm sure there's a better way of doing it and will seek
         | to improve it when I update it. Sorry about that!
        
           | squeaky-clean wrote:
           | No worries, figured I'd mention it. Those redirect flows are
           | really tricky.
        
       | mmastrac wrote:
       | What's the difference between Supabase open-source and the paid
       | versions? Is that just around hosting?
       | 
       | EDIT: Googling around yields a somewhat hostile discussion from
       | last year: https://news.ycombinator.com/item?id=26637360
       | 
       | ... but it looks like you _can_ self-host?
       | https://supabase.com/docs/guides/hosting/docker
        
         | kiwicopple wrote:
         | Yes, you can self host and everything is open source (including
         | the Dashboard[0]). Everything is either MIT, Apache2, or
         | PostgreSQL licensed.
         | 
         | > difference between Supabase open-source and the paid versions
         | 
         | On the paid version we handle some of additional database
         | management (like daily backups, PITR, etc). These are
         | technically available for self-hosting too, because the
         | database is just a Postgres database, but I point it out here
         | because it's not something you'll get "out of the box" from the
         | Docker setup.
         | 
         | Our philosophy with open source is "offer everything" and then
         | charge for usage. There aren't any features completely gated.
         | Our Enterprise plan just adds additional SLAs and support
         | packages for our cloud platform.
         | 
         | In addition to the self-hosting docs you've linked, in our
         | GitHub you can find the Docker files[0] and some community-
         | developed self-hosting strategies [2]
         | 
         | [0]https://supabase.com/blog/supabase-studio
         | 
         | [1] docker:
         | https://github.com/supabase/supabase/tree/master/docker
         | 
         | [2] community: https://github.com/supabase-community/#self-
         | hosting
        
           | mmastrac wrote:
           | Thanks, those docs seem pretty clear!
        
           | atonse wrote:
           | Didn't realize open source wasn't hobbled at all. Always
           | assumed it would be missing features.
           | 
           | Definitely trying you guys out now.
        
       ___________________________________________________________________
       (page generated 2022-08-18 23:00 UTC)