Sabitlenmiş Tweet
José Valim
2.5K posts

José Valim
@josevalim
Creator of @elixirlang. Chief Adoption Officer at @dashbit, where we build https://t.co/FK8F4URbVG and https://t.co/xncEVrvWml.
Kraków, Poland Katılım Kasım 2007
97 Takip Edilen55.2K Takipçiler
José Valim retweetledi

Back in April, @josevalim keynoted about "Precision in Type System Design" 🎥 youtu.be/Ay-gnCqDw9o
This September he's back as a keynote speaker - this time at ElixirConf US in Chicago (Sept 10-11).
Register here: #register" target="_blank" rel="nofollow noopener">elixirconf.com/#register

YouTube

English

I am not quite sure yet what to talk about.
One possibility is to live code a set-theoretic type system from scratch, explaining the core data structures and type checking algorithms (which are surprisingly straight-forward).
Thoughts? :D
ElixirConf@ElixirConf
The ElixirConf US 2026 schedule is live! 🎉 Two days, two tracks, 30+ talks - keynotes from @josevalim , @chris_mccord, Quinn Wilton & @ZachSDaniel1. 📅 Sept 10-11 · Chicago & online #schedule" target="_blank" rel="nofollow noopener">elixirconf.com/#schedule
English

@navinpeiris @hugobarauna So you can try using it under External Agents in Tidewave Settings!
English

Hey @josevalim @hugobarauna any plans on enabling grok build in Tidewave? It’s been so fast and so good, it’ll be awesome to have that speed when doing UI stuff via Tide 🙏
English

@brodriguesco Very helpful, thank you for all the examples and answers!
English

@josevalim i've asked claude to slop up an example, it might make things clearer: gist.github.com/b-rodrigues/d2…
English

So all commands by definition have their execution tracked by Nix, you don't need an explicit target like make. I see, thanks!
Quick question: what happens when the command itself go stale? For example, I know to run "mix test" when a test file changes, but how do I force it to re-run when I update the test framework itself?
English

Nix tracks all declared inputs to a derivation. If any of those inputs change, the derivation receives a new hash and is rebuilt. By organizing a project into smaller, modular derivations, only the derivations whose inputs changed (and its children) need to be rebuilt, while unaffected outputs are reused from the Nix store.
English

I am biased (by my own experiences) but I don't think paid programming languages work long term, even Microsoft lost this battle. :( You could build a product around the language, such as Posit’s RStudio or Verum’s Dezyne tooling. Which is annoying because you have to develop, market, and sell something else. The language can be the moat, but it usually can't be the product.
In any case, I'd be more than happy to see you prove me wrong if you go down this road! Best of luck!
English

@VictorTaelin @josevalim could share some thoughts on paid programming language vs open source path
English

@brodriguesco *was changed* => how do you detect a file was changed?
English

@josevalim no any file that was changed would get targeted and trigger a new build
English

@brodriguesco That much is clear! But I thought Nix rules require a target/output to determine which files have changed? You can't say "rerun the files affected by this git diff" or "rerun the files that changed compared to main", right? Think more CI rules vs build system rules.
English

Model verification as a Nix build, each verification rule becomes a derivation over a filtered set of source files (e.g., `src/**/*.rs`, `docs/**`). If only those files change, only the corresponding checks (linters, AST analyzers, LLM reviewers, etc.) are rebuilt (rerun). You get reproducibility, caching, parallelism, and seamless CI integration essentially for free.
English

@brodriguesco Can you expand how Nix solves this, since those commands do not build something? For example, when you run a linter, there isn't an artifact created.
I guess you could write the output of the linter somewhere and use that as a signal, but I'm unsure if that's a good idea.
English
José Valim retweetledi

Three research attempts to build a JIT for the BEAM failed. The one that shipped started as an experiment with zero optimizations: parse bytecode, emit native code, run. That's BeamAsm, it's been the default since OTP 24. New @BeamThereDT with @garazdawi: youtu.be/dT-VmfYz98Q

YouTube
English

Right! Now imagine you have a codebase where you have a backend and front-end app. Would you run *all* tests locally for both on every commit? Or only the ones specific to each app? What if you want to trigger an agent for security review in some sensitive files, how do you trigger that only when said files change?
So I agree the git hook is a good dispatch mechanism, what is missing is a way to encode what runs when files change. It could be a regular script. It could be a higher level abstraction. Then you just tell your git hook to invoke it!
English

@josevalim Just commit after every change. Git hooks solve this and provide other benefits as well.
English

The agent can run them but it is important to have a deterministic entry point to run them at the end of turn, before you commit, on CI, etc. if you are relying only on the agent to call it with PATH, then you can’t be sure it actually ran unless you review the convo (or you introduce sign offs and other ways to verify these).
English

@josevalim Yes, I’m thinking along the same lines. I have a command `just review [PATH...]` where I have a list checks for TS/JS/Elixir/etc.. Just curious how does your agent work if they aren’t allowed to invoke the checks themselves?
English

@kokjinsam I don't want the agent to invoke it! I want the agent to write the code and, once it is done, we run a series of checks based on the changed files. The goal is to make it more deterministic instead of trusting the agent will run it all properly. Does it make sense?
English

@josevalim I think` just <command> [PATH...]` would be a much better fit for coding agents. I had commands like `just <command> --[staged|changed]` but agents somehow never used them much.
English

@kokjinsam Yeah, I have been thinking about it and perhaps a Justfile with attributes like:
[verify(lib/*, assets/*)]
or comments like:
# verify: lib/*, assets/*
would probably be enough. Then you give the output of "git diff" to it so it figures out which commands to run.
English

@josevalim I use a bunch of Justfiles in my projects github.com/kokjinsam/just/
English

@patrickgwsmith Together. In my mind, you use a git diff or similar to detect which files changed, then you figure out which commands to run passing the group of files for that particular command as input. If the command then prefers to run at a time, it can do it by itself.
English

@josevalim Would you want it to analyze everything that changed together or each file in isolation?
e.g. if I change both level.ex and enemy.ex and one imports the other, should it analyze as a whole or review each file independently?
English
José Valim retweetledi

5/ One problem: just-bash is TypeScript. Knock is Elixir.
But a bash interpreter with a thorough test suite is a perfect target for an agent-assisted port. @ivarvong took the bait.
Many tokens later: just_bash, a full bash + virtual FS in Elixir.
github.com/elixir-ai-tool…
English
José Valim retweetledi
José Valim retweetledi

PSA that my good friend @ivarvong has been quietly shipping the ultimate toolkit for building agents in @elixirlang
A virtual bash environment, Python3 interpreter, virtual filesystem, and git client. All in 100% Elixir. 🧵
English

@ZachSDaniel1 100%. Plus kick it off on CI as well and have it only check things that changed compared to baseline, instead of duplicating the same checks and conditions, etc.
English

@josevalim Yeah those are good points. You could also then have `this_thing install claude` and `this_thing install codex` etc. to centralize how to best integrate it into any given harness.
English
