Hacker News new | past | comments | ask | show | jobs | submit login
Linux sandboxing improvements in Firefox 57 (morbo.org)
276 points by rvern on Nov 11, 2017 | hide | past | favorite | 102 comments



I'm so hyped by Firefox 57, haven't felt like that about a webbrowser since Firefox 1.5


I hope it picks up momentum among the broader public - while it can feel like the entirity of HN is on Firefox Nightly, there's a much larger leap to be made in overturning the broadly held 'common sense' view that Chrome is the superior browser.

I don't doubt that such a sea change in public consensus is possible - it happened several years ago with the surge of Chrome in about 2010 [1]. Chrome was markedly quicker than the competition in its day, but I believe that Firefox 57 makes at least as big a performance leap in day-to-day usage over its rivals as Chrome did when it came to prominence. For much of the last ten years, Chrome has been the go-to browser for the tech-saavy user - Firefox is now as well placed as it could ever be to reclaim that crown.

[1] https://commons.wikimedia.org/wiki/File:Browser_usage_share,...


I guess I was one of the Firefox holdouts for years now. After Chrome came out and the adblocker on it was more than useless (I used it since day 1 of public release) I ditched it for Firefox and never looked back. I only kept Chrome for web development to test across different browsers, or to open a new "session" in another browser. Now that Firefox has containers I really don't care for Chrome in that respect though. I'm glad Mozilla is doing things to put themselves back on the spotlight, they've done some great work over the years.


I thought I was the only person who never stopped using Firefox.


I primarily use Chrome just for the reason that it has better UI than Firefox on Linux. The developer tools on Firefox is too ugly, they definitely need a more compact design.


