惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tor Project blog
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 【当耐特】
G
Google Developers Blog
J
Java Code Geeks
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
Cisco Talos Blog
Cisco Talos Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
I
Intezer
Jina AI
Jina AI
T
Tenable Blog
P
Palo Alto Networks Blog
Project Zero
Project Zero
D
DataBreaches.Net
Hugging Face - Blog
Hugging Face - Blog
The Hacker News
The Hacker News
F
Full Disclosure
Cloudbric
Cloudbric
量子位
H
Heimdal Security Blog
K
Kaspersky official blog
有赞技术团队
有赞技术团队
罗磊的独立博客
V
Vulnerabilities – Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
Recent Announcements
Recent Announcements
WordPress大学
WordPress大学
GbyAI
GbyAI
S
SegmentFault 最新的问题
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
Recorded Future
Recorded Future
Security Archives - TechRepublic
Security Archives - TechRepublic
AI
AI
Webroot Blog
Webroot Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
The Exploit Database - CXSecurity.com
Apple Machine Learning Research
Apple Machine Learning Research
C
Cybersecurity and Infrastructure Security Agency CISA
H
Hacker News: Front Page
Latest news
Latest news

jola.dev

Elixir Cluster 101 | jola.dev How to stop Claude from saying load-bearing | jola.dev Let libraries be libraries | jola.dev Automatically syncing your blog to atproto and standard.site | jola.dev Appreciation for the small web | jola.dev Treating LLMs as programming books Publishing your blog to standard.site in Elixir Generating OG images in Elixir The social contract of writing Highest Random Weight in Elixir bunnyx: a bunny.net Elixir client library Building for the joy of building Running local models on an M4 with 24GB memory How to hit your Claude weekly limit so you can go outside and touch grass Dropping Cloudflare for bunny.net Building a blog with Elixir and Phoenix Stay in the Loop: How I Actually Use Claude Code Ruthless Prioritization: The Path to Delivery Estimates Are More Valuable Than You Think When Software Engineers Think They Need More Focus Time If the Goal is Resiliency, Defensive Programming is Your Enemy The Magic of Daily Pull Requests: Why Smaller is Better Building a Distributed Rate Limiter in Elixir with HashRing Announcing Hex Diff Building Hex Diff Push-based GenStage The Erlang :queue module in Elixir Patterns for managing ETS tables Health checks for Plug and Phoenix The new `Registry.select/2` and what match specs are Elixir String Processing Optimization
CI workflows on Tangled for Elixir | jola.dev
https://jola.dev/about · 2026-07-04 · via jola.dev

Tangled is a Github competitor built on top of atproto. The company behind it is a Finnish startup, situated in Finland, with all servers and data held in the EU. They have taken VC money, but at least conceptually the fact that it's built on top of atproto means that if the strings that came with that cash pull the company in the wrong direction, your data is still yours and you could potentially move it somewhere else.

Continuing down my atproto rabbit hole, I spent some time getting a CI workflow set up for https://tangled.org/jola.dev/annot.at. I couldn’t find any examples of Elixir CI workflows for Tangled so it took some experimenting.

This uses the new microvm engine that was only recently released, which enables us to run a PostgreSQL service in the workflow. By default it only listens on a unix socket, so we have to set some extra configuration there for it to match the standard Phoenix scaffold setup.

when:

- event: ["push", "pull_request"]

branch: ["main"]

engine: microvm

image: nixos

dependencies:

- beam29Packages.elixir_1_20

- beam29Packages.erlang

services:

postgresql:

enable: true

enableTCPIP: true

authentication: |

host all all 127.0.0.1/32 trust

host all all ::1/128 trust

steps:

- name: setup

command: |

mix local.hex --force

mix local.rebar --force

mix deps.get

- name: compile

command: mix compile --warnings-as-errors

- name: format

command: mix format --check-formatted

- name: credo

command: mix credo --strict

- name: test

command: mix test --warnings-as-errors

- name: unused

command: mix deps.unlock --check-unused

The trickiest part was using specific versions of Elixir and Erlang. You can use

dependencies:

- elixir

- erlang

but that gives you an unspecified version of Elixir. It happened to be 1.18 when I tried. Instead, you'll want to find specific NixOS packages to depend on, like the full workflow does.

dependencies:

- beam29Packages.elixir_1_20

- beam29Packages.erlang

The BEAM 29 packages I found here https://mynixos.com/nixpkgs/packages/beam29Packages. This still doesn't give me an exact version, but it was close enough for me.

I don’t have much experience with NixOS so it was a bit of trial and error to get here, but once I got the config right it runs perfect. Here’s an example run https://tangled.org/jola.dev/annot.at/pipelines/28076/workflow/ci.yml.

Now to go figure out how to self-host a knot and a spindle. Don’t have to do that, you can use the servers Tangled offer, but I figure it’s more fun this way.