Metamorphic (Early Access) is using Elixir

I’m happy to report that I’ve switched from using the Amazon S3 for object storage to using Storj. :blush:

I’d been wanting to do this for awhile and, now that I just finished up a big support feature, I’ve had the head space to circle back to make the switch!

Storj is a decentralized cloud object storage provider. And I still am asymmetrically encrypting everything sent through their network, so no changes there. :heart:

Since I haven’t yet sent out the first early access invite codes, this means that people will start from the beginning with their encrypted objects stored with Storj. I still need to update the privacy policy and copy to reflect the change.

2 Likes

Storj seems interesting. WIll you develop a library to interact with it ? I see they provide bindings for their golang client in C.

1 Like

Admittedly, I hadn’t yet thought about it. I’m currently using ex_aws to connect through their Gateway (setup similarly to how you’d configure it for minio).

I’m glad you mention this though, because now it is in my head and I think it’s a really interesting idea.

I have some questions:

  • Are you referencing the uplink-c bindings?
  • Also, the Livebook team is interfacing with Storj through their Gateway, perhaps someone is already working on a library?
  • Are you interested in working on a library?

Yes I was refering to the C bindings as I know we can use C code from Elixir. There is also a rust library that uses the C bindings. I guess Rustler would be easier to use.

I am not really interested working on a library right now as I do not need that functionality. Maybe in the future. Also I do not really know how to write proper C code or to integrate C code with the BEAM.

1 Like

Hi everyone, :wave:

I wanted to give a general update on when I would start sending out Early Access invite codes to people who have signed up (you still can!):

I’ve been going through a major life event that is requiring all of my heart and soul, and so I’m pushing back sending out invite codes until 1H 2022.

I had originally intended to have finished getting the Letters feature into a beta stage this month, but due to current events I have not been able to work on it yet. And I didn’t want to send out any codes until Letters was also in a beta stage.

Thank you to everyone that has signed up, it’s beyond exciting and encouraging for me and I appreciate your support. I am also super excited to be able to share another way to connect and share online that I really hope and believe will make our lives better. And if that’s not the case for you, then you can share your feedback, request new features, and vote on features, all in real-time too! :blush:

I’m sorry for the delay. I was really hoping people would be able to spend this holiday season sharing with their loves ones without worry on Metamorphic — but you’ll have to wait until 1H 2022 now (but I think it’ll ultimately end up making the Early Access experience better).

Thank you so much for your support and happy holidays :heart:

2 Likes

Hi again everyone :wave:

Happy to say that I’ve begun work on the Letters feature finally. I know this has been a long time coming, especially those who’ve waited at least 8 months now since signing up for Early Access. :hugs::green_heart:

Excited to say that the beta version of Letters is making quick progress now. Here’s a behind-the-scenes screenshot of our LiveView powered “at-mentions” in progress. This will be initially how you determine who to send your letter to. Disclaimer: nothing is set in stone and open to change.

Also, made some updates to the landing page including the launch date for the first round of Early Access invites (finally :tada:). I will be rolling invites out in batches and beginning with people that I think will be the most patient and willing to stick around through the ongoing development process and UX evolution. :blush: Once I’ve finished with the round 1 invites, then I will update the landing page with the date for the next round. At this point, I’m foreseeing about 3 rounds and possible month or two in between rounds depending on how it goes.

Thank you so much for your patience, interest, and support. So close! :green_heart:

PS — If anyone’s been following closely, then you’ll notice that I’ve closed down the old company (Core Theory) and will be opening a new company for Metamorphic in the near future. Also, the podcast has transitioned branding over to just being about Metamorphic. I haven’t released any new episodes yet, due to everything that’s going on in my life. But, I will be getting back to the podcast later this year once things settle down a bit.

4 Likes

Hi everyone, :wave:

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

13 Likes

Congratulations on your journey, the perseverance and passion you show is a clear inspiration to everyone!

2 Likes

Mark,
I received 3 early access codes today, so I signed up. However, everything in the left navigation bar except home and support gave me 500 internal server error.

1 Like

Hi Derek,

Oh sorry to hear that! Thanks for letting me know. Working on this right now, just saw its an error when you don’t have a subscription.

Update

Okay, this error has been fixed and pushed up. Should be good to go. Now when you click on features in the left navigation bar you are redirected to start a 14-day free trial subscription if you don’t have an active subscription or free trial.

There’s one more kink now I’m updating actually.

1 Like

Update

It appears the bug exists in Firefox but not in Brave browser (which makes me think Chrome is okay too but haven’t tested).

In Firefox, it isn’t reading the CSP config (issuing an error that it is blocking the Stripe script). This is preventing proper syncing between Stripe and Metamorphic.

On Brave, the CSP config is being read correctly and this bug doesn’t occur and everything syncs correctly.

Looking into why this is happening in Firefox.

Update

Appears the Privacy Badger extension was blocking some of the Stripe network connections. Disabling or allowing Stripe in the Privacy Badger extension gets rid of the CSP block in Firefox.

Currently, working on updating the subscription synchronizing to handle some potential edge cases that I’m still noticing with Firefox. Will update soon (also there’s an announcement on your Metamorphic dashboard about this current bug and will update there too when I have something new to report).

Thank you for your patience and understanding and sorry about this :see_no_evil::heart:

3 Likes

:tada: Update 3/26/2022 :partying_face:

It appears the webhooks timing out issue on new subscription sign ups has been resolved!

You should now be able to sign up for 14-day free trial (in Firefox or otherwise) and start using the app. Let me know if you are still having an issue.

From what I had been reading, it seemed that there was some kind of delay causing no responses to be returned on webhooks that I thought would be returning responses.

Attempts

I did a few things to get to where it appears to be working:

  • create Oban workers to send off the calls to stripe for attaching payment method and creating subscriptions
  • [deprecated] Task.Supervisor to call the function that calls into the webhooks supervised genserver (webhooks genserver handles the events and notifying subscribers via PubSub of the events)
  • [deprecated] call the success function to try and immediately return a 200 "ok" response to Stripe
  • drop stripe controller, deprecated items above, and custom body parser in favor of stripity_stripe’s Stripe.WebhookPlug
  • made a MetamorphicWeb.StripeHandler with stripity_stripe’s @behaviour Stripe.WebhookHandler

The challenge for me was that the webhooks would consistently work in development with the Stripe CLI (considering ngrok for future). So, I would first check that things work there and then have to test in production on my own account and go back and forth.

I think this really was the difference-maker for me and I’d recommend anyone to default to this body parser method if using stripity_stripe:

# endpoint.ex

plug Stripe.WebhookPlug,
    at: "/webhooks/stripe",
    handler: MetamorphicWeb.StripeHandler,
    secret: {Application, :get_env, [:stripity_stripe, :webhook_signing_key]}

plug Plug.Parsers,
  ...

So, now the StripeHandler simply broadcasts out to the supervised webhooks_processor.ex GenServer to handle further processing and broadcasting:

# stripe_handler.ex
  ...
  @behaviour Stripe.WebhookHandler

  @impl true
  def handle_event(event) do
    notify_subscribers(event)
  end

  def notify_subscribers(event) do
    Phoenix.PubSub.broadcast(MetamorphicWeb.PubSub, "webhook_received", %{event: event})
  end

  def subscribe_on_webhook_received() do
    Phoenix.PubSub.subscribe(MetamorphicWeb.PubSub, "webhook_received")
  end

Thank you to @stefanchrobot (response to another thread), @andreaseriksson (stripe course), Conner Fritz blog and Simon Rydell’s blog post.

2 Likes

Congrats and thanks for mention

2 Likes

Update May 20, 2022

  • Portals under construction :construction: (using WebRTC)
  • Working on site overhaul for new logo :heart_eyes_cat: and colors (including dark mode toggle)
  • Use of Memories and Letters are available in their earliest forms
  • New public benefit parent company, Moss Piglet Corporation (replacing Core Theory)

75% off lifetime discount :tada:

Thank you to everyone who has signed up and checked us out during early access. There is a lot of work ahead to improve performance and iron out bugs (ahem Portals) — not to mention new/enhanced features.

Everyone who signs up for a subscription during this first round of early access will receive a 75% lifetime discount on their subscription. :raised_hands:

This is a long road and journey to getting Metamorphic to where I envision it can be for everyone. Due to things in my personal life, development has been slower than I’d like at the moment, so I appreciate the patience and support.

https://metamorphic.app (old logo and site colors)

Open source
Today, I open-sourced the codebase. This was a big step for me (including psychologically), putting everything out there so people can see what’s happening.

Finished the initial stages of the site wide redesign, (https://metamorphic.app) though still very early days and lots to do. This site wide redesign was with the help of the Petal Pro team, @mplatts, @nhoban, and contributors) which has helped speed it up considerably, thank you.

Freemium pricing
Another big change is that I’m moving Metamorphic to freemium pricing, so anyone will be able to use the service for free at a limited capacity. And then paid accounts will go toward supporting free accounts as well as the rest of the service.

Hang tight
If you’re currently in early access, hang tight, things are not yet ready and if you sign in then you’ll quickly see the redesign is still in process. Anyone not in early access can still go ahead and sign up for codes and I will send out more codes once the redesign is further along and the service is more usable.

To dos
There’s so much here. But one of the biggest things once everything is up and running (Portals…) is code refactoring so that I’m not repeating myself so much. :blush:

It’s been quite the journey and, again, it’s just getting started. Thanks and stay tuned! :blue_heart:

2 Likes

Quick update: I have changed the open source repo to not include any files/directories with Petal Pro code in it. I also named such repo metamorphic :blush:. So you can find the code base, sans any Petal Pro code, here.

Sorry for any confusion, and stay tuned! :blue_heart:

1 Like

Fall update 2022

Thank you to everyone who has been following along, signing/signed up, and patiently waiting for Metamorphic to be in a usable beta version (early access → I’m going to just say beta now since it’s way easier :joy:).

I’m doing another redesign (redesign of the redesign) with a stripped down code base and will be launching the beta with just 1 of the 4 features that have been worked on. I’m learning my lesson and working toward having more of a MMP rather than a MVP, which makes way more sense to me as a solo dev team. Having one feature to launch with will make it way easier for me to focus and get one thing right before moving on to the other main features.

So, the launch feature will be Memories.

That being said, as I redo the codebase, I’m realizing just how much work went into getting to just one feature. And all the “tiny” features that Metamorphic has (like passphrase generators, rate limiters, beta invite codes, admin stuff, marketing pages) and the encryption.

I will also be launching it on Fly.io to take advantage of “flying” close to users around the world. Initially will be on the east and west coast of the US.

The awesome discount will still apply to all the signed up early access accounts (thank you for your support :sparkles:).

Here’s a sneak of the redesigned marketing look (thanks to Tailwind):


2 Likes

Update 9/25/2022

We’ve swapped over from Render to Fly officially and running on the east and west coast of the US, currently (ewr and sea) on a pretty minimal setup for now.

note: the marketing video on landing page is a placeholder joke until I make a demo

Fly has been amazing. I’m hopeful this will mean a better experience for people on Metamorphic at the end of the day (especially in the future when we can afford to be around the world). And it’s hopefully more affordable for us on the operations side. :hiking_boot:

Estimated date that I’ll send out the first wave of invite codes for Metamorphic v1 (:thinking:): October 25, 2022.

What’s changed
Will be launching our beta with 1 main feature, Memories, offering free accounts, and a redesigned code base. I have made a decision not to try and bring the database from Render over to Fly. Fortunately, it’s early enough that nobody has started to upload content on Metamorphic (outside of myself and a close circle).

Redesign done
Total redesign of the codebase from scratch with new look and feel. I also discovered that just getting to “1” feature still means a lot of other features.

  • marketing
  • redesign of People (you need to be able to share Memories)
  • refactored and sped up the encryption with one (live_decrypt/5) helper function
  • redesign of the database structs (one reason why I opted not to try and port any existing Render accounts over)
  • settings
  • onboarding
  • add profile option for future sharing possibilities

Redesign still to do
There’s still a little bit more of the People feature left to do before moving on to avatars, roadmap, Memories, Stripe, and data management (e.g. downloading/deleting your data).

  • Avatars
  • Shared Avatars
  • Memories
  • Shared Memories
  • Roadmap
  • Stripe subscriptions
  • Data management
  • marketing video

For existing early access sign ups

I’m sorry for the inconvenience or annoyance. You will have to sign up again. However, just use one of your invite codes (even if you’ve used it for your account) in your sign up message so I can know to apply the super sweet discount to your account when you choose to pay for a subscription. And, yes, that also means that you could share your other codes with 2 other people to give them the same super sweet discount.

New beta/early access sign ups

You can sign up now! New early access sign up accounts will get 40% off their subscription for life.

Thanks everyone for following along and supporting. :blue_heart:

Update October 2022

  • Avatars
  • Shared Avatars
  • Memories
  • Shared Memories
  • Roadmap
  • Stripe subscriptions
  • Data management
  • marketing video
  • add paraxial bot protection

I’m happy to say that now that it’s not the first time I’m implementing ets for the avatars, I seem to have implemented it in a much better way, and the result is the speed and performance I’d hoped for with images.

So, what happens is that we upload the encrypted avatar image to object storage. Then, when someone logs in, it makes the initial object storage request and then decrypts, encodes, and stores the binary in an ets table for that person. All subsequent requests pull from ets and it’s working great so far. :blush:

Edit
As I wrote this, I thought about a possible privacy/security concern of having non-encrypted binaries in ets. So I switched it around to where we store the encrypted blob in ets and then decrypt when we pull it out for the current person. It appears to have the same performance with now encrypted blobs stored in ets. :blush:

When you log out, it clears the binary for that person from ets.

This “bundles” the request time for object storage into the log_in process and makes it much less noticeable as it feels like the usual log in business.

Onward

The next big test is going to see how it performs with sharing avatars (shared_avatars). Then Memories.

We’re getting closer to being MMP ready! I’ve got my hope set for the end of October, but that’s still quite a list left, so it may end up in November or December. Thank you and stay tuned!

1 Like

Update[2] October 2022

  • Avatars
  • Shared Avatars
  • Memories
  • Shared Memories
  • Roadmap
  • Stripe subscriptions
  • Data management
  • marketing video
  • add paraxial bot protection

Shared avatars are finished (for now). We store the encrypted binary in ets like we do with each person’s avatar. We handle the object storage calls in an asynchronous task to not interrupt the page navigation or loading times.

I wrote a little fast blog post with a gif where you can see a demo of how it works.

Definitely not making that first optimistic timeline for opening the beta on October 25. :blush: Memories next. Moving the beta opening to end of November now. Thank you for your support as always! :blue_heart: