Show HN: Hypergolix, “programmable Dropbox” with client-side encryption
pyhgx.readthedocs.io
pyhgx.readthedocs.io
Some links:
[1] Project website: https://www.hypergolix.com/
[2] Hypergolix source (~36k LoC): https://github.com/Muterra/py_hypergolix
[3] Golix docs (the crypto protocol that powers Hypergolix): https://github.com/Muterra/doc-golix
[4] Golix Python implementation (~5k LoC; needs rewrite): https://github.com/Muterra/py_golix
[5] Hypergolix Slack channel: https://hypergolix.signup.team/
That being said, contention issues like this require:
1. the same account 2. to be accessing the same object 3. at the same time 4. from multiple computers 5. one (or more) of which goes offline 6. while both are still producing data
This is the primary reason why support for concurrent instances of the same account is very experimental. All objects are single-author, so if you don't have that concurrent sign-ons, you have no contention.
Conflict resolution will always be an application-level concern. I would like to expose some synchronization primitives (distributed locks, semaphores, etc) for use within accounts, but this is a ways down the road.
Follow this guide to get Hypergolix installed and running:
https://pyhgx.readthedocs.io/en/latest/setup-1-installing.ht...
After you have Hypergolix running (you need to start it once to generate a fingerprint), you can register your fingerprint via
hypergolix config --register
which will bring up a browser window that will propagate the box with your fingerprint. From there, checkout is powered by stripe.Does that answer your question? If not, can you clarify a bit what you're asking?
Not a lot of notes about internals like this on the site - as an end-user developer it looks very good, so I'm sure someone will use it, but as a small time operations guy I worry about it.
But it's specifically designed to use as many relay servers as you'd like, at the same time. So if you're worried about uptime, you can run your own servers. You do that like this:
hypergolix config --addhost HOSTNAME PORT TLS
So, when I'm at home, my laptop will get updates over my LAN home server, in addition to hgx.hypergolix.com. Not only is this more reliable, it also reduces the receiver latency (sending latency is unaffected, because it's still pushing upstream to both servers).LAN discovery (of both services and actual users) is planned but not currently supported; there are a whole host of P2P operations that Hypergolix is very well-suited for, but that haven't yet been implemented due to time constraints.
most people I know that uses dropbox use it with expensive media workflows that are extremely slow to adopt anything.
[1] https://github.com/Muterra/py_hypergolix_demos/blob/master/t...
even applications that syncs files already treat them as "objects" as you need decisions on which side has a more up to date version for conflict resolution and such.
Does your server have access to any plaintext?
Servers have no access to plaintext. They also have extremely limited metadata: only the "author" [1] of the data and its ciphertext length is known.
[1] Technically not the author but the "binder", which is a specific term used in the protocol, but we're getting a little deep into the weeds. See here for more info about binders: https://github.com/Muterra/doc-golix/blob/master/whitepaper....
Can I suggest this alternative API:
obj = hgxlink.new_threadsafe(cls=hgx.JsonProxy, state='Hello world!')
obj.share_threadsafe(bob)
becomes:
bob.send({"some": "serializable object"})
I really like this idea:
> bob.send(obj)
However, I don't think object creation and sending will ever be combined into the same operation, because:
+ objects don't need to be shared (imagine using an object to track application settings; you don't want to send that to Bob but you want it to persist across sessions)
+ objects can be shared with more than just Bob (and we'd like it to be the same object!)
So hopefully, in the future the API will look more like:
> obj = hgx.JsonProxy('hello world')
> bob.share(obj)
Unfortunately because of the async/await syntax, this gets a little complicated to implement. But it's definitely on the horizon.
1. Encrypt things like PGP, except key encapsulation is separate from ciphertext delivery. Specific primitives used are AES-256, RSA-4096, and X25519, though deprecation of RSA is planned soon
2. Everything is content/hash addressed, which helps substantially with the above. Specific primitive: SHA-512
3. Data retention is governed like a reference-counted programming language; data gets a container, and then you make a signed "binding" to give the container an address. You can then sign binding revocations ("debindings"). When no addresses are left, the server removes the content.
Maybe this is all necessary. But it isn't at all obvious why.