What Elixir related stuff are you doing?

Just used Elixir as my language of choice for a coding assessment for an interview - I got the offer :slight_smile:

Aside from that, working on building a web-based clone of the game Boggle and some web scraping projects.

7 Likes

Working on integrating Astro, a static site generator, in my Elixir app.

Elixir installs Node on the system, then installs the Astro project’s dependencies, launches Astro’s dev server and proxies it and its websocket for hot module replacement, but only when the dev server runs.

That’s a bit of plumbing but will ultimately allow me to edit the site’s content within my Elixir app while making it truly static, meaning that content is persisted in the astro project, and if you were to launch it standalone without my app, your edits would still be there.

Then, of course, trigger a build and push it online.

When I click “change the title”, the title is changed and the scaled down website live-updates. Since everything is proxied there is no open port to Vite (astro’s dev server). Proxying also allows me to check for authentication and authorization in my app. (Is there an user ? Can them edit a website ?)

Next step, drag items from the liveview to the astro website.

7 Likes

Building out library tooling for secure boot, root filesystem verification and disk encryption in Nerves.

Kind of tricky but the hardest parts and the really difficult learning is mostly done.

Getting a lot of mileage out of Igniter to be let the library update the Nerves project it is being installed into. Because the changes end up touching a bunch of config and overriding a couple of defaults.

Ironing out the last kinks and will probably write some docs for it this afternoon.

In the end it will be a library anyone can use.

8 Likes

Documenting how various tools actually modify an existing Elixir project’s source files would be extremely valuable.

1 Like

This will be a big win if more folks adopt Igniter. Because it will be documented in living code which means it should be maintained and all that :slight_smile:

1 Like

Finally getting the hang of OTP specifically Applications and Supervision trees. Never expected it to take this long. But once the connection is made everything flows.

Loving the journey so far :slight_smile:

2 Likes

Listening to Elixir Mentor podcast on LangGraph with Christopher Grainger

1 Like

Published Elixir and Phoenix Security Checklist: 11 Best Practices which did very well, and confirms my belief that most developers are very interested in security, but most security-related content out there is just not written for a developer audience.

Future articles I have in mind:

  • Explaining the security risk of using ImageMagick, Ghostscript, and FFmpeg on your backend. This is a very big deal and I had several people ask about it. Not Elixir specific but certainly relevant for backend devs.
  • I watched a talk by the maintainer of CURL about how he manages the security of the project (linked below), and really liked the “banned functions” list. A common complaint about static analysis for security is that it has too many false positives. I think a better approach for most projects (for example a SaaS app in banking or medicine) is just ban the dangerous functions (binary_to_term, raw, etc). That way when Sobelow/Paraxial.io warns about it, rather than trying to trace the input to determine if its a real vulnerability, the response is “oh yeah that’s banned, lets find a different way to do this”, which I think is a much better approach. This point got a bit long, the point I’m going for is publishing a “list of functions to ban in your Elixir/Phoenix project”.
6 Likes

A GPS tracking application. It’s something like Find My from Apple,but open source and it would work with lots of things like mobile phones, cars, bikes, etc…

2 Likes

I am developing two projects related to collectible books. MintFirsts is a purpose-made online bookstore, whose tech stack is outlined here. Concurrently, I am working on an innovative cataloguing system for traders and collectors, which has the potential to one day evolve into an online marketplace.

3 Likes

I’m developing a small bot for fediverse knightpp/embot: Bot for fediverse that converts twitter posts into fedi statuses - Codeberg.org.
It’s usefulness is questionable, but I had fun developing it.

1 Like

As I feel a like real influenca (pun intended) I got some extra time last week and as a result I started to further polish the dev experience for working with Routex! Too exiting to be silent about it, too premature to announce it officially in Routex - Extension driven superpowers for Phoenix Routes though.

This is all preview, not yet released

New Runtime Features:
Routex now supports extensions to directly hook into LiveView lifecycle events and Plug pipelines, which means it works seamlessly whether you’re building a classic web interface or a dynamic LiveView app. This runtime integration removes the need for extra glue code, making your routing configuration cleaner and more robust.

Fun fact: this new feature is implemented as extensions that inline other extensions hooks. This means that when you don’t want other Routex’ extensions to hook, you simply do not enable Extension.Plugs and Extension.LiveViewHooks! Supporting “simple by default, customizable when needed”

Introducing PutLocale:
The new PutLocale extension is a prime example of these runtime improvements. PutLocale automatically sets the locale for your application by integrating with both LiveView and Plug, and it’s built to support external apps when installed (Gettext, Cldr, Fluent). This ensures that any external services you use to manage locale settings work in harmony with your app’s routing—so your localized content is always in sync without any extra hassle.

Still needs work, but as a POC it works wonders :slight_smile:

New Presets:
I added a set of presets that simplify your configuration even further. These presets give you a ready-to-use setup for common routing scenarios, so you can get up and running faster without having to fine-tune every detail from scratch.

Fun fact: the presets are nothing more than extensions with only the configure/2 callback set and merging a list of default extensions and options with your customs. Another example of
“simple by default, customizable when needed”

Improved Configuration Error Handling & AST Debugging:
We’ve also enhanced our configuration error handling. Now, if there’s a misconfiguration, you’ll get a clear and actionable error message that points directly to the issue. Plus, there’s a new optional config option that writes the processed AST as code to a directory—ideal for debugging custom extensions or just getting a peek under the hood.

With these new features in the code base it’s time to further polish them for version 1.2

2 Likes

i’ve been playing around with carbonite, flop, and flop_phoenix - mainly with toy projects to see how they can (or can’t) be integrated together :person_shrugging:

1 Like

I’m doing some event sourcing and finally getting back into LiveView. Aluta continua :slight_smile:

1 Like

Released an api client for searxng and now building a brave browser api library (actually very excited as goggles seem like a game changer) i also just got a framework riscv board and going to find out if I’m too dumb to get nerves working on it!

2 Likes
  • Optimizing helper generated by Routex extensions to speed up compilation.
  • Auto inlined Plugs and Liveview Lifecycle Hooks provides by extensions.

Learned that you can help the compiler by having 1 function head with 1000 case conditions instead of 1000 function heads (yes, testing with extremes)

New release will bring lot’s of goodies which will make localizing you Phoenix app much faster to setup for those needing the essentials.

2 Likes

Can you explain what you mean by this, @BartOtten ?

1 Like
def f(n) do
  case n do
    1 -> …
    2 -> …
    …
    1000 -> …
  end
end

does compile faster than

def f(1), do: …
def f(2), do: …
…
def f(1000), do: …

With newer versions of Elixir and OTP the difference is less noticable, but does still exist.

3 Likes

Besides the performance: the case statement variant also does not hit a complexity limit. As a result it does compile with the case variant while it does not compile with the function clauses variant.

2 Likes

Wading through multi-tenancy, subdomains, router splitting across domains, phoenix verified routes for subdomains.

2 Likes