Hacker Newsnew | past | comments | ask | show | jobs | submit | skaul's commentslogin

So two hops, basically. First hop sees your IP address but not the website you're going to, second hop sees website but not IP address. Similar to Private Relay: https://support.apple.com/en-us/102602.

But if both services keep logs de-anonymization is a join.

(Carl from Obscura here)

Very true, but if even 1 of (Obscura, Mullvad) is honest, there's no de-anonymization.

For traditional Single-Party VPNs, you just need to compromise 1 party, with Two-Party Relays, you need to compromise both.


> Very true, but if even 1 of (Obscura, Mullvad) is honest

Just Obscura's compromise is enough, as pointed out previously: https://news.ycombinator.com/item?id=43016574

Unless something has changed in Obscura's architecture, the interface with Mullvad is under Obscura's control, and thus it can compromise client's credentials. This is unlike iCloud Private Relay where the guarantees are cryptographic in nature and not merely based on promises.


They don't even need to. If you observe enough of them you can correlate traffic patterns between them and find out which one is used by which endpoint

(Carl from Obscura here)

Yup, exactly!


Cool work. Can I ask: why not use MASQUE for this, instead of WireGuard-over-QUIC? Is it because it meant less changes on your partner's side?

(Carl from Obscura here)

Yup! Mostly less changes on Mullvad's side. Also QUIC has less overhead than MASQUE by definition.


Credit to bsclifton for the idea!


It's not but given that Perplexity doesn't have an API and blocks automated downloads, I'm not sure what else to use. Explained in the docs: https://github.com/ShivanKaul/chromium-drift/blob/main/docs/...


How does comet update itself?

Edit: approximately like so:

    curl -sS -X POST -H 'Content-Type: application/json' -d '{"request":{"protocol":"4.0","updater":"CometUpdater","updaterversion":"0","os":{"platform":"win","version":"10","arch":"x64"},"apps":[{"appid":"{42e10078-e377-4166-965f-c14ad958a146}","version":"0.0.0.0","updatechecks":[{}]}]}}' https://www.perplexity.ai/rest/browser/update2 | sed "s/^)]}'//" | jq -r '.response.apps[0].updatecheck.nextversion'


fwiw this should work the same for just about all chromium forks - protocol is documented here: https://github.com/chromium/chromium/blob/6eb6252d5671bca378...


Sorry about that! I've fixed the colors and contrast now.


thanks :)


Thanks, fixed now.


I worked with Ralph when he was at Brave. I fondly remember many long walks in downtown Vancouver with him, getting tea at Matchstick and chatting about Rust and privacy and ancient Egyptian hieroglyphics. I still can't believe this. Huge loss.


Programming with LLMs is fundamentally different than going from a lower-level to a higher-level language, even apart from the whole non-determinism thing. With a programming language, you're still writing a for-loop, whether that's in C, Java or Rust. There's language primitives that help you think better in certain languages, but they're still, at the end of the day, code and context that you have to hold in your head and be intimately familiar with.

That changes with LLMs. For now, you can use LLMs to help you code that way; a programming buddy whose code you review. That's soon going to become "quaint" (to quote the author) given the projected productivity gains of agents (and for many developers it already has).


A programming language does not need to have a for loop. In fact many don't.


Programming languages need to give the developer a way to iterate (map, fold, for-loop, whatever) over a collection of items. Over time we've come up with more elegant ways of doing this, but as a programmer, until LLMs, you've still had to be actively involved in the control logic. My point is that a developer's relationship with the code is very different now, in a way that wasn't true with previous low-to-high level language climbs.


I was thinking of something like SQL, which is declarative and you tell it what you want, not how to do it broadly speaking.


You can add these to your `~/.claude/settings.json`:

  "env": {
    "CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY": "1",
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
    "DISABLE_AUTOUPDATER": "1",
    "IS_DEMO": "1"
  }


Ha! Great minds think alike! I posted the same thing 3 seconds slower =(


We used to use Bloom filters in 2019, funnily enough: https://brave.com/blog/improved-ad-blocker-performance/


That is correct.


thanks for the clarification. is this 45MB reduction for the whole browser? or is this 45MB per tab?


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

Search: