pull down to refresh

Hi everyone, I'm Jonathan, I'm working on the squeaknode app: https://github.com/yzernik/squeaknode

It's an open-source, non-custodial, p2p social media app. You can post anything you want on your own node, and anyone can connect to your node and download your posts, but only after a lightning payment. You can also act as a relay and sell other people's posts from your node.

You can connect your Twitter account to squeaknode, so your tweets will automatically get mirrored.

Currently, the app is available in the Umbrel app store. I'm working on getting it into RaspiBlitz and myNode next. It's an easy way to earn sats!

What do you think?

Pretty Cool! Thank you for sharing and thank you for pushing this! Here's my raw feedback (based on Umbrel version):

  • The onboarding steps are confusing.
  • Login page could use css ;)
  • When I open squeaknode it lands on Timeline page. It's not clear what to do next.
  • I click on the pen button (the FAB action button with primary color means "the most important next action"), but in the dialog I don't have a profile, so I have to close it again.
  • When I create profile in the Profiles section it's still not super clear what to do.
  • When I post first squeak it says "9 minutes ago" even though I just literally posted it.
  • When I try replying to the squeak - my profile should be selected by default (also profile should just be selected globally, I don't want to toggle it in every. dialog)
  • The CSS could use some help - fonts are too big in replies, missing paddings, random box shadows, too many colors, unclear next action.
  • Buttons are missing titles, so it's not clear what it does. When I click on resqueak button on my own post, it looks enabled, but then does nothing.
  • It's not clear how to find anyone else. It would be great if you have some nice account to follow by default, e.g. yours. That would help a lot if I want to actually try some interactions early on.
reply

Thanks for the feedback! this is useful for me.

"The onboarding steps are confusing."
Anything in particular?

"Login page could use css ;)"
I'm not very good at frontend development, so most of the frontend stuff is just what I could hack together. If you have frontend skills, you are welcome to open PR's :)

"When I open squeaknode it lands on Timeline page. It's not clear what to do next."
When the timeline is empty, there should be a welcome message that gives some basic instructions (follow people/create posts). Were you able to see the welcome message?

"I click on the pen button (the FAB action button with primary color means "the most important next action"), but in the dialog I don't have a profile, so I have to close it again."
I should probably have a button directly in the dialog to navigate to the "Profiles" page, to make this easier.

"When I post first squeak it says "9 minutes ago" even though I just literally posted it."
This happens because the timestamp inside the squeak is based on the most recent bitcoin block hash. That's how I am able to share timestamps trustlessly between peers.

"When I try replying to the squeak - my profile should be selected by default (also profile should just be selected globally, I don't want to toggle it in every. dialog)"
I am working on this... it is currently an open issue: https://github.com/yzernik/squeaknode/issues/1146

"The CSS could use some help - fonts are too big in replies, missing paddings, random box shadows, too many colors, unclear next action."
Yeah, I know :) it needs a lot of work

"Buttons are missing titles, so it's not clear what it does. When I click on resqueak button on my own post, it looks enabled, but then does nothing."
There should be an alert message that says "Unimplemented" when you click. Can you make sure that you are running on the latest Umbrel release?

"It's not clear how to find anyone else. It would be great if you have some nice account to follow by default, e.g. yours. That would help a lot if I want to actually try some interactions early on."
That's an idea that I am considering.

reply

FYI: protocol is here

https://github.com/yzernik/squeak/blob/master/docs/PROTOCOL.md

not tried it, but great to see innovation here, esp. w/ umbrel

reply

Thanks! Do you have any questions/feedback about the protocol?

reply

Can you give a high level overview of how the network/protocol functions or drop a link to an explanation if it exists?

There are references to block hash in the protocol - is there a notion of blocks/consensus in squeak or is this referencing bitcoin blocks somehow? In either case, what motivated this design choice?

reply

The docs are very sparse right now, I'm working on improving the docs.

The high level summary of the protocol is:

When you open a connection to another node:

  • send "msg_subscribe" containing the list of addresses that you are following (plus block range that you are interested in)

When a node saves a new squeak:

  • forward a "msg_inv" containing that squeak hash to all connected peers that have indicated that they are interested in following squeaks signed by that author.

When a node receives a "msg_inv" from another node:

  • check if that hash already exists in the local database, and send a "msg_getdata" message back to the other node to get the data if needed.

When a node receives a "msg_getdata" (containing MSG_SQUEAK) from another node:

  • send a "msg_squeak" containing the full squeak (encrypted, without the decryption) back to the other node.

When a node receives a "msg_squeak" from another node:

  • save the received squeak in the database if it is valid (and in the following list). Send a "msg_getdata" request to get the decryption key for this squeak from all connected peers.

When a node receives a "msg_getdata" (containing MSG_SECRET_KEY) from another node:

  • send a "msg_offer" containing a Lightning invoice that will provide the preimage to get the decryption key after being paid.

When a node receives a "msg_offer" from another node:

  • save it in the local database (after validation). Now the user has the option to pay the invoice the invoice to get the decryption key and unlock the squeak.
reply

Also, is there such a thing as consensus in squeak or is it strictly a relay network?

reply

No consensus needed, just relay. It's a layer-3 protocol, so it piggybacks on top of Bitcoin and Lightning for all of the trustless stuff (timestamps, invoice payments)

reply

Oh yeah, I forgot to answer your question. It is referencing Bitcoin blocks.

reply

The purpose of referencing the Bitcoin block hash is to create a provable timestamp for the creation time of the squeak. It guarantees that the squeak was created at least after the time when the block was mined.

reply

And blocks are just a way of having a reliable means of providing time in a distributed context?

reply

Yes. Each squeak has a block hash embedded in it (before it gets signed). So when you download a squeak from another peer, you can verify that it was created after the block time.

reply

will u release an Android version?

reply

I would like to release an Android app in the future, but it would not be a full squeaknode. It would be a client that connects to your Umbrel/RaspiBlitz, etc.

reply