<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: crevilla2050</title>
    <description>The latest articles on Forem by crevilla2050 (@crevilla2050).</description>
    <link>https://forem.com/crevilla2050</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1394073%2F7784f346-7865-45d7-a99b-d0f7e082283f.jpeg</url>
      <title>Forem: crevilla2050</title>
      <link>https://forem.com/crevilla2050</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/crevilla2050"/>
    <language>en</language>
    <item>
      <title>"Behold Dennis The Forge" (or how the chickens helped give DEX a home)</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Sun, 12 Apr 2026 00:34:50 +0000</pubDate>
      <link>https://forem.com/crevilla2050/behold-dennis-the-forge-or-how-the-chickens-helped-give-dex-a-home-da</link>
      <guid>https://forem.com/crevilla2050/behold-dennis-the-forge-or-how-the-chickens-helped-give-dex-a-home-da</guid>
      <description>&lt;p&gt;🐔 From Chickens to Code&lt;/p&gt;

&lt;p&gt;A few weeks ago, I presented a very real problem:&lt;br&gt;
chickens were being unnecessarily sacrificed in the process of applying code transformations.&lt;/p&gt;

&lt;p&gt;Fortunately, after a long and exhausting legal battle, they secured a brand new coop.&lt;/p&gt;

&lt;p&gt;DEX artifacts, however, were not so lucky.&lt;/p&gt;

&lt;p&gt;They still had no home.&lt;/p&gt;

&lt;p&gt;Before Dennis, code refactoring and patch delivery lived in a strange place —&lt;br&gt;
critical, yet obscure. Necessary, yet often chaotic.&lt;/p&gt;

&lt;p&gt;Scripts were written.&lt;br&gt;
Commands were executed.&lt;br&gt;
Changes happened.&lt;/p&gt;

&lt;p&gt;And then… they disappeared.&lt;/p&gt;

&lt;p&gt;Then came DEX.&lt;/p&gt;

&lt;p&gt;A deterministic transformation artifact:&lt;br&gt;
inspectable, transparent, reversible.&lt;/p&gt;

&lt;p&gt;For the first time, transformations could be treated as something real —&lt;br&gt;
something you could hold, examine, verify.&lt;/p&gt;

&lt;p&gt;Not just something you ran.&lt;/p&gt;

&lt;p&gt;But watching the chickens win their case raised an uncomfortable question:&lt;/p&gt;

&lt;p&gt;If chickens could get a home…&lt;/p&gt;

&lt;p&gt;why couldn’t transformations?&lt;/p&gt;

&lt;p&gt;So I built one.&lt;/p&gt;

&lt;p&gt;A place where DEX artifacts can live, be shared, inspected, downloaded, and trusted.&lt;/p&gt;

&lt;p&gt;A place where transformations don’t vanish after execution.&lt;/p&gt;

&lt;p&gt;A place where they become part of a system.&lt;/p&gt;

&lt;p&gt;🔥 Behold: Dennis The Forge&lt;/p&gt;

&lt;p&gt;Behold Dennis The Forge.&lt;/p&gt;

&lt;p&gt;A repository where DEX artifacts can finally live.&lt;/p&gt;

&lt;p&gt;A place where users can upload, store, share, and inspect transformations —&lt;br&gt;
as long as they are marked public.&lt;/p&gt;

&lt;p&gt;This is the first prototype.&lt;/p&gt;

&lt;p&gt;It is not complete.&lt;br&gt;
It is not polished.&lt;br&gt;
And it is definitely missing a few important pieces —&lt;br&gt;
a proper UI diff, online editing, and other goodies that are already on the horizon.&lt;/p&gt;

&lt;p&gt;But the foundation is there.&lt;/p&gt;

&lt;p&gt;In The Forge, users can organize their work into Workspaces,&lt;br&gt;
group related efforts into Projects,&lt;br&gt;
and attach individual DEX artifacts to each of them.&lt;/p&gt;

&lt;p&gt;Today, this structure is simple.&lt;/p&gt;

&lt;p&gt;Tomorrow, it evolves.&lt;/p&gt;

&lt;p&gt;Users will be able to invite collaborators —&lt;br&gt;
individuals, or entire organizations —&lt;br&gt;
and transformations will stop being a solitary act.&lt;/p&gt;

&lt;p&gt;Because that’s the real shift:&lt;/p&gt;

&lt;p&gt;Transformations are no longer just something you execute.&lt;/p&gt;

&lt;p&gt;They become something you share,&lt;br&gt;
something you review,&lt;br&gt;
something you can trust.&lt;/p&gt;

&lt;p&gt;The Forge is already usable.&lt;/p&gt;

&lt;p&gt;You can explore it.&lt;br&gt;
You can upload artifacts.&lt;br&gt;
You can see how this idea behaves in the real world.&lt;/p&gt;

&lt;p&gt;And yes — it will change.&lt;/p&gt;

&lt;p&gt;It will evolve.&lt;br&gt;
It will probably break a few times along the way.&lt;/p&gt;

&lt;p&gt;But that’s part of the point.&lt;/p&gt;

&lt;p&gt;🧩 What the Hex is a DEX?&lt;/p&gt;

&lt;p&gt;But if you are still wondering:&lt;/p&gt;

&lt;p&gt;“What the hex is a DEX?”&lt;/p&gt;

&lt;p&gt;I invite you to read the article with the same name.&lt;/p&gt;

&lt;p&gt;Here’s the short version.&lt;/p&gt;

&lt;p&gt;A DEX artifact represents a transformation.&lt;/p&gt;

&lt;p&gt;It could be a code refactoring patch, a string translation,&lt;br&gt;
or anything that modifies source code at its deepest levels.&lt;/p&gt;

&lt;p&gt;But it’s not just the change.&lt;/p&gt;

&lt;p&gt;It’s a radiography of the change:&lt;/p&gt;

&lt;p&gt;what will happen&lt;br&gt;
where it will happen&lt;br&gt;
how it will happen&lt;br&gt;
and, most importantly - why&lt;/p&gt;

&lt;p&gt;Traceability has always been a problem.&lt;/p&gt;

&lt;p&gt;Changes happen.&lt;br&gt;
Context disappears.&lt;br&gt;
And eventually, nobody remembers who did what — or why.&lt;/p&gt;

&lt;p&gt;DEX changes that.&lt;/p&gt;

&lt;p&gt;Each artifact carries its own lineage.&lt;/p&gt;

&lt;p&gt;Every transformation can be traced, step by step,&lt;br&gt;
back to the very first artifact in the chain.&lt;/p&gt;

&lt;p&gt;And if something goes wrong?&lt;/p&gt;

&lt;p&gt;You don’t guess.&lt;/p&gt;

&lt;p&gt;You don’t patch over the patch.&lt;/p&gt;

&lt;p&gt;You simply revert the transformation — cleanly, in one step.&lt;/p&gt;

&lt;p&gt;This means that any change can be:&lt;/p&gt;

&lt;p&gt;inspected&lt;br&gt;
signed&lt;br&gt;
approved&lt;br&gt;
and only then applied&lt;/p&gt;

&lt;p&gt;In that sense, it may feel a bit like Git.&lt;/p&gt;

&lt;p&gt;But while Git tracks files…&lt;/p&gt;

&lt;p&gt;DEX tracks intent.&lt;/p&gt;

&lt;p&gt;🚀 How to Start Using The Forge&lt;/p&gt;

&lt;p&gt;If you want to try it out, you can already do so:&lt;/p&gt;

&lt;p&gt;📖 Project homepage: &lt;a href="https://www.dennis-forge.com/" rel="noopener noreferrer"&gt;https://www.dennis-forge.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌐 Forge (SaaS): &lt;a href="https://www.dennis-forge.com/repo/" rel="noopener noreferrer"&gt;https://www.dennis-forge.com/repo/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basic flow:&lt;br&gt;
Register (or enter as guest)&lt;br&gt;
Create a Workspace&lt;br&gt;
Create a Project&lt;br&gt;
Upload a DEX artifact&lt;br&gt;
Assign DEX artifact to project&lt;br&gt;
Explore, inspect, and share&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;No magic. No hidden steps.&lt;/p&gt;

&lt;p&gt;Just transformations becoming visible.&lt;/p&gt;

&lt;p&gt;🧠 Why This Matters&lt;/p&gt;

&lt;p&gt;DEX is, at its core, a form of quality assurance.&lt;/p&gt;

&lt;p&gt;Not after the fact.&lt;br&gt;
Not as an afterthought.&lt;/p&gt;

&lt;p&gt;But embedded directly into the transformation itself.&lt;/p&gt;

&lt;p&gt;It ensures:&lt;/p&gt;

&lt;p&gt;traceability&lt;br&gt;
reproducibility&lt;br&gt;
and responsibility&lt;/p&gt;

&lt;p&gt;Now imagine a different workflow.&lt;/p&gt;

&lt;p&gt;Instead of shipping a simple link to a Git repository…&lt;/p&gt;

&lt;p&gt;you could ship the story of the change.&lt;/p&gt;

&lt;p&gt;A complete, inspectable narrative of what happened,&lt;br&gt;
why it happened,&lt;br&gt;
and how it will affect the system.&lt;/p&gt;

&lt;p&gt;Not just code.&lt;/p&gt;

&lt;p&gt;Intent.&lt;/p&gt;

&lt;p&gt;DEX is not trying to replace Git.&lt;/p&gt;

&lt;p&gt;They solve different problems.&lt;/p&gt;

&lt;p&gt;DEX operates alongside your Git project, optionally integrating into your workflow, and focusing only on the transformations that matter—without getting in your way.&lt;/p&gt;

&lt;p&gt;When used inside a Git repository, Dennis can even reuse your existing .gitignore rules to filter out irrelevant files.&lt;/p&gt;

&lt;p&gt;But it does not depend on Git.&lt;/p&gt;

&lt;p&gt;DEX can operate in environments where version control is absent — or simply not allowed — while preserving the same guarantees of traceability and reproducibility.&lt;/p&gt;

&lt;p&gt;Together, they turn delivery into something cleaner,&lt;br&gt;
more transparent,&lt;br&gt;
and far less mysterious.&lt;/p&gt;

&lt;p&gt;🔌 Current Scope (and What Comes Next)&lt;/p&gt;

&lt;p&gt;Right now, Dennis is implemented in Python, and the available transformation engine is focused on Python projects.&lt;/p&gt;

&lt;p&gt;But that’s not a limitation — it’s the starting point.&lt;/p&gt;

&lt;p&gt;The system is designed to be extensible.&lt;/p&gt;

&lt;p&gt;Support for other ecosystems — React, Java, C/C++, PHP, HTML/XML, Go, and more — will come through dedicated plugins that follow the same deterministic principles.&lt;/p&gt;

&lt;p&gt;Today, there is one plugin. Tomorrow, there will be many.&lt;/p&gt;

&lt;p&gt;Because the goal is not to solve transformations for one language.&lt;/p&gt;

&lt;p&gt;It is to define a model that can work across all of them.&lt;/p&gt;

&lt;p&gt;And The Forge?&lt;br&gt;
It’s where those stories begin to live. &lt;br&gt;
For the first time, transformations stop being ephemeral.&lt;/p&gt;

&lt;p&gt;Now the DEX has its own coop.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>saas</category>
      <category>programming</category>
      <category>software</category>
    </item>
    <item>
      <title>The DEX was not a HEX. Why deterministic artifacts depend on deterministic classification</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Sat, 21 Mar 2026 05:29:21 +0000</pubDate>
      <link>https://forem.com/crevilla2050/the-dex-was-not-a-hex-why-deterministic-artifacts-depend-on-deterministic-classification-2728</link>
      <guid>https://forem.com/crevilla2050/the-dex-was-not-a-hex-why-deterministic-artifacts-depend-on-deterministic-classification-2728</guid>
      <description>&lt;p&gt;In a previous article, I introduced DEX — deterministic transformation artifacts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/crevilla2050/what-the-hex-is-a-dex-introducing-deterministic-transformation-artifacts-397d"&gt;https://dev.to/crevilla2050/what-the-hex-is-a-dex-introducing-deterministic-transformation-artifacts-397d&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;"What the Hex is a DEX? Introducing Deterministic Transformation Artifacts"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At the time, it looked like magic:&lt;/p&gt;

&lt;p&gt;scan a codebase&lt;br&gt;&lt;br&gt;
generate a plan&lt;br&gt;&lt;br&gt;
package it&lt;br&gt;&lt;br&gt;
sign it&lt;br&gt;&lt;br&gt;
apply it&lt;br&gt;&lt;br&gt;
undo it  &lt;/p&gt;

&lt;p&gt;No chickens required. No rituals. No late-night debugging séances.&lt;br&gt;
Clean. Surgical. Almost suspicious. But there was a missing piece.&lt;/p&gt;

&lt;p&gt;DEX looks like a packaging format. It isn’t.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Misunderstanding
&lt;/h2&gt;

&lt;p&gt;It’s very easy — dangerously easy — to think:&lt;/p&gt;

&lt;p&gt;“DEX is just a better codemod format.”&lt;/p&gt;

&lt;p&gt;That’s how you end up in trouble. DEX is not about how transformations are stored.&lt;br&gt;
DEX is about whether those transformations make any sense at all. The Real Problem Was Never Extraction&lt;/p&gt;

&lt;p&gt;Let’s rewind.&lt;/p&gt;

&lt;p&gt;You want to internationalize a codebase.&lt;br&gt;
You run a string extractor.&lt;br&gt;
And it obediently hands you… everything.&lt;/p&gt;

&lt;p&gt;"btn btn-primary"&lt;br&gt;
"SELECT * FROM users"&lt;br&gt;
"/api/v1/orders"&lt;br&gt;
"chr_nombre_prod"&lt;br&gt;
"Error al guardar"&lt;/p&gt;

&lt;p&gt;Beautiful.&lt;br&gt;
Accurate.&lt;br&gt;
Completely unhinged.&lt;/p&gt;

&lt;p&gt;Because extraction is easy. Meaning is where things start to fall apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signal vs Noise
&lt;/h2&gt;

&lt;p&gt;Real codebases are not polite.&lt;br&gt;
They are loud, chaotic ecosystems of:&lt;/p&gt;

&lt;p&gt;SQL fragments pretending to be text&lt;br&gt;
CSS classes cosplaying as language&lt;br&gt;
URLs, identifiers, and paths everywhere&lt;br&gt;
binary junk sneaking in like contraband&lt;br&gt;
templating artifacts that look meaningful until they bite you&lt;/p&gt;

&lt;p&gt;If you extract everything, you get noise.&lt;br&gt;
If you filter too aggressively, you lose signal.&lt;br&gt;
If you get it wrong…&lt;/p&gt;

&lt;p&gt;You ship bugs with confidence.&lt;/p&gt;

&lt;p&gt;This Is Where Dennis Actually begins to shine&lt;br&gt;
Before DEX.&lt;br&gt;
Before artifacts.&lt;br&gt;
Before signatures and packaging and all the shiny machinery.&lt;br&gt;
There is a moment where the system has to decide:&lt;/p&gt;

&lt;p&gt;“Is this actually meaningful?”&lt;/p&gt;

&lt;p&gt;Dennis is not just a scanner. It’s a decision engine. And it has opinions.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Clean Engine (the quiet part that does all the work)
&lt;/h2&gt;

&lt;p&gt;Inside Dennis there is a second pass.&lt;br&gt;
No glamour. No marketing slides.&lt;br&gt;
Just judgment.&lt;/p&gt;

&lt;p&gt;It looks at a string and asks:&lt;/p&gt;

&lt;p&gt;is this SQL pretending to be human language?&lt;br&gt;
is this CSS dressed up as meaning?&lt;br&gt;
is this code leaking into text?&lt;br&gt;
is this something a human would actually read?&lt;/p&gt;

&lt;p&gt;And then it makes a decision.&lt;/p&gt;

&lt;p&gt;No guessing.&lt;br&gt;
No vibes.&lt;br&gt;
Same input → same verdict.&lt;br&gt;
Every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Because DEX artifacts don’t store strings. They store decisions that survived scrutiny.&lt;/p&gt;

&lt;p&gt;Now imagine skipping that step.&lt;/p&gt;

&lt;p&gt;You generate a transformation plan straight from raw extraction.&lt;br&gt;
You package it.&lt;br&gt;
You sign it.&lt;br&gt;
You distribute it.&lt;br&gt;
And then you apply it.&lt;br&gt;
What happens?&lt;/p&gt;

&lt;p&gt;CSS classes get rewritten&lt;br&gt;
SQL fragments get “translated”&lt;br&gt;
helpers get injected into places they should never exist&lt;br&gt;
your codebase mutates into something… creative&lt;/p&gt;

&lt;p&gt;Congratulations.&lt;/p&gt;

&lt;p&gt;You have built a perfectly deterministic disaster.&lt;/p&gt;

&lt;p&gt;DEX Needs Clean Input&lt;/p&gt;

&lt;p&gt;This is the uncomfortable truth: DEX is only as good as the decisions that precede it.&lt;/p&gt;

&lt;p&gt;Not the packaging.&lt;br&gt;
Not the signatures.&lt;br&gt;
Not the CLI.&lt;br&gt;
The decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Extraction to Meaning
&lt;/h2&gt;

&lt;p&gt;The pipeline people imagine:&lt;/p&gt;

&lt;p&gt;scan → pack → apply&lt;/p&gt;

&lt;p&gt;The pipeline that actually works:&lt;/p&gt;

&lt;p&gt;scan → decide → plan → package → sign → apply&lt;/p&gt;

&lt;p&gt;That second step?&lt;br&gt;
That’s the whole game.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Better Analogy
&lt;/h2&gt;

&lt;p&gt;People like to say:&lt;/p&gt;

&lt;p&gt;“DEX is like a Git commit + migration + signature.”&lt;/p&gt;

&lt;p&gt;That’s fine. But here’s the one that actually sticks:&lt;/p&gt;

&lt;p&gt;A DEX artifact is to transformations what a container image is to execution.&lt;/p&gt;

&lt;p&gt;And just like containers:&lt;/p&gt;

&lt;p&gt;you still need a clean build&lt;br&gt;
you still need a sane base&lt;br&gt;
you still need a history&lt;br&gt;
and if you mess it up…&lt;br&gt;
you get reproducible garbage at scale&lt;/p&gt;

&lt;h2&gt;
  
  
  The Point of Determinism
&lt;/h2&gt;

&lt;p&gt;Determinism is not about rigidity. It’s about removing surprises.&lt;/p&gt;

&lt;p&gt;Same input:&lt;/p&gt;

&lt;p&gt;same extraction&lt;br&gt;
same decisions&lt;br&gt;
same plan&lt;br&gt;
same artifact&lt;/p&gt;

&lt;p&gt;No ghosts.&lt;br&gt;
No hidden state.&lt;br&gt;
No “it worked on my machine, I swear.”&lt;br&gt;
No excuses.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lineage (or: how to make transformations testify in court)
&lt;/h2&gt;

&lt;p&gt;Determinism gives you consistency.&lt;/p&gt;

&lt;p&gt;Lineage gives you &lt;strong&gt;memory&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every DEX artifact produced by Dennis carries a trace of how it came to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the original inputs
&lt;/li&gt;
&lt;li&gt;the transformation plan
&lt;/li&gt;
&lt;li&gt;the resulting artifact
&lt;/li&gt;
&lt;li&gt;the signatures applied
&lt;/li&gt;
&lt;li&gt;and critically — the hash of the previous state
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each step is chained.&lt;br&gt;
Each artifact knows where it came from.&lt;br&gt;
Each transformation leaves a fingerprint.&lt;/p&gt;




&lt;p&gt;This is not just versioning. This is &lt;strong&gt;forensic lineage&lt;/strong&gt;.&lt;br&gt;
It doesn’t just record history. It makes history verifiable.&lt;/p&gt;




&lt;p&gt;You can take the latest artifact in a chain and walk it backwards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what changed
&lt;/li&gt;
&lt;li&gt;when it changed
&lt;/li&gt;
&lt;li&gt;how it changed
&lt;/li&gt;
&lt;li&gt;who signed it&lt;/li&gt;
&lt;li&gt;and which exact artifact caused it
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No guesswork. No archaeology.&lt;br&gt;
No “who ran that script three weeks ago?”&lt;/p&gt;




&lt;p&gt;And because every step is hashed and linked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;tampering is not just difficult — it’s obvious&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Break the chain, and the artifact tells on you.&lt;/p&gt;




&lt;p&gt;This is where DEX stops being a developer convenience and starts becoming something else:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;a system of record for transformations&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;At that point, you’re no longer just applying changes.&lt;/p&gt;

&lt;p&gt;You’re building a history that can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inspected
&lt;/li&gt;
&lt;li&gt;verified
&lt;/li&gt;
&lt;li&gt;replayed
&lt;/li&gt;
&lt;li&gt;audited
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Or, if things go sideways…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reversed with surgical precision
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Determinism tells you &lt;em&gt;what will happen&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Lineage tells you &lt;em&gt;what already happened&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Together?&lt;/p&gt;

&lt;p&gt;That’s trust.&lt;/p&gt;




&lt;h2&gt;
  
  
  And Then DEX Makes Sense
&lt;/h2&gt;

&lt;p&gt;Once the input is clean:&lt;/p&gt;

&lt;p&gt;the plan becomes inspectable&lt;br&gt;
the artifact becomes trustworthy&lt;br&gt;
the signature actually means something&lt;br&gt;
the undo becomes real, not theoretical&lt;/p&gt;

&lt;p&gt;DEX isn’t the magic trick.&lt;br&gt;
DEX is what happens after you stop lying to yourself about your input.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Shift
&lt;/h2&gt;

&lt;p&gt;Before:&lt;br&gt;
“Let’s run a script and hope this doesn’t ruin everything.”&lt;/p&gt;

&lt;p&gt;After:&lt;br&gt;
“Let’s generate a deterministic plan, inspect it, and then decide if we trust it.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;We’ve learned to version:&lt;/p&gt;

&lt;p&gt;code&lt;br&gt;
dependencies&lt;br&gt;
infrastructure&lt;/p&gt;

&lt;p&gt;But the transformations that shape them? Those usually vanish the moment they run.&lt;/p&gt;

&lt;p&gt;Gone.&lt;br&gt;
Untraceable.&lt;br&gt;
Unrepeatable.&lt;/p&gt;

&lt;p&gt;DEX artifacts don’t just package transformations. They force them into the light.&lt;/p&gt;

&lt;p&gt;And Dennis?&lt;br&gt;
Dennis is still the forge. But the forge was never the interesting part.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crevilla2050.github.io/dennis-forge/" rel="noopener noreferrer"&gt;https://crevilla2050.github.io/dennis-forge/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The real power was deciding what was worth forging in the first place.&lt;/p&gt;

&lt;p&gt;And yes…&lt;/p&gt;

&lt;p&gt;The chickens have been officially retired.&lt;/p&gt;

&lt;p&gt;No severance package. &lt;br&gt;
Negotiations ongoing.&lt;br&gt;
Legal is reviewing the chickens' case.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>refactorit</category>
    </item>
    <item>
      <title>What the Hex is a Dex? Introducing Deterministic Transformation Artifacts</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Fri, 13 Mar 2026 07:11:43 +0000</pubDate>
      <link>https://forem.com/crevilla2050/what-the-hex-is-a-dex-introducing-deterministic-transformation-artifacts-397d</link>
      <guid>https://forem.com/crevilla2050/what-the-hex-is-a-dex-introducing-deterministic-transformation-artifacts-397d</guid>
      <description>&lt;p&gt;Large code refactors usually happen through fragile scripts, regex sorcery, and the occasional ritual chicken.&lt;/p&gt;

&lt;p&gt;What if transformations themselves were portable, inspectable artifacts you could sign, verify, and undo?&lt;/p&gt;

&lt;p&gt;Meet DEX — deterministic transformation artifacts, forged with a tool called Dennis.&lt;/p&gt;

&lt;p&gt;The Problem: Code Transformations Are Usually Chaos&lt;/p&gt;

&lt;p&gt;Software engineers constantly need to transform codebases.&lt;br&gt;
Not just small edits. We're talking about massive structural changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API migrations&lt;/li&gt;
&lt;li&gt;framework upgrades&lt;/li&gt;
&lt;li&gt;localization rewrites&lt;/li&gt;
&lt;li&gt;security patches across hundreds of repositories&lt;/li&gt;
&lt;li&gt;refactors touching thousands of files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of the time these transformations are done with a mix of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fragile scripts&lt;/li&gt;
&lt;li&gt;regex sorcery&lt;/li&gt;
&lt;li&gt;one-off codemods&lt;/li&gt;
&lt;li&gt;questionable search-and-replace rituals involving chickens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And once the script runs… Well.&lt;br&gt;
Good luck.&lt;/p&gt;

&lt;p&gt;You often get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no clear audit trail&lt;/li&gt;
&lt;li&gt;no reproducibility&lt;/li&gt;
&lt;li&gt;no safe rollback&lt;/li&gt;
&lt;li&gt;no way to inspect the transformation beforehand&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: You just ran a very large mutation across your codebase and now you're praying to the CI gods that the chicken satisfied their thirst for bugs.&lt;/p&gt;

&lt;p&gt;But... What If Code Transformations Were Artifacts?&lt;br&gt;
Imagine this: Instead of executing transformations blindly, what if we treated them like first-class artifacts? Something you could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inspect&lt;/li&gt;
&lt;li&gt;verify&lt;/li&gt;
&lt;li&gt;share&lt;/li&gt;
&lt;li&gt;sign&lt;/li&gt;
&lt;li&gt;reproduce&lt;/li&gt;
&lt;li&gt;and even undo (without needing any chickens)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the idea behind DEX.&lt;br&gt;
DEX: Deterministic Transformation Artifacts&lt;/p&gt;

&lt;p&gt;A DEX artifact is a portable package that describes a code transformation in a deterministic way.&lt;/p&gt;

&lt;p&gt;Think of it as something like:&lt;/p&gt;

&lt;p&gt;Git commit&lt;br&gt;
+&lt;br&gt;
migration script&lt;br&gt;
+&lt;br&gt;
cryptographic signature&lt;br&gt;
+&lt;br&gt;
replayable transformation plan&lt;/p&gt;

&lt;p&gt;But instead of being tied to a specific repository state, a DEX artifact describes the transformation itself.&lt;/p&gt;

&lt;p&gt;Inside a DEX artifact you typically find:&lt;/p&gt;

&lt;p&gt;DEX&lt;br&gt;
├── manifest.json&lt;br&gt;
├── payload/&lt;br&gt;
│ └── plan.json&lt;br&gt;
└── signatures/&lt;/p&gt;

&lt;p&gt;The important piece is the transformation plan. That plan describes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which files change&lt;/li&gt;
&lt;li&gt;which lines are modified&lt;/li&gt;
&lt;li&gt;what the original code was&lt;/li&gt;
&lt;li&gt;what the replacement becomes&lt;/li&gt;
&lt;li&gt;which helpers were injected&lt;/li&gt;
&lt;li&gt;the exact hash of the source file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything needed to reproduce the change deterministically.&lt;br&gt;
Given the same inputs, the artifact will always produce the same transformation output. No hidden state, no runtime surprises.&lt;/p&gt;

&lt;p&gt;The Dennis Forge&lt;/p&gt;

&lt;p&gt;DEX artifacts are produced by a tool called Dennis.&lt;br&gt;
Dennis is a deterministic codemod engine designed around a simple philosophy:&lt;/p&gt;

&lt;p&gt;"Transformations should be planned, inspectable, and reversible."&lt;/p&gt;

&lt;p&gt;The workflow looks like this:&lt;/p&gt;

&lt;p&gt;Scan → Plan → Package → Sign → Verify → Apply&lt;/p&gt;

&lt;p&gt;Instead of modifying your project directly, Dennis first generates a plan.&lt;br&gt;
It is safe enough to try at home. No chickens required.&lt;/p&gt;

&lt;p&gt;So... enough theory.&lt;br&gt;
Let’s forge an artifact.&lt;br&gt;
To begin with, clone the small example repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/crevilla2050/hello-dennis
&lt;span class="nb"&gt;cd &lt;/span&gt;hello-dennis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside you will find a minimal Python program:&lt;/p&gt;

&lt;h1&gt;
  
  
  !/usr/bin/env python3
&lt;/h1&gt;

&lt;p&gt;def main():&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;print("Hello world.")
print("Thank you for using Dennis. Love, the Dennis Team.")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;if &lt;strong&gt;name&lt;/strong&gt; == "&lt;strong&gt;main&lt;/strong&gt;":&lt;br&gt;
    main()&lt;/p&gt;

&lt;p&gt;Nothing fancy.&lt;br&gt;
Just two hardcoded strings — exactly the kind of thing that quietly spreads across a codebase until someone eventually says:&lt;/p&gt;

&lt;p&gt;“We should probably internationalize this.”&lt;/p&gt;
&lt;h2&gt;
  
  
  Generating the Transformation Plan
&lt;/h2&gt;

&lt;p&gt;To build a new artifact, once the repository is on your local machine, run the following inside the project folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis plan run &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--dict&lt;/span&gt; messages_en.json &lt;span class="nt"&gt;--add-helper&lt;/span&gt; helper.py &lt;span class="nt"&gt;--target-file&lt;/span&gt; hello.py &lt;span class="nt"&gt;--line&lt;/span&gt; 12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command analyzes the project and produces a deterministic transformation plan describing exactly what changes will occur.&lt;/p&gt;

&lt;p&gt;However, nothing is modified yet.&lt;/p&gt;

&lt;p&gt;Dennis always starts with a plan.&lt;/p&gt;

&lt;p&gt;The plan is simply a JSON document describing the transformation.&lt;br&gt;
You can open it and inspect it directly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Packaging the Artifact
&lt;/h2&gt;

&lt;p&gt;Once the plan exists, you can package it into a DEX artifact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis pack plan.json hello-dennis.dex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point the transformation becomes a portable artifact. It can be shared, inspected, versioned, and stored like any other build artifact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signing the Artifact
&lt;/h2&gt;

&lt;p&gt;DEX artifacts can also be cryptographically signed.&lt;br&gt;
First generate a signing key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis keygen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then sign the artifact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis dex sign hello-dennis.dex &lt;span class="nt"&gt;--key&lt;/span&gt; dennis.key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the artifact contains a verifiable signature proving its origin. If someone modifies the artifact payload and signs it again, older signatures remain inside the artifact as part of its historical record. This creates a chain of custody for transformations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspecting the Artifact
&lt;/h2&gt;

&lt;p&gt;Before executing anything, you can inspect the artifact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis inspect hello-dennis.dex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dennis will display:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;artifact metadata&lt;/li&gt;
&lt;li&gt;payload type&lt;/li&gt;
&lt;li&gt;payload hash&lt;/li&gt;
&lt;li&gt;signatures&lt;/li&gt;
&lt;li&gt;transformation information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows engineers to verify what the artifact contains before trusting it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Applying the Transformation
&lt;/h2&gt;

&lt;p&gt;To execute the transformation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis rehydrate hello-dennis.dex
dennis apply rehydrated-plan.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your Python script will be transformed into a localization-ready structure. Instead of hardcoded strings, the program will now load messages from a dictionary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the Result
&lt;/h2&gt;

&lt;p&gt;You can now try running the program with different language settings.&lt;br&gt;
For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;es python hello.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;de python hello.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The program will automatically load the corresponding translation dictionary.&lt;br&gt;
No chicken magic. Just deterministic, reversible transformations.&lt;/p&gt;
&lt;h2&gt;
  
  
  Undoing the Transformation
&lt;/h2&gt;

&lt;p&gt;Dennis transformations are reversible by design. If something goes wrong, you can generate the inverse plan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis invert rehydrated-plan.json
dennis apply rehydrated-plan.undo.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your project returns to its original state.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No Git resets.&lt;/li&gt;
&lt;li&gt;No archaeology.&lt;/li&gt;
&lt;li&gt;Just a deterministic undo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Encrypted Artifacts: XDEX
&lt;/h2&gt;

&lt;p&gt;In some situations you may want to distribute a transformation artifact without exposing the internal transformation logic.&lt;/p&gt;

&lt;p&gt;For that purpose Dennis supports &lt;strong&gt;XDEX artifacts&lt;/strong&gt;.&lt;br&gt;
An XDEX artifact is simply an encrypted version of a DEX file.&lt;/p&gt;

&lt;p&gt;DEX  →  XDEX&lt;/p&gt;

&lt;p&gt;The payload is encrypted while the outer metadata remains visible.&lt;/p&gt;

&lt;p&gt;This allows organizations to distribute verifiable transformation artifacts while keeping the transformation plan confidential.&lt;/p&gt;

&lt;p&gt;You can encrypt an artifact like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dennis encrypt hello-dennis.dex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why This Matters?
&lt;/h2&gt;

&lt;p&gt;Modern software pipelines treat many things as artifacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;container images&lt;/li&gt;
&lt;li&gt;compiled binaries&lt;/li&gt;
&lt;li&gt;dependency locks&lt;/li&gt;
&lt;li&gt;signed releases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But strangely, code transformations themselves are often invisible. DEX artifacts change that. They turn transformations into portable, inspectable, verifiable objects. Which means software evolution itself becomes something we can track, audit, and reproduce.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;Software history is written through transformations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refactors.&lt;/li&gt;
&lt;li&gt;Migrations.&lt;/li&gt;
&lt;li&gt;Patches.&lt;/li&gt;
&lt;li&gt;Upgrades.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of the time those transformations vanish after they run.&lt;/p&gt;

&lt;p&gt;DEX artifacts make them visible.&lt;/p&gt;

&lt;p&gt;And Dennis is the forge where they are made.&lt;/p&gt;

&lt;p&gt;The forge lives under: &lt;a href="https://github.com/crevilla2050/string-audit" rel="noopener noreferrer"&gt;https://github.com/crevilla2050/string-audit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install with pip or pipx, and start DEX-ing your code.&lt;br&gt;
DEX artifacts turn transformations into something you can pass around, inspect, and trust.&lt;/p&gt;

&lt;p&gt;And may chickens live forever!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F31v4gyf9o2hccx6yat1m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F31v4gyf9o2hccx6yat1m.png" alt=" " width="740" height="740"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>refactorit</category>
      <category>devtools</category>
    </item>
    <item>
      <title>My first Dev.to post: building a deterministic codemod engine (Dennis Forge)</title>
      <dc:creator>crevilla2050</dc:creator>
      <pubDate>Thu, 05 Mar 2026 06:22:32 +0000</pubDate>
      <link>https://forem.com/crevilla2050/my-first-devto-post-building-a-deterministic-codemod-engine-dennis-forge-296n</link>
      <guid>https://forem.com/crevilla2050/my-first-devto-post-building-a-deterministic-codemod-engine-dennis-forge-296n</guid>
      <description>&lt;p&gt;Hello Dev.to!&lt;/p&gt;

&lt;p&gt;This is my first post here, so I thought I would introduce a small open-source tool I've been working on called Dennis Forge.&lt;/p&gt;

&lt;p&gt;The idea behind Dennis came from a very practical problem.&lt;/p&gt;

&lt;p&gt;In one of my projects I ended up with a mixture of translated strings, hard-coded strings, and inconsistent localization logic. Fixing it with quick scripts felt risky, because those scripts modify files immediately and it is difficult to see exactly what they will change.&lt;/p&gt;

&lt;p&gt;I started wondering if there was a safer workflow.&lt;/p&gt;

&lt;p&gt;Instead of modifying code directly, what if the tool generated a plan first?&lt;/p&gt;

&lt;p&gt;That idea eventually became Dennis.&lt;/p&gt;

&lt;p&gt;The core idea: Dennis is a CLI tool that generates deterministic transformation plans for codebases. Simple as that, yet powerful.&lt;/p&gt;

&lt;p&gt;Instead of immediately changing files, the workflow looks like this:&lt;/p&gt;

&lt;p&gt;scan project&lt;br&gt;
→ generate transformation plan&lt;br&gt;
→ inspect or edit the plan&lt;br&gt;
→ validate&lt;br&gt;
→ apply changes&lt;/p&gt;

&lt;p&gt;The plan is stored as human-readable JSON and becomes the source of truth for the transformation.&lt;br&gt;
Because of that, changes are transparent and predictable.&lt;/p&gt;

&lt;p&gt;Some design goals that while building Dennis, I tried to keep a few principles in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deterministic output&lt;/li&gt;
&lt;li&gt;Human-readable plans&lt;/li&gt;
&lt;li&gt;Reversible transformations&lt;/li&gt;
&lt;li&gt;Fully offline operation&lt;/li&gt;
&lt;li&gt;No hidden magic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, Dennis tries to make large transformations inspectable before they happen.&lt;/p&gt;

&lt;p&gt;DEX artifacts&lt;/p&gt;

&lt;p&gt;Recently I added something called DEX artifacts.&lt;/p&gt;

&lt;p&gt;A DEX file packages a transformation plan together with metadata and optional cryptographic signatures. This allows plans to be shared or verified across machines while preserving determinism.&lt;/p&gt;

&lt;p&gt;The idea is still evolving, but it has been a fun architectural problem to explore.&lt;/p&gt;

&lt;p&gt;The project&lt;/p&gt;

&lt;p&gt;Dennis is fully open source.&lt;/p&gt;

&lt;p&gt;GitHub&lt;br&gt;
&lt;a href="https://github.com/crevilla2050/string-audit" rel="noopener noreferrer"&gt;https://github.com/crevilla2050/string-audit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Project page&lt;br&gt;
&lt;a href="https://crevilla2050.github.io/dennis-forge/" rel="noopener noreferrer"&gt;https://crevilla2050.github.io/dennis-forge/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why I'm sharing it&lt;/p&gt;

&lt;p&gt;Partly to introduce myself to the Dev.to community, and partly because I'm curious how other developers approach large refactors or codemods safely.&lt;/p&gt;

&lt;p&gt;If you have experience with tools like this, I would love to hear your thoughts, if you have any comments, suggestions, questions or whatever your heart wants to say, I will be happy to hear from you.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>programming</category>
      <category>python</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
