f0rest8

f0rest8

MOSSLET - a privacy-focused alternative to the social networking landscape (built with Elixir)

Hi everyone :waving_hand:

Posting here to showcase and announce that Metamorphic is now officially live on a public-facing domain at https://metamorphic.app.

Metamorphic is a privacy-focused alternative to the social networking (media) landscape. And it’s no clone, with fundamentally different behaviors and features, so it may feel strange at first (though the ideas and concepts should all feel pretty familiar).

I tend to just sum it up by saying that it’s a better way to connect and share online with the people in your life (no bias here).

It’s built with Elixir and Phoenix (lots of Live View) and it’s just me working on it! Some of the tooling includes:

  • phx_gen_auth
  • ecto
  • cloak_ecto
  • ets
  • enacl/libsodium
  • GenServer
  • nimble_totp
  • zxcvbn
  • bamboo
  • live view
  • tailwind
  • alpinejs
  • stripity_stripe
  • stun

The site is now ready to take sign ups for our upcoming Early Access Launch, this was a big push for me to get out before my family and I leave tomorrow to move from coast-to-coast.

You can easily click through to see other portions of the service and get sense of what’s in store for Metamorphic (I’ve disguised the feature images for now until the Early Access launch gets closer).

Here’s also a list of urls to quickly learn more:

Becoming a parent was the inspiration behind Metamorphic, as it totally changed my life and made me start to pay attention to things I had chosen to ignore before and focus on trying to create the kind of world I would want and hope for my family.

No plans to ever sell or spin-off Metamorphic, I’m in it for long-haul. Some inspiring small software businesses that are examples of success not trying to run the typical startup route are Transistor.fm, Fathom Analytics, and DuckDuckGo (though DDG is pretty “big” to me :blush:).

Big thanks to the Elixir community, I really never imagined I could have made something like this (or be making it) a year ago. The PETAL stack has definitely made development possible for me as I work on this in my spare full-time (“full-time” worked around being a primary caregiver).

In addition to the tooling, the Elixir community is such a super power for development, so thank you to everyone (including all the books from authors)!

Check it out, let me know what you think, and sign up to get on the Early Access list if you’re interested!

I hope you join me on this journey to a better online life.

-Mark

Most Liked

f0rest8

f0rest8

Hi everyone, :waving_hand:

Wow, what a road it has been.

It’s been 8 months since the first person signed up for invite codes to our Early Access launch at Metamorphic and tonight, through the rest of this month, I am sending out the first round of emails to people.


It's been quite a journey

In 2020, I had a crazy idea to make an alternative way for people to connect and share online. Inspired by becoming a father (“Dada”), my own observations and intuitions about the effects of current platforms, and culminating with Shoshana Zuboff’s latest book on surveillance capitalism, I set off to not only build Metamorphic but also learn how to build it too.

Learning to Code

At the time, I had limited experience with Python and Ruby. With Python I had made a simple arcade-style game, called Paper Space Arcade, and packaged and shipped it for $0.99 to anyone with a Windows OS — it even featured an original soundtrack/score and my twin nephews loved to come over and play.

After Paper Space Arcade, I turned to web development to make a website for my partner-at-the-time to assist with her job applications and resume. This led to me discovering the Django framework and I began work building a job search for architects website called The Grid (wayback machine).

Switching from game development to web development was like turning the dopamine switch on high. The gap between code and “useable” shrank to almost nothing. Suddenly I could imagine turning an idea into a reality before the sun went down. It was an empowering feeling made intoxicating by its immediacy.

The Covid Age

When Covid hit, I felt both inspired and powerless to help. Day after day I’d read updates on the increasing numbers and wonder what I could do. Ultimately, not that much, but it drove me to add a search feature to The Grid that was updated with the Covid data from Johns Hopkins and enabled people to quickly and easily search by county around the world.

While The Grid failed, it was a great exercise in learning and avenue for channeling my creative energies and desire to help (it mostly just stressed people out whenever I commented on the latest numbers for their county).

Do all webs spin from Ruby?

As I immersed myself more and more in Python and Django, I inevitably discovered Ruby and Ruby on Rails. My first impression of Rails was “syntax confusion”, but I found myself charmed by the passion and philosophy of its fans and kept coming back to it.

So, I began building a portfolio site for my same partner-at-the-time using Ruby on Rails and I like to believe that it helped play a small role in landing her a job (the architects commented on how impressed they were with her site — though largely due to her design is my guess).

A transformation begins

Around the end of 2020, the idea that my company with my co-founder-at-the-time would raise money and successfully develop video games came to an end. I had also been the primary-caregiver to my incredible little one and found myself realizing how much I valued my role as such.

While I was demoralized about the end of the “video game dream”, I found myself increasingly inspired to do something that would have a positive effect on the world for my little one. That’s when I decided to commit to building another way to connect and share online — insulated against the raging surveillance economy.

Early versions

Since Ruby was the latest language I had been working in, I embarked to build Metamorphic with Ruby and Ruby on Rails. It’s hard to imagine or even remember these early versions, but I do recall consistently bumping up against the need to do so much more with so much less.

While I was stumbling over the same development hurdles with Ruby and Rails, I learned about Elixir and Phoenix from that similarly momentous Chris McCord Twitter clone.

However, I was initially turned away again from my first impression of the syntax and feeling my brain explode every time I saw symbols moving through other symbols:

# From Chris McCord's demo
def inc_likes(%Post{id: id}) do
  from(p in Post, where: p.id == ^id, select: p)
  |> Repo.update_all(inc: [likes_count: 1])
end

But, destiny beckoned, and I sat down one night and followed along — throwing out any attempt to understand and just going along for the ride.

And what a ride it was. When I played with the finished demo on my own laptop it was like hitting reset on the dopamine switch. I didn’t know much of anything about Elixir and Phoenix, but I knew I had found the tools that would give me the best shot I had at making Metamorphic come true.

Today

And now, nearly 2 years later, I am finally “ready” (ohhh boy…) to start sending out the first round of Early Access invites. I had no idea that it would take me this long when I first set out to make it.

My naivete was a blessing because I probably wouldn’t have attempted Metamorphic if I had realized what I would go through along the way. I still don’t know.

The community around Elixir is simply phenomenal. Whether it’s a podcast or this forum, people are compassionate, kind, and inspiring (not to mention brilliant and skilled — seriously, wow). And it goes without saying, but I’ll keep saying it, that Metamorphic wouldn’t be possible without the community.

With luck and work, I’ll be able to keep contributing and giving back to the community even more (so far that Ecto guide and simple HaveIBeenPwned? alt-library).

A final personal note around Early Access

I mentioned I’ve been going through a challenging time outside of Metamorphic, which had delayed my original launch plans.

And it’s true, as a father and primary-caregiver going through a… nightmare of a divorce… going through all sorts of court/legal fights (family and criminal)… being isolated with the little one from our family and support network on the other end of a large country… while moving in our first blizzard… I’ve had to handle more than I ever thought I was capable of.

So, I cross my fingers that Early Access members will be patient and understanding with any hiccups or “bugs” as I work to make Metamorphic as awesome as it can be for everyone, while also working to make sure my little one’s life is as awesome as it can be for them too.

I’ve been so fortunate to have such incredible support in my personal life and in this community, and so from the bottom of my heart, thank you to everyone.

I’m so excited to welcome people on this crazy journey with me.

To a better future together,

:green_heart: Mark

f0rest8

f0rest8

Thank you, that’s so awesome to hear. I don’t know if it helps you, but things that have helped me, and continue to, are:

Wishing you the best and excited to see what you make!

f0rest8

f0rest8

@shd42 Before the question: you worked with Sea Shepard? I think that’s so awesome. I just watched the documentary not too long ago on the founder. So many questions but so impressed you went out and did it.

Great question. It’s probably not clear because I haven’t yet put a section up explaining how it all works. So sorry about that and I’ve add that to my to do list. It’s just me making it all and my little one isn’t yet in daycare, so I work in nap breaks and after bed time if I’m not too exhausted (translation: takes me a longer than I’d like to check things off my list).

To answer: currently your data like images (for memories, avatars, other features) are hosted with Amazon S3.

I wasn’t stoked about this as there could well be a future where I’m paying them a significant amount of money, but it currently was within my ability to get it up and working.

I’ve looked at decentralized options like Storj, and I’m considering transition to Storj in the future (it has an S3 adapter — part of my reason for S3 was that I can more easily move services). When you sign in to your session and pull your images down from S3, they’re stored temporarily in ETS until you log out, then they’re cleared (currently that’s how the temp ETS is working).

Other non-object data like name, email, stripe_id, pseudonym, etc is stored with our hosting provider which is currently Render.

Oh! Just remembered: also when you delete your data, like a memory let’s say, the encrypted blob is also deleted from S3.

On Amazon
Now, S3 claims that they don’t do anything with the data in your buckets. I’ve read their policies a couple times and it actually sounds like that’s the case (I choose to not actually trust them—so what’s hosted is the asymmetrically encrypted object blob—even the file name, just not the extension—cause that made it much harder for how i then decrypt and show you the image temporarily in the browser without storing anything other than the decrypted binary temporarily on ets).

However, I do presume that their AI systems are involved in similar practices to scan public (and possibly private) images to train and build up their image recognition training sets. I presume this because that’s standard industry practice for the economic model.

So that’s when I realized I had to asymmetrically encrypt (with your password-derived key) because I didn’t want to “trust” that they wouldn’t do that with peoples data.

This also allows me to keep the buckets public but restricted with their CORS policy etc—which allows the frequent and hard to predict pulling of images for people (although as I write I realize I think I can update this now again to be private with presigned urls because the binary now gets stored in ets)—because the data is totally encrypted with the NaCl/libsodium libraries that the authors suggest not even the NSA can break (again all i can do is use my judgement and then decide to trust or not—I decided to trust them because they made a note on how NIST recommends algorithms and bit sizes that are strong for everyone but the NSA, hence 256 over 512 for SHA, which was my hunch, so that helped me feel like the library had similar hunches and I could count on it—it’s also recommended by the Practical Security book on prag prog). But you can forever go down the rabbit hole on wondering.

I encourage anyone to test and see if they can pull down any encrypted blobs from Metamorphics buckets (staging or otherwise and verify that the encrypted data is useless). Ive searched for them on grayhatwarfare but they don’t show up (although I don’t have a premium account so that may be why). They are currently named like: metamorphic-memories, metamorphic-avatars, and (I think) staging-metamorphic-memories (on my phone) etc.

On Render
The founder of Render comes from Stripe. And I felt Stripe is probably the most trustworthy with your data in the payments space. That inclined me to believe that @anuragg would bring similar if not better data and privacy practices. Again, I just have to trust at this point.

They also have temporary logging by default of only 7 days, which made me, again, feel that they had a similar respect for operational functionality and people’s data. And they encrypt their databases, use tls 1.3/1.2, I believe, when it’s supported.

However, I take a similar step as with Amazon and asymmetrically encrypt that data too before it hits the database with them (then I use amazon’s own symmetric encryption to encrypt that blob at rest).

Additionally with Render, the asymmetric encrypted data is then symmetrically encrypted by me with the Cloak/cloak_ecto library and I don’t store any logs outside of Render’s temp 7 day logs. Also, the logs are the base server error/warning logs.

Symmetric not asymmetric
Things not asymmetrically encrypted include the stripe_id. I added a section to the privacy policy on how a government may be able to get metadata by court ordering stripe and metamorphic’s databases (https://metamorphic.com/privacy), but it’s pretty trivial. Metamorphic is about protecting you and your data from surveillance capitalism and those AI systems, rather than making you 100% invisible/anonymous. It’s probably possible to do on Metamorphic but I don’t offer any guidance for that cause it’s next to impossible in the digital space.

Not encrypted
Things not encrypted explicitly by me but by my hosting provider only, are things like Boolean data that indicates really nothing sensitive or personal at all.

Okay this is probably straying off topic, sorry!

Where Next?

Popular in Discussions Top

blackode
Elixir Upgrading is so Simple in Ubuntu and It worked for me Ubuntu 16.04 git clone https://github.com/elixir-lang/elixir.git cd elixir...
New
AstonJ
I’ve just started the Phoenix part of the utterly brilliant online course by @pragdave. On generating the Phoenix app he uses the --no-ec...
New
pillaiindu
I want to convert a Phoenix LiveView CRUD website to a CRUD mobile app. What do you think is the easiest way to do so?
New
Ankhers
Just a little information upfront. Generally speaking, if I feel like I need to either break a pipe chain or use an anonymous function in...
New
PragTob
Hey everyone, this has been brewing in my head some time and it came up again while reading Adopting Elixir. GenServers, supervisors et...
New
saif
Hello everyone, Long time lurker first time poster here. I’ve recently begun working on Elixir full-time again! :raised_hands: It’s been...
New
chulkilee
Here are the list of HTTP client libraries/wrappers, and some thoughts on HTTP client in general. I’d like to hear from others how they w...
New
acrolink
How does the two languages compare when it comes to server side application development? Any experiences or ideas? Thank you.
New
Fl4m3Ph03n1x
Background A few days ago I was listening to The future of Elixir from Elixir Talks, with Dave Thomas (@pragdave ) and Brian Mitchell. I...
New
Markusxmr
Since Drab has been developed for a while in the open, introducing the Liveview functionality in a way it happend appears to undermine th...
New

Other popular topics Top

malloryerik
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode. The solution seems to be, in a hyphena...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 39523 209
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 36432 110
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New

We're in Beta

About us Mission Statement