Firefox 57 has a new UI ("Photon") that you might like, and the DevTools are seeing significant UI/UX work during their rewrite from XUL to HTML (https://github.com/devtools-html/).

You can see some mockups on Victoria Wang's Twitter: https://twitter.com/violasong/status/926189788486557697


Anyone got a rough ETA for when the CSD stuff will make it into main? (or any other hack to hide title bar in MATE/xfce once hidecaptiontitelbarplus addon breaks? sorry to beat dead-horse topic)

http://www.omgubuntu.co.uk/2017/08/firefox-client-side-decor...


Looks like it's going to be available in Firefox 58 behind a pref: https://bugzilla.mozilla.org/show_bug.cgi?id=1415481


Already in Firefox 57 on Fedora 27


Tried installing the nightly CSD build from flatpak and made sure flags were on in about:config. Still a title bar in Ubuntu MATE 16.04 :/


I actually much prefer the 57 UI options. I use the dark theme and it conserves more space than the tabs with chrome.

The icon indicators also are really nice. At this point the only reason I use Chrome is b/c of Google Meet (which doesn’t support Firefox).

The only thing I wish was better in the beta is battery life/usage. Safari is still king in terms of its effect on you battery.

Edit: to be clear I use Firefox beta on Linux and macOS regularly.


Really? I find chrome’s developer tools very ugly though, with bright and garish colors. Firefox’s is much nicer in my opinion. But the nicest-looking devtools is still Safari’s, even though it is also the slowest, buggiest, and had the least features.


Why, with the ability to write powerful extensions removed it is basically a second Chrome now.

I think WebExtensions were a good idea, but removing the raw access is removing what made Firefox great in the first place. Hopefully they will add an escape hatch in a future release but I'm not holding my breath. I wonder how long staying on nightly will allow "legacy" extensions.

But sure, a bit of performance is nice I guess.


WebExtension Experiments are effectively that escape hatch. They have more or less the same access to the internal APIs as legacy add-ons, with the only restriction being that you can only install them on Nightly and Developer Edition.

The intent is to have a way to prototype new WebExtension APIs (like hiding individual tabs, or the entire tab bar, or new theme APIs), but there's no requirement that they ever get merged upstream. You're welcome to build and distribute your own for whatever purpose you might want.

https://webextensions-experiments.readthedocs.io/en/latest/


I hate WebExtensions, but Mozilla has at least demonstrated a commitment to improve and expand that API instead of letting it rot like Google has. They seem to be adding essential features to it so I think most of the good extensions will be possible within a few releases.

I still wish they hadn't crammed it down our throats before it was ready, though. Jetpack extensions worked fine.


They unfortunately sort of had to rush it. They needed to deprecate legacy extensions, because the majority of those are multiprocess-incompatible and they needed multiprocess to stop the bleeding of users.

It's really quite visible, multiprocess was rolled out in Firefox 48 on the 2nd August 2016: https://www.netmarketshare.com/report.aspx?qprid=1&qpaf=&qpc...


> Why, with the ability to write powerful extensions removed it is basically a second Chrome now.

No. Firefox's WebExtensions API already offers more than Chrome's does (see webRequest as an example: https://developer.mozilla.org/en-US/Add-ons/WebExtensions/AP...) and more APIs will be added over time to enable more features.


While I'm glad they are offering more APIs there will always be a difference between what they decide to offer and basically everything.


The old model is a security mess. Even WebExtensions doesn't seem immune to security issues:

https://palant.de/2017/11/11/on-web-extensions-shortcomings-...


If course it was. But there a couple of addons (for me just VimFX) that are going to require full control anyways.

Also it seems to not have done much as basically every extension just asks for full access to every page, but I guess that some don't is an improvement.


Most legacy extensions should already be broken on Nightly, are they not?

They've refactored tons of code under the hood, basically all the changes that they've wanted to do for years but couldn't do, because it would have broken too many extensions over and over.

We're also talking about all the performance improvements that were made since Firefox 48. The majority of legacy extensions are not multiprocess-compatible and they would not have rolled out multiprocess in 48, if they wouldn't have known those multiprocess-incompatible extensions to be deprecated now with 57. Otherwise AMO would have basically been reverse Russian Roulette, where only roughly 1 out of 6 extensions will not kill your performance.


> Most legacy extensions should already be broken on Nightly, are they not?

Yes, a lot would be. However if they could still be used many of them would have been fixed by now.

> The majority of legacy extensions are not multiprocess-compatible

Yet many are.

My point is basically that I would like if FF supported the legacy "API" and left the community to manage fixing things that were broken. I would take this work over not being able to have some extensions any day.


I can understand your point of view, but I do think it is very much necessary to cut things off completely.

Otherwise you'd have tons of extensions that could be rewritten as WebExtensions but aren't, because it's less work in the short-term to just fix them for the XUL changes. In the long-term, however, it would be a lot more work, especially if Mozilla starts recklessly breaking things.

Similarly, many unmaintained extensions will disappear and WebExtensions will be written to replace them. Those will almost certainly have better quality and performance. Shouldn't be all too hard to pull off for an unmaintained extension.

And then there's also stories like with NoScript's transition, which very much is a lot of work, but it will leave the NoScript maintainer with a much cleaner code base, not just from the WebExtension API being cleaner, but also simply because he rearchitectured the whole thing, as he was forced to rewrite anyways. And he'll get significantly better performance out of this, too.

He would not have done a rewrite without this, but he's glad that he did it.


I see the desire to move most extensions. One hope I have is that the next release will roll back some restrictions once active extensions have been ported.

However even if the WebExtensions had an "escape hatch" to browser internals it would still require significant porting effort and the promise of being marked as "Full Browser Access" and "Likely to Break" would probably convince everyone who can to port anyways.


>> but removing the raw access is removing what made Firefox great in the first place.

The raw access is also what made Firefox slow and cumbersome compared to Chrome. The recent performance improvements would have been impossible with the legacy extension apis.

Honesty I think this is a good move.


> The raw access is also what made Firefox slow and cumbersome compared to Chrome. The recent performance improvements would have been impossible with the legacy extension apis.

This is simply not true as evidenced by the fact that Nightly still has the legacy extension API and the improved performance.

That being said FF was slowing down to keep extensions compatible. This is why I think WebExtensions are a good idea. They should be the recomended path with promised future compatibility. Then FF can not worry as much about refactoring the internals as there are fewer extensions that would be broken and they "signed up" for it.

I would rather have a faster FF and have to patch VimFX every couple of releases then have FF show down development for fear of breaking things. That being said loosing the extensions that gave FF it's magic is not a good tradeoff in my opinion.


The legacy API is not on nightly. I think they have a similar API in WebExtension Experiments, but in nightly, legacy add-ons do not work.


https://wiki.mozilla.org/Add-ons/Firefox57

On nightly the extensions.legacy.enabled can be set to allow instalation of legacy extensions.


> To assist with performance analysis leading up Firefox 57, in Nightly only we are turning off add-ons that require shims.

This was for pre-57 and doesn't apply to 57+.


That isn't true, I'm running 58.0a1 nightly with legacy add-ons enabled.


The point is that many APIs no longer work even though you can "enable" legacy addons. Pretty soon, this setting will be a no-op.


So, I can't do what I need, but at least I can do what I don't need quickly. Yay progress!


Firefox 57 is the version that finally breaks Pentadactyl and many other extensions permanently.


I've just switched to the nightly after reading your comment. Really liking it so far, it's been years since I've used firefox.


if you apply the mindset to the OS level you've essentially got QubesOS[0] I love what mozilla does here :)

[0] Step-0 of https://iotdarwinaward.com/post/improve-your-privacy-in-age-...


Hmm, I've been using it since if was Phoenix(?), version 0.7 or so IIRC.

I'm not convinced they're going in the right direction. Annoying dicking around adding new stuff as default that should be extensions (ones you can remove, and that you choose to add). Then in FF56 on Kubuntu I've noticed a slow down, a lot of lagging for me; but much worse most of [18/20] the add-ons I use are now "legacy" which gives a sense of foreboding that I'll be left choosing long established add-ons _xor_ bugfix/security updates.

We'll see of course, perhaps I'm just getting a little too cynical having been browsing since the days Lynx, Mosaic and Netscape were new tech.


I think they had to make the tough call of breaking compatibility in order to move faster.

I understand that a lot of devs and power users are annoyed but hopefully we're not the only target audience, we just happen to be a quite vocal in places like HN.


I like new Firefox but if Firefox is removing search bar than address bar should take over all functionality from search bar and it doesn't.In search bar there is easy way to add new search engine with + sign and in address bar there isn't.


Don't set the UI density to "touch" then - tab closing animation is very clunky.

https://bugzilla.mozilla.org/show_bug.cgi?id=1407462


People tend to assume that if Firefox 57 or other version will be faster then Chrome, then a lot people would then start to use Firefox instead of Chrome.

As much as I would like to see that its not gonna happen, and I am writing this as a Firefox user.

Remember what 'REAL' Opera 12 did in its times comparing to Chrome or Firefox? It loaded pages faster, used less memory, was most standards compliant and also came with bundled torrent client, and mail client and RSS client and ... and having 100+ tabs opened DID NOT EVEN SLOWED IT!

... and guess what, both Firefox and Chrome had more users while Opera had about 4-5%.

It did not mattered if it was faster or better.

Currently Opera is just a Chrome with different skin, so I moved to Firefox with Midori and Iridium as 'backups'.


I had a few times in past years when I got so irritated by sluggishness of Firefox that I moved to Chromium, despite of the completely unusable tab UI it has when compared to Firefox's (even without addons). Well, it always turned out that Chromium with 8GB RAM and my browsing habits is even worse, so I returned back to Firefox, but if I had 16 or 32GB of RAM it might have turned out to be a different story.

I'm so glad Firefox catches up. Instead of thinking "I wish Chromium had better UI and I had more RAM", I can just be happy with my browser, embracing my workflow instead of trying to adapt it to the available tools.


I wouldn't be that pessimistic. The key difference is that Firefox used to have a lot of market share that it lost to Chrome, whereas Opera never really had any to begin with.


It had market share when Google gave it free advertising on _every single Google search_


>will be faster then Chrome

Well, for now it is still much slower than Chrome https://www.phoronix.com/scan.php?page=article&item=firefox-...


These are stupid benchmarks and chrome devs stopped optimizing after them [1] because they don't matter. Michael (the phoronix guy) makes a living out of automating benchmarks and automated feed aggregation (or mailing lists) and those benchmarks especially add nothing of value to the Browser speed discussion.

https://v8project.blogspot.de/2017/04/retiring-octane.html?m...


Provide different benchmark test then. Not trying to sell something here.


Can anyone tell me how secure web browsers are on linux generally. I was looking at the pwn2own results and was quite impressed with the edge compromise that got out of the host OS it was running in. However, I didn't see any web browsers on linux being compromised - is that because it is harder, or no-one bothered?


Comparable to Windows. Windows is a high-profile target for web browsing so you're seeing more exploits.

Web browser escapes usually target the operating system kernel in order to break out of the sandbox. Chrome can reduce its attack surface on Linux using seccomp, and while there's a win32 syscall filter on Windows 10, I'm not sure if Chrome uses it. Windows has stronger kernel self protection features than Linux, but also more attack surface.

Chrome uses Linux namespaces (like LXC/Docker/...) for isolation in addition to seccomp-bpf.

Chrome is by far the most secure one right now, but as evidenced by this blog article, Firefox is catching up.


Chrome disables all win32k syscalls in its renderer/extension/plugin processes (at the very least flash and pdf). This has been the default for a while now.

I believe the specific win32k syscall filter you're referring to (where you can white/black list specific syscalls) is still only accessible to Microsoft applications (Edge uses it).


The Chromium sandbox supports the Win32k mitigation, though it’s possible it’s not enabled at runtime.


The browser exploits that sell well and deliver a good show are rated by impact. Thus, folks go for windows.


Back when grsecurity was still public I would've said that using it with Chrome provided the best security you could get on Linux. Between the defensive mitigations it added through PaX and all the other little things (like making chroots actually behave like jails) it greatly increased security. This is without even using any MAC system.

I'm not entirely sure how things stack up now. In the past I never had much faith in the vanilla linux kernel.


It's best to use the browser with Firejail.


I feel like I should point out that Firefox won't be getting backported to Debian stable[1]. Until the next Debian stable, it seems that Firefox ESR 52 will be the only version of Firefox.

[1] https://mozilla.debian.net/


I downloaded Firefox from mozilla.org and configured a ~/.local/share/applications/firefox.desktop file so that it appears in the GNOME Shell menu. It auto-updates and works great.


I do the same for Nightly, which I keep alongside the system-installed one in Ubuntu.


Thanks for that information. I use unstable and a part of me always want to go for a stable version. As a Firefox user, maybe not after all.

I guess there's a price in each choice.


I find it better to run stable/testing and install Firefox separately. It works great.


Doesn't Debian follow the ESR releases for their stable branches? E.g. when support for ESR 52 ends they'll upgrade stable releases to ESR 59?


Normally, yes. However, something on that page concerns me:

"Jessie and Stretch backports of Firefox release and beta are gone because of the requirement of rust to build them, which is not available in Jessie or Stretch. Please update your apt sources to use Firefox ESR instead."

I'm not sure how that Rust requirement and ESR 59 will play together; I'll assume they won't play together very well.


Yes. Current stable did not have Firefox ESR 52 when current stable was released, but it has it now.

Debian is providing Firefox ESR 52 even in oldstable (check security upgrades) https://tracker.debian.org/pkg/firefox-esr


> Firefox won't be getting backported

"won't" is a strong claim especially considered you didn't provide any source to back it. The page you've linked doesn't talk about such a possibility at all. This is only your wild guess right now.


OT: Do the Quantum changes get into the Android version or is this a completly different software?


IIRC they plan to deploy the Quantum enhancements on Android but it may lag a few versions behind their availability on Desktop since they don't want to have to include both the Quantum and non-Quantum codepaths (so the Quantum changes could be disabled in case bugs turn up) which would bloat their APK size (they try to keep it as small as possible since many Android devices have very little on-board storage).


There's a planned Photon redesign that already landed in Nightly on Android, but, if I remember correctly, it won't make it on time for 57 desktop version (probably around 58 mark). I am not familiar with the other improvements.

Disclaimer: Affiliated with Mozilla, but not with the Firefox team.


It's rolled out to Firefox beta (so yes, version 58) on Android now. (FWIW I've used beta for years and very rarely had any issues.)


> We could not block the web content rendering entirely from reading the filesystem because Firefox still uses GTK directly - we draw webpage HTML widgets using the same theming as the native desktop.

Is there a way to build Firefox without GTK? For example for something like Plasma Mobile? It would be good if there was some fallback mode where Firefox would render UI elements using HTML itself, without relying on UI toolkits.


> It would be good if there was some fallback mode where Firefox would render UI elements using HTML itself, without relying on UI toolkits.

This isn't quite a meaningful assertion. The way it works in Firefox is that a UI developer specifies in a xul or html document that there should be a button:

    <button id="myButton" label="Click me!"/>
Then Gecko applies several CSS rules for button elements. One tells it what binding to use (https://dxr.mozilla.org/mozilla-central/source/toolkit/conte...) (a binding is an means of abstraction that packages up behavior and document structure). The other tells it what appearance to use (https://dxr.mozilla.org/mozilla-central/source/toolkit/theme...).

Note in particular the `-moz-appearance: button;`. This tells the rendering engine to figure out how big the button is, ask the OS to draw a button of that dimension, and then composite the OS button on top of the button node. I'm not an expert but a quick glance at the code points me to https://dxr.mozilla.org/mozilla-central/source/widget/gtk/ns..., which seems to be the main entry point for Gecko to ask for a widget to be rendered.

As you can see, Firefox does not rely on a toolkit to tell it how buttons _work_, only how they _look_. You could supply a stylesheet that overrides the -moz-appearance rules and you'll get buttons that are rendered purely by Firefox. (You might need to supply some more style rules so that they actually look like buttons.)

If you want to compile without GTK, that's a little more complicated. Firefox uses the toolkit for things like the message loop, mouse and keyboard event processing, etc. You could do all of that in straight Xlib, but who would want to? Certainly nobody has wanted to enough that they've been maintaining an Xlib port all of these years.


No Xlib for sure, since it should work on Wayland. I think GTK isn't a good choice for that purpose.

Since Webrender is designed like a game engine, may be it should use SDL or something of that sort.


Webrender works like the rendering logic of a game engine. The input-handling logic of SDL and friends are badly impoverished compared to what full-blown GUI toolkits support; input methods, accessibility, multiple windows, tooltips, modal dialogs, etc. are all things the GUI toolkit takes care of.

It would be easier to simply build a Qt version of the bits that depend on GTK, so Linux users can choose between those two. But considering how little Firefox seems to care about Linux user experience (FF has been broken with transparent GTK themes since forever and nobody cares; FF removed Linux native audio support and nobody cares), I doubt this will happen and I doubt a patch would be accepted upstream for reasons of "maintenance overhead". This ignores that maintenance overhead is much higher when two independent parties have to maintain the upstream and a patchset, but is for some reason accepted practice in the open-source world.


> FF removed Linux native audio support and nobody cares

No, they didn't. I'm listening to Soundcloud in my Firefox right now; it's sending sound to PulseAudio just fine.

What you actually meant to say is that Firefox removed support for those 1% of Linux users (i.e. 0.01% of total users) that don't have PulseAudio for whatever reason.


Linux's native audio API is ALSA; consult the kernel sources if you don't believe me. Pulse is a common userspace audio system, but is not the native Linux audio API.


Which doesn't mean Firefox should support the kernel API directly, or every audio system out there. And other systems probably have wrappers for PulseAudio API.


Yeah. Qt support was actually in good shape in Firefox in the past, but Mozilla never backed it officially, and it fell apart.


I don't fully understand this, but I think this is a lot more complicated than it might seem. Because well, you'd first of all need to set up a separate Gecko instance to render the UI, which isn't fundamentally different from what they're doing with tabs, but still an architectural change.

Well, and then you'd probably run into security restrictions, as under normal circumstances, you don't ever want something from inside Gecko to communicate with extensions and probably other things, but for this you need that capability.

Having said that, Mozilla is actually exploring into this direction: https://github.com/browserhtml/browserhtml/blob/master/READM...

And presumably, this is the future, as it would also allow them to get rid of the XUL UI Toolkit, meaning they can entirely focus on core browser technologies. (Which is something different from the XUL/XPCOM extension API that they're deprecating on Tuesday.)


I have to say though, having chrome that is virtually indistinguishable from a webpage is a phisher's dream. You also lose 25 years of low-level graphic development in platform toolkits, which likely means losing a lot of performance.


The alternative would be maintaining many toolkit backends. We already see how well that worked out. Qt backend wasn't maintained in a while, and fell into bit rot. That basically prevents Firefox from being used Plasma Mobile and the like. Having HTML backend is better than having none at all.


> I have to say though, having chrome that is virtually indistinguishable from a webpage is a phisher's dream.

That's not terribly hard to do today either. That's why browsers implemented those obnoxious fullscreen animations and notifications somewhen last year.


Firefox OS - IIRC, it rendered the entire UI using HTML drawing directly to the screen using Open GL ES with no 'native' toolkit to speak of, nor requiring any X11 or Wayland backend.


> Firefox would render UI elements using HTML itself

Browser.html is an experiment in that idea for Servo:

https://github.com/browserhtml/browserhtml

If it works out it may end up in Firefox in the long term.


Yeah, I hope this will be usable in Plasma Mobile.


Presumably GTK is not just used from drawing visible elements but also for things like file pickers, print windows etc.


Fennec used to work without GTK? And Firefox on Android does, but there it's probably using another toolkit. It causes this exact problem - porting Firefox to a new system is impossible without rewriting all that.


Yeah, Android Firefox uses the native Android UI toolkit. A long time ago, they had it in XUL, which allowed for some really nice customization and just in general a more conform behaviour with the desktop browser, but performance back then was really just terrible, so that's why they changed it to the native Android UI toolkit.


Which sucks so horribly that several distros actually maintain a full fork of Firefox where all those are patched to use Qt instead.


Interesting; do you know which distros do that? I know Nokia started the Qt stuff (for Maemo), but wasn't aware that anybody was continuing to maintain it. But I haven't looked at things at a level that would have let me know in quite a while.


SailfishOS developers were dragging it along, but after Mozilla dropped support for IPC Embedlite[1] (they never even accepted it officially), I think they got stuck with outdated Gecko. No idea what they are doing about it.

1. https://wiki.mozilla.org/Embedding/IPCLiteAPI


The SUSE distros are patching Firefox to use QT dialogs for everything, but kept the GTK core loop.


Why didn't they replace all GTK with Qt and proposed to upstream it? That would have been really good.


That was done several times before, but Mozilla rejected such proposals.

Even if that means Firefox breaks every few weeks due to a new GTK release.

Even if that means Firefox never will properly support multi-monitor HiDPI on Linux (and not at all on X11).


Did they provide any reason, or those who make decisions there have some irrational bias and prefer GTK?

I can see why it can be harder to bind to Qt from Rust, but this is now a solved problem I think:

https://phabricator.kde.org/source/rust-qt-binding-generator...


How does this compare to IE's Protect Mode, Enhanced Protection Mode, and Edge's execution in an app container?


  security.sandbox.content.read_path_whitelist
Are extensions allowed to change that?


Not WebExtensions (which are the only kind of extension allowed on Firefox 57+ unless you change another pref).

I mean, Firefox even has a `security.turn_off_all_security_so_that_viruses_can_take_over_this_computer` pref (used in testing; you won't see it in about:config but IIRC you can manually add it. Don't.). Prefs that break security are not new :)


Oh, really? I hope not in production builds, at least.

Defense in depth concept is not new either.


You also need an environment variable to be set for it to work.

But yes, it seems to be something you can flip in production. The argument being that if you're in a position to flip prefs you already can break security in a million ways. It's not something you can accidentally flip either.

(The pref doesn't actually "let viruses take over the computer", it just turns off all the security checks)


It doesn't even turn off "all the security checks". It does make it so that certain APIs that let you do all sorts of stuff web content can't normally do are exposed.


I feel like having a global switch for all security checks is already not a good idea.


It's unlikely to be abused by am attacker, if it requires starting Firefox with a certain environment variable. Chrome has the same thing with a command line switch.

Useful for some internal unit/integration tests for release and test builds, but really dangerous when pointed to the web.


Actually, "all the security checks" is inaccurate; it seems to enable certain special powers in JS. It turns off one security measure. These special powers seem to be enough to compromise other stuff; but again, if you're in a position to flip that switch you already can compromise other stuff.


I don't know for sure, but I heavily doubt it, as it would open up so many potential security holes.

The standard way to access files for extensions seems to be with Native Messaging: https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Na...

Basically make the user install a small program on their PC, then your extension talks to that program, the program reads out the file that you need and then hands it back to your extension.


I've not been inclined to use this browser since they started with pocket, moved to offering a voice and video chat service, forced PulseAudio as a mandatory dependency and eventually enacted mandatory opt-in telemetry in the browser.

sandboxing is great, but if the site is spooky enough im just going to load it in elinks/lynx and grok the text. Chromium also has sandboxing, and if youre really paranoid enough, surf from suckless.org is a webkit style do-it-yourself browser thats fairly reliable.




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

Search: