Hacker News new | past | comments | ask | show | jobs | submit login
Show HN: Neko – Self hosted virtual browser that runs in Docker and uses WebRTC (github.com/m1k1o)
227 points by m1k1o 48 days ago | hide | past | favorite | 57 comments

Neko is a fantastic project, I love telling people about it. It does so much more then the title says :)

Being able to watch videos with someone in perfect sync is a great experience. It's not the same to just sync two video elements, but you actually can scroll the page and feels like you are sharing the same screen.

This and https://github.com/giongto35/cloud-morph I think have the chance to really inspire/change the next generation of products that get built in the space.

Seems like you could also use it as an alternative to Twitch where you watched someone play a game, or Picaro.tv which you watch people draw stuff

picarto.tv *

And thanks, I didn't know it

sorry if this sounds dismissive, but I'm curious - how is this different than using google hangouts or facetime or zoom and doing screen sharing?

afaik those don’t let both parties control the mouse. I thought that’s what this does.

I was kinda confused as to what this is, but I think it's meant so you can host a browser as a "server" and have multiple people stream that "browser server"?

When I first clicked I thought it was going to be for programmatic testing of code.

Alternative to having browser (or any app) in a container and accessing its gui using noVNC (or Apache Guacamole). Except, this is done using WebRTC, what makes it perfect for viewing videos + audio of course.

I also find it confusing.

Is this just a docker-compose setup, or did you write the code? I see some go code in there, did you write the WebRTC server stuff yourself? If so, how come it's not published as a normal package which doesn't require docker?

I'm asking because I'm interested in remote desktop solutions, but in many cases I don't want/need docker, so any novel remote desktop utilities are interesting to me.

This repository features all custom writen code. Go backend and Vue frontend. It is publised as a container because of lots of dependencies and the overall environment setup.

Although, I think about publishing the core of it as a package, fully fledged alternative to noVNC. Where X server desktop can be shared using WebRTC technology to a browser.

> Although, I think about publishing the core of it as a package, fully fledged alternative to noVNC. Where X server desktop can be shared using WebRTC technology to a browser.

I think that would be nice! There are a lot of ways to approach this (I've used xpra, vnc, remote X, xrdp...) and there are pros/cons to them all. It might be useful for more people without the docker requirement :)

Hi JeremyNT, you can try this one Open Source Remote Desktop P2P: https://github.com/miroslavpejic85/p2p

What's the bridge for the input? I'm not 100% yet on what this is doing, conceptually I think I got it. Streaming a video broadcast of a browser. But I would think that you need like a websocket to send the mouse coordinates/click/typing over the actual browser. Is that an extension in the browser or is it literally a remote OS kind of deal eg. Teamviewer.

It is using a WebRTC Data Channel. You can send binary/text data over the same connection that is receiving the media.

The other exciting thing about Data Channels is that you can send lossy/unordered messages and get flow control. You can know how much data you can send and how fast. You can build faster and more responsive data APIs that way!

What I'm saying is from the gif (repo README) you see this localhost web thing. I'm aware you can screenshare say from Chrome and show a tab or your whole desktop. In this way you have mouse control/people would just watch your screen. I'm not clear on how they're clicking into that shared browser (to use YouTube).

Normally for this kind of thing you need an OS-level component.

There's something on the GO side but trying to find the bridge on Vue side


idk maybe somewhere in here https://github.com/m1k1o/neko/blob/master/client/src/compone...

I had to deal with this problem too with regard to remote control somehow without installing an OS-level app but that didn't happen went a different route.

Idk this is a cool project, looks like it is possible to do remote control with webrtc. And webrtc as said above can replace websocket for data transfer.


ehh then again:

> On the host side the app must synthesize mouse and keyboard events on the host OS. This is the tricky part, and the only part where a custom native node addon (C++) is required.

Yet another cool project robotjs hmm

It's in a container with xorg running. It doesn't need kernel level access but it does need userland access which it does have access to in the container.

> UserLAnd

Hmm that's cool I was not aware of this thing, not surprising but still cool to find out now.

“userland” is a UNIX term that roughly means “apps” but in ancient sense. UserLAnd is just an app for Android using that word stylized as its name.

oh okay so they're not the same gotcha

Just FYI, Neko is also the name of the VM for the Haxe language:


It's also a 30-year-old X app that draws a cat which chases your cursor.


Obviously less relevant.

> Obviously less relevant.

From the github....

> Why n.eko? > I like cats (Neko is the Japanese word for cat), I'm a weeb/nerd.

Considering neko translates to cat, it may be the most relevant.

Sakura-chan(catgirl skin) chasing my mouse feels offended. She is very energetic and relevant all day.

My first question was whether I could run the cat thing in this.

The JLPT N5 level vocabulary is only yay big, so y'all have to either share, or start using bigger words like kabushikikaisha (stock company), nisankatanso (carbon dioxide) or Kōseirōdōshō (Ministry of Health, Labour and Welfare).

Hi all, after glancing at the comments it seems that a few people are confused about Neko and what its purpose is.

Neko is a self-hosted shared browser, which was built in response to a product called Rabb.it shutting down. Rabb.it had ~4 million MAUs and raised a series B before shutting down due to investors pulling out last-minute during their series C fundraising.

Rabb.it was focused on watch parties. There are a few reasons why shared browsing is more appealing than video sync and screenshare for this use case:

1. Screenshare requires good uplink—some people only have good download speeds

2. Some people are uncomfortable with sharing their screen, nobody likes being judged for their bookmark choices

3. Nobody acts as a "host", control can be passed around to anyone and people can leave whenever they want

In other words, you get the content variety of screenshare, but with the convenience of video sync.

And now for a shameless plug :)

Hyperbeam (formally Tutturu.tv) is a site I built in 2019 for my capstone project at the University of Waterloo. I built it because I wanted an easier way to watch anime with my friends, and decided to build something similar to Rabb.it. It's hosted and free! https://hyperbeam.com


Outside of the points that Scotty made, not everyone has access to a computer, or don't have good enough ones to handle streaming as smoothly. In fact, there are multiple use-cases for this technology, considering it can work as a "cloud browser", either storing information or being completely disposable (as in, the whole browser activity/session/data gets destroyed after usage or on-demand). That said, for what we're used to, a lot of people use it for watch parties so they can share "a bit of the Internet" between friends, family, and even completely strangers!

And I say "we're" because I work on a similar, open-source, "Rabb.it alternative" (or VM-sharing platform, however you prefer to call it): https://cryb.app

That said, that requires self-hosting, so feel free to check out Hyperbeam if fiddling up with configuring Node.js applications and Docker apps is not your thing! But if you wanna give yourself an adventure for this use-case, go ahead :)

Now is all clear, Thanks nice work and keep it up!

https://getmetastream.com/ is an also-FLOSS alternative, instead of a server, it syncs site interactions (e.g. opening up the same video on each person's browser, and then automatically hitting play, seek, etc)

So, pros and cons of each approach

How does this approach handle different internet speeds? Video playback will be out of sync if buffer times differ.

This is great for when you have a corporate laptop and you want to separate your personal browsing session from your work browsing session easily. I also like it because I setup a VPN for the browser and have access to some self-hosted stuff.

It also raises the bar for MiTMs to intercept your session cookies significantly.

you should never have a personal browsing session on a work laptop. DISCOVERY. not even once!

Can you elaborate? Are You saying the session details might be revealed by a law suit? Wouldn’t that be limited to Urls? So not great if those reveal anything but checking your hotmail is not ok?

Or is it about corporate laptops possibly spying by taking screenshots and key logging?

That's exactly what this would solve.


And screen loggers.

And MitM network traffic loggers.

That said, I guess everyone's threat model is different and maybe a remote browser like this solves some problem for them despite those constraints.

Great project, thanks for sharing. Also in this space is Mighty (https://mightyapp.com). I believe streaming GUIs is the future of the web. We are already seeing this take off with cloud gaming like Stadia. Imagine a truly unified auth identity or in memory db that can communicate and share info across unrelated webapps, or browser macros that brings browser automation capability to the end user for their daily surfing. Or, a truly portable web OS that can operate across any device as a fullscreen PWA, complete with FS capability to the underlying Docker box, and access to your files and data across any instance.

"Taking off" and "Stadia" in the same sentence seems... out of touch. Interesting ideas all around, and great engineering challenges. But these things aren't rocketing into the stratosphere of public acceptance and adoption.

Hah, fair enough, didn’t realize it when typing it out but you’re right on Stadia not exactly being a rocket ship. Hey, I use it and enjoy it as a casual gamer.

I just meant we are seeing that type of tech start to pop up with Stadia and Xbox cloud gaming, as the gaming industry being an early adopter of this new web paradigm. I think we will see more industries begin to explore the space and the possibilities there.

The first use case I personally want to see handled is a set of inline browser developer tools that I can access from within a web page, meaning also across any device, without using an additional third party browser or native tooling.

I don't quite understand how this is better than just streaming your desktop? The readme says "author made this because ... his internet could not handle streaming" but this is just streaming the (in-docker) display, no?

But if you share your screen, you need to stream it to the peer. If this solution is already in the cloud on your VPS, meaning you only need to stream video to your computer. You send only small data of mouse/keyboard events.

So if you have better down link than uplink, what is really common with asynchronous digital subscriber lines, this is definitely the better choice.

Probably not your fault, the title of this post saying "Self hosted" isn't clear, I thought it meant "hosted on my PC" instead of being hosted elsewhere...I had the same question until I read readme and thought about it for a moment.

You can also host it on your PC, right? If you install Docker and expose the ports? Or is it not truly self-hosted?

Fair enough! Although personally I would (/used to, 15 years ago) just stream my VPS's screen rather than running a Docker container inside my VPS :)

Wow! So there is the possibility of having remote screen control using the WebRTC for the stream and then other trick for the mouse coordinates and keyboard! I hope to be able to integrate it also in https://github.com/miroslavpejic85/mirotalk that would be great! Thank you so much for sharing! Maybe I can try to do it looking from: https://github.com/maxogden/screencat

Keep it up!

There are no APIs in WebRTC about remote screen control. You can share a screen, but that's it.

Yes, I know that, I mean someone mentioned here screencat, I’m not tried but seems with the addition of robot and electron it is possible I’m searching something to implement it in addition of WebRTC.

This looks really cool! But is there a tool like this that only does the remote browser?

Nowadays, everyone builds their own rabb.it clones. I built mine in 2017 before rabb.it died.

This is really cool.

I used an app called Puffin on iOS in the past and have wanted something similar for the same reasons the author listed.

That’s quite a logo.

Wow, you weren't joking?!

I wonder if there is any real rationale behind it, or if the author simply finds a cat's chocolate starfish particularly amusing?

> I wonder if there is any real rationale behind it, or if the author simply finds a cat's chocolate starfish particularly amusing?

Under "Why n.eko?"

>> I like cats (Neko is the Japanese word for cat), I'm a weeb/nerd.

>> But why the cat butt? Because cats are assholes, but you love them anyways.

I was very happy to see that this was not a cliffhanger.

It's pretty tasteless tbh and makes me definitely not want to use this app or share it with anyone whose opinion of me I care about

Japanese plushies and toys of cats/dogs/others have buttholes all the time lol

First logo I've seen that incorporates a butthole, impressive.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact