Sign in

Bernd Wachter

@bernd.wachter.fi
30 followers 55 following 313 posts

Random ramblings, and writing about my toy projects - Emacs stuff, RFID, remote control, LLM, in any combination. Interested in some of what I'm playing with? I may be available for contracting through my company (bsky.app/profile/aardsoft.fi)

PostsRepliesMedia
Bernd Wachter @bernd.wachter.fi · 29/09/2026
Gab da dieses Video vom Kinburn Spit im Juli. Das waren noch zwei getrennte Systeme.
220
Bernd Wachter @bernd.wachter.fi · 24/09/2026
I've been trying to guide LLMs into interactive Emacs usage for a while, but so far they always refused. Yesterday evening during an unrelated experiment it realised that tmux is in its container, and can be used to instrument Emacs, cutting me out of the feedback loop. Asked it to document it.
Two terminals next to each other, one showing .git directory in emacs, second one a claude code session describing how it got there: 


● Bash(S="tmux -S /tmp/mxsock"; $S capture-pane -t mx -p | sed -n '6p' | cut -c58; $S send-keys -t mx
      Enter; sleep 0.7; $S capture-pane -t mx -p | grep -v '^$')
  ⎿  t
     File Edit Options Buffers Tools Operate Mark Regexp Immediate Subdir Help
       /home/bwachter/git/emacs/emacs-instrumentation/.git: (128 GiB available)
     … +11 lines (ctrl+o to expand)
  ⎿  Allowed by auto mode classifier

● I moved down one line with C-n, then used C-e C-b to land on the last character of .git. Before pressing
  Enter I checked the screen, and the character under the cursor was the t. Enter opened .git in a new
  dired buffer, which lists HEAD, config, description, hooks, info, objects and refs.

  What next?
100
Bernd Wachter @bernd.wachter.fi · 23/09/2026
Shim around freerdp to render to an emacs canvas, with matching bindings on the lisp side. Not very useful yet, but as you can see on the blinking terminal cursor, it is live.
020
Bernd Wachter @bernd.wachter.fi · 22/09/2026
I've been using someone else's page for my daily feeds for more than two decades now, but recently had a need to add more custom stuff. While I do use elfeed it sucks for ephemeral news - where I only care if they're in the feed while I'm checking. So here's my easy to consume feed in emacs:
An emacs buffer showing various news feeds.
110
Bernd Wachter @bernd.wachter.fi · 20/09/2026
Here's a screenshot of a working prototype for a comfyui style node workflow for stable diffusion implemented via org headings and properties, with the diffusion happening in sd.cpp in a separate process, but controlled via emacs.
022
Bernd Wachter @bernd.wachter.fi · 19/09/2026
And that indeed solved the problem, and let's the text part focus on the better text generator:
001
Bernd Wachter @bernd.wachter.fi · 19/09/2026
Here's one run with all of that fixed. Which now leads to the next problem: If the result is <= 18 it seems to be able to do math just fine, with bigger numbers goes off the rails. But on checking it'll know the result is wrong. So for generic math another approach is needed.
100
Bernd Wachter @bernd.wachter.fi · 19/09/2026
They told me jev doesn't chat, which triggered my "hold my beer" reflex.
Org-mode table showing jev interaction, question was "what's 3*6", answer is "it si 18.". rest is metadata/distribution tables:

* what's 3*6?
:PROPERTIES:
:MODE: alphabet
:STYLE: a complete sentence ending with punctuation
:ROUNDS: 10
:TOTAL_IN: 6879
:TOTAL_OUT: 3100
:END:

** Answer

it si 18.
** Rounds
| req | stage | choice  |     p | conf |  in | out | cum in | cum out |
|-----+-------+---------+-------+------+-----+-----+--------+---------|
|   1 | d     | i       | 0.370 | 0.34 | 683 | 310 |    683 |     310 |
|   2 | d     | t       | 0.550 | 0.53 | 685 | 310 |   1368 |     620 |
|   3 | d     | (space) | 0.490 | 0.47 | 685 | 310 |   2053 |     930 |
|   4 | d     | s       | 0.600 | 0.58 | 686 | 310 |   2739 |    1240 |
|   5 | d     | i       | 0.410 | 0.38 | 687 | 310 |   3426 |    1550 |
|   6 | d     | (space) | 0.380 | 0.36 | 687 | 310 |   4113 |    1860 |
|   7 | d     | 1       | 0.930 | 0.91 | 688 | 310 |   4801 |    2170 |
|   8 | d     | 8       | 0.860 | 0.85 | 691 | 310 |   5492 |    2480 |
|   9 | d     | .       | 0.670 | 0.65 | 693 | 310 |   6185 |    2790 |
|  10 | d     | END     | 0.950 | 0.94 | 694 | 310 |   6879 |    3100 |

# END (p 0.950) · answer: it si 18. · tokens in 6879 / out 3100
000
Bernd Wachter @bernd.wachter.fi · 15/09/2026
And that'd be Anthropics Sonnet 4.6. Extremely fast, but costs $2.71, and is not very impressive, so unless @anthropic.com is in the business of sponsoring tokens for weird stuff I'll stick to other models.
Vaguely animal shaped brown blob on green
100
Bernd Wachter @bernd.wachter.fi · 15/09/2026
To compensate for each step reinterpreting the latent from scratch we now allow it to pass some composition notes, which makes the composition quite a bit tighter. Also, glm-5.3-flash seems to be quite a bit better at this than the previously used kimi-k2.6.
AI generated simple flowerAI generated cat like thing
010
Bernd Wachter @bernd.wachter.fi · 14/09/2026
And finally step 10, with the image just before the final result from the top of this post. It'll apply a few minor adjustments, but overall it judges the result as reasonably good. At least kimi is always surprisingly fond of its results.
A somewhat cat like blob on green thing with hints of grass.

Text:
  I applied a series of conservative detail refinements to help the image converge:

  *   **Cat face:** Sharpened the facial region and slightly boosted brightness/contrast to make the features pop.
  *   **Eyes, nose & ears:** Used targeted color blending to deepen the eye pupils, brighten the pink nose, and clarify the ear tones.
  *   **Body:** Added subtle cream/tan blends where the cat meets the grass to suggest the body sitting in the grass rather than just a floating head.
  *   **Grass:** Sharpened the lower region and dropped in a couple of darker green pixel blends to suggest grass-blade texture.
  *   **Artifact cleanup:** Gently blurred the faint ghost/duplicate face artifact in the lower-middle area to keep the composition focused on the single cat subject.
  Done. I refined the late-step details by:

  1. **Sharpening the cat face** (60,40 → 190,150) to crisp up the eyes, nose, and whiskers.
  2. **Softening the transition** between the cat’s lower edge and the grass with a blur, so it looks like the cat is sitting *on* the grass rather than floating.
  3. **Removing the ghost blob** below the face by blurring and tinting it with matching grass color (#4ade80).
  4. **Adding a subtle body shape** (cream circle, alpha 50) beneath the head to suggest a cat sitting upright.
  5. **Injecting fine grass texture** via low-level noise across the lawn area.
000
Bernd Wachter @bernd.wachter.fi · 14/09/2026
Now it entered refining phase. As it needs to rely on text, and do image recognition in each step (unlike sd, which only does conversion at the very end) we allow it to draw circles, rectangles and lines to compensate a bit for the disadvantage.
Figure got ears, whiskers, eyes and a tail.

Text:

  I'm satisfied with the result. The image now clearly shows a cat sitting on green grass, with a recognizable feline face (pointed ears with tufts, vertical pupils, whiskers, pink nose), a rounded body, front paws, and a curled tail. The grass and sky background provide appropriate context, and the small details like eye highlights, ear fuzz, and grass blades give it a pleasant, finished look. I'll stop here.
  Done. In this late detail step I:

  - Sharpened the cat’s face (75,50→185,155) and tail (165,165→210,210) to crisp up the edges
  - Blurred the noisy circular artifact below the cat (radius 2) to smooth residual noise
  - Darkened both pupils with near-black blends at (105,82) and (145,82)
  - Added a pink nose blend at (125,100)
  - Injected subtle noise across the grass (y 140→255) to give it organic texture

  These small, targeted adjustments refine the cat’s features and clean up the grass without disrupting the overall composition before the final step.Figures got very prominent eyes.

Text: 

  Applied subtle detail refinements for step 8/10:

  - Added two small ear circles on top of the head and a pink nose to bring out feline facial structure.
  - Drew faint whiskers on each side of the muzzle.
  - Placed tiny white highlights in the eyes to give them life.
  - Deepened the contrast and sharpened the cat-shaped region so the body pops against the background.
  - Added a soft dark-green shadow circle at the base of the cat to ground it in the grass.
  - Injected light noise over the lower grass area to break up banding and suggest texture.

  These small nudges should help the cat identity emerge more clearly while keeping the overall composition stable for the final steps.
  In this step-8 refinement I:

  1. **Sharpened** the face and body regions to make the cat’s features crisper.  
  2. **Boosted contrast** on the face so the eyes and fur tones pop.  
  3. **Added whiskers** with thin dark lines on each cheek.  
  4. **Defined facial details** — a pink nose, darker eye centers, and a small mouth line.  
  5. **Hinted at ear structure** by blending darker fur into the ear tips.  
  6. **Sketched a tail curve** to the right of the body to suggest a sitting cat posture.  
  7. **Placed a few grass blades** in the foreground to enhance the “green grass” setting.

  These small, targeted nudges should push the noisy blob closer to a recognizable cat sitting on grass as we head into the final steps.Figure got hints of eyes at the edge of the head.

Text:
  Step 7 is the refinement phase — I'll smooth the cat's form, sharpen the facial area, make the grass more coherent, and gently deepen the eye spots.

  ```python
  diffusion-blur-region(buffer='*unhinged-diffusion-a-cat-sitting-on-green-grass*', x1=70, y1=40, x2=190, y2=220, radius=2)
  diffusion-sharpen-region(buffer='*unhinged-diffusion-a-cat-sitting-on-green-grass*', x1=80, y1=50, x2=180, y2=110, intensity=0.2)
  diffusion-adjust-brightness-contrast(buffer='*unhinged-diffusion-a-cat-sitting-on-green-grass*', x1=0, y1=140, x2=255, y2=255, brightness=-5, contrast=0.15)
  diffusion-blend-color(buffer='*unhinged-diffusion-a-cat-sitting-on-green-grass*', x=100, y=75, color='#1a1a1a', alpha=50)
  diffusion-blend-color(buffer='*unhinged-diffusion-a-cat-sitting-on-green-grass*', x=145, y=75, color='#1a1a1a', alpha=50)
  ```
  Looking at step 7/10, the canvas shows a blurry central blob with two dark eye spots against a blue-green background. I need to refine this into a distinct cat on grass. I’ll blur away noise, reinforce the cat’s body and head shapes, darken the eyes, enrich the grass contrast, and sharpen the emerging forms.
100
Bernd Wachter @bernd.wachter.fi · 14/09/2026
Now here for step 6 we see a big limitation of the current PoC: only rectangular regions are supported. So pretty much all denoise or sharpening will overshoot by quite a bit.
Bottom green, grey-blue top, brownish figure made out of balls, in a light rectangle. Text:

  Looking at step 6/10, I can see the rough cat silhouette emerging — two overlapping beige blobs (head and body) centered on a blue-to-green background. I need to refine this into a clearer sitting-cat shape, sharpen edges, and add grass texture.

  Let me:
  1. Reinforce the head and body with better-defined circles
  2. Add ear shapes on top of the head
  3. Smooth and sharpen the cat region
  4. Inject some texture into the grass
  Done. I applied six conservative refinements to steer the noise toward the target:

  1. **Sharpened** the central cat region (`[70,40]` to `[190,200]`) to help the head and body silhouette emerge from the blur.
  2. **Blurred** the horizon band (`[0,90]` to `[255,130]`) to smooth the sky-to-grass transition.
  3. **Blurred** the lower grass (`[0,130]` to `[255,255]`) to reduce noise while preserving the green ground plane.
  4. & 5. Added two subtle, low-alpha **ear circles** (`[105,80]` and `[151,80]`, radius 12) in a darker brown to nudge the cat’s head toward a more recognizable feline shape.
  6. **Boosted brightness & contrast** across the grass to make the green field pop against the subject.

  These changes keep the composition intact while gently tightening the cat’s form and cleaning up the background for the remaining diffusion steps.
100
Bernd Wachter @bernd.wachter.fi · 14/09/2026
It starts getting confident in the overall composition.
Image with green and grey emerging, and more of a brown figure in the middle. Text:

  Looking at the current canvas, I can see the basic composition emerging: a blue sky above, green grass below, and a faint blob in the center where the cat should be. We're at step 5, so it's time to refine the cat's structure and enhance the environment.

  Let me make several small, conservative refinements:
  Applied the step-5 refinement:

  - **Smoothed sky and grass** with radius-2 blurs to reduce noise and unify the background regions.
  - **Added a green tint** to the lower half to push the grass toward a richer green.
  - **Defined the cat silhouette** with two overlapping circles (head and body) plus a central chest rectangle in warm gray-brown, helping the sitting posture emerge.
  - **Boosted contrast and brightness** on the cat region and the grass to make the subject pop against the background.
100
Bernd Wachter @bernd.wachter.fi · 14/09/2026
Canvas, bit less noise, green bar, brownish blob in the middle emerging. Text:

  I reinforced the sky and grass regions with low-opacity color blocks, placed two soft circles for the cat's head and body in the center, and applied a light blur around the subject area to help the shapes coalesce. This keeps the large-scale composition aligned with "a cat sitting on green grass" while leaving room for finer detail in later steps.
  Step 3 composition refinements applied:

  - **Smoothed** the entire canvas with a radius-2 blur to reduce noise and prepare for shape emergence.
  - **Placed sky blob**: faint blue rectangle covering the upper portion (y=0–140).
  - **Placed grass blob**: faint green rectangle covering the lower portion (y=140–255).
  - **Placed cat body**: large soft circle centered near (128, 160) overlapping the grass line.
  - **Placed cat head**: soft circle centered near (128, 105) above the body.

  These low-alpha blobs establish the large-scale layout (sky / subject / ground) without locking in details too early. Ready for the next step.The brown blob emerges into a shape with body and head. Text:

  I applied a set of conservative refinements appropriate for step 4/10:

  - **Sharpened** the central region (where the subject is emerging) with intensity 0.25 to help the cat-like form coalesce without amplifying noise too aggressively.
  - **Placed two soft tan circles** (alpha ≈ 45) to guide the cat’s body (centered near 128,132) and head (centered near 128,92), reinforcing the sitting posture.
  - **Added two faint ear lines** extending upward from the head to give the silhouette a more feline profile.
  - **Brightened and slightly boosted contrast** on the lower grass region (+20 brightness, +0.2 contrast) and the upper sky region (+15 brightness, +0.15 contrast) to make the background/foreground separation clearer.

  These nudges should help the global structure solidify while keeping transitions soft for the later detail steps.
  Looking at the current canvas, I see a very washed-out sky/grass horizon with a ghostly central blob and faint ear lines suggesting a cat. Since this is step 4 (refinement), I’ll gently darken and sharpen the emerging cat form, smooth the artificial horizon line, and subtly reinforce the body/head structure and ears.
100
Bernd Wachter @bernd.wachter.fi · 14/09/2026
For the first few steps it gets told to focus on the overall composition.
Canvas, still lots of noise, but a green bottom bar emerging. Text underneath:

  Step 2 composition refinement complete. I applied a light global blur to smooth the noise, then placed a large sky-blue wash across the upper portion, a green wash across the lower portion for grass, and a soft brown blob in the lower-center to begin forming the cat’s body. These are broad, low-alpha strokes that set up the large-scale structure without committing to detail yet.
  I’ve applied the early-step composition changes to the canvas:

  1. **Blurred the full 256×256 canvas** (radius 2) to smooth the initial noise.  
  2. **Blocked in the sky** with a light-blue rectangle covering the top half.  
  3. **Blocked in the grass** with a green rectangle covering the bottom half.  
  4. **Placed a cat silhouette** using two overlapping brownish circles — a larger body blob sitting on the grass and a smaller head blob above it.

  These are conservative, low-alpha strokes (α 25–35) to establish the large-scale layout. Ready for the next diffusion step whenever you are!
100
Bernd Wachter @bernd.wachter.fi · 14/09/2026
Here are screenshots of the output buffer, showing how kimi-k2.6 stumbles through the "diffusion" steps.
Canvas with gaussian blur, text below: 

  Step 1 composition complete. I’ve placed a pale sky across the upper half, a green grass base across the lower half, and two overlapping earth-tone circles in the center to seed the cat’s body and head. A gentle full-canvas blur was applied so the next steps can begin smoothing those shapes out of the noise.
  I’ve established the large-scale composition for step 1/10:

  - **Sky**: A light-blue rectangle covering the top ~55% of the canvas.
  - **Grass**: A green rectangle covering the bottom ~45%.
  - **Cat blobs**: Two low-alpha gray circles in the middle-lower area suggesting a sitting body and head.

  These are conservative, low-alpha (30) placements that gently nudge the noise toward the target structure without over-committing.
100
Bernd Wachter @bernd.wachter.fi · 14/09/2026
Your stable diffusion toolchain delivers too good results in too little time? I can help. unhinged diffusion provides the harness needed to make any vision enabled, tool using LLM cosplay as stable diffusion in a canvas enabled Emacs.
A weirdly shaped cat thing, LLM generated
100
Bernd Wachter @bernd.wachter.fi · 12/09/2026
At least it gave me an idea for the project name - what I've been using so far wasn't great. No idea yet if that'll even work out in the end, though. So just a small teaser screenshot with the new canvas in emacs.
000
Bernd Wachter @bernd.wachter.fi · 01/07/2026
Kann man ohne PCB zu basteln auf Lochraster zusammenfrickeln wenn man sich ein SOT-23 breakout besorgt. Bild zeigt den CH221K auf so einem breakout.
210
Bernd Wachter @bernd.wachter.fi · 16/05/2026
This is a screenshot of a pcap capture getting started inside of emacs, with life capture in the larger buffer. That's made possibly with a debug/analysis framework called lempo where I just made a pre-release available. I've been developing that as helper for something else - and then realized
Screenshot of emacs, showing:

- a scratch buffer containing (let ((lempo (lempo-get "pcap-bridge-670")))
  (lempo-set-filter lempo "icmp")
  (lempo-set-device lempo "en0")
  (lempo-start-capture lempo))
- a lempo bridge overview buffer containing

======================

Bridge: bridge-default-3854
  Protocol Type:  pcap-bridge
  Device UID:     pcap-bridge-670
  Device TTY:     nil
  Virtual TTY:    nil
  Status:         running
  TX Bytes:       0
  RX Bytes:       0


Press 'q' to close this buffer

and a large buffer showing pretty printed and partially decoded pcap captured ICMP packages
100
Bernd Wachter @bernd.wachter.fi · 09/05/2026
The jackdaws started hatching. You can follow the whole thing over at www.youtube.com/@jackdaw-cam...
Jackdaws in the process of hatching.
000
Bernd Wachter @bernd.wachter.fi · 01/05/2026
I have jackdaws in my chimney this year as well - and this time I didn't miss the beginnings. They've been walking around the garden, examining suitable materials for weeks now, and only few days ago lied their eggs. They're still fine tuning the nest, containing 5 eggs now.
200
Bernd Wachter @bernd.wachter.fi · 24/04/2026
My defuns and defvars now also show up in the javascript namespace. Had to do that twice - once done remembered that JS is more picky about identifiers, and wouldn't like function names like my-fun, my/fun or even bar-<=-foo, and therefore needs some name conversion.
Browser debug console and popup, showing lisp defuns, and calling them as js objects in the browser console.
000
Bernd Wachter @bernd.wachter.fi · 24/04/2026
Next goal far this browser extension: Get the percentage of typescript to under 40%.
Screenshot of githubs 'Languages' overview:

- typescript 72.3%
- common lisp 15.2%
- emacs lisp 12.5%
010
Bernd Wachter @bernd.wachter.fi · 23/04/2026
Got a bit annoyed about having to use js/ts for writing browser extensions. Then had a thought that it should be possible to write a simple lisp in ts, and expose symbols both ways - so once I'm done with that I don't have to touch much ts. Then noticed I'd want the ability to eval in browser. So...
Browser screenshot, showing an extension button with popup, text in there:

;; Type Lisp Here
(+2 2)

The status line shows the evaluation result 4.
300
Bernd Wachter @bernd.wachter.fi · 09/04/2026
I was playing a bit with changes to LLM agents in Emacs and various local models, with all my tools enabled. I've asked qwen3-coder to give me an overview of the project it was started from - and it decided the best use of the available tools was to just write an email.
Screenshot of a new mail in Gnus with the text "What is the current project directory and its status in Emacs?"
000
Bernd Wachter @bernd.wachter.fi · 22/02/2026
From the other side.
110
Bernd Wachter @bernd.wachter.fi · 30/12/2025
Very quick and dirty proof of concept of a flow graph used as network diagram in Emacs. I was recently thinking that doing text based flow graphs with nice exporters natively in Emacs shouldn't be that hard - and indeed the layouting is the most painful part here (and quite broken, as you can see).
A screenshot of Emacs showing a simple network graph
110
Bernd Wachter @bernd.wachter.fi · 13/12/2025
And it talks to me. I've recycled my json in/out daemon for libnfc, ripped out nfc functions and glued some tty handling in, and added debug functions to check command building. Second command is sending the reset to the actual device, with device response.
terminal  screenshot:

@goodmold:uhf-rfid-daemon(master)% ./test-build-command.sh reset
Request:  {"id":1,"cmd":"build_command","command_byte":"reset","address":0}

Response: {"type":"response","id":1,"status":"ok","data":"A0:03:00:70:ED"}

Built command: A0:03:00:70:ED

Ready to send to device with:
  echo '{"id":1,"cmd":"tty_write","data":"A0:03:00:70:ED"}' | /Users/bwachter/git/emacs/nfc-mode/uhf-rfid-daemon/build/uhf-rfid-daemon -t /path/to/device
@goodmold:uhf-rfid-daemon(master)% echo '{"id":1,"cmd":"tty_write","data":"A0:03:00:70:ED"}' | /Users/bwachter/git/emacs/nfc-mode/uhf-rfid-daemon/build/uhf-rfid-daemon -t /dev/cu.usbserial-110
{"type":"response","id":1,"status":"ok","data":"A0:04:00:70:10:DC","bytes_read":6,"bytes_written":5}
000
Bernd Wachter @bernd.wachter.fi · 11/12/2025
Some more LLM time later to translate the Chinese comments I now have code with comments I can read, and log output when running the app I can read. I accidentally killed the chinese UI along the way, but I can live with that.
App launched via java -cp, showing some chinese output in the logApp launched as jar, showing only english output
110
Bernd Wachter @bernd.wachter.fi · 11/12/2025
There are some maven leftovers in there as well. So shouldn't be too hard to make that buildable. LLMs are pretty good at doing those easy yet time consuming tasks. So 2 minutes of my own time, $1.50 of claude credits, and some longer real time later it builds, and I get a .jar
Claude code summary, showing $1.49 spent, in 29 minutesLast lines of maven build output, showing success
100
Bernd Wachter @bernd.wachter.fi · 11/12/2025
So let's decompile the classes with jd-gui. Wait, what's that .java file doing there...? Yep, they did indeed include their java sources as well.
jd-gui file dialog showing .class files... and some .javaDirectory listing showing all .java filesScreenshot of the main java file with chinese comments
100
Bernd Wachter @bernd.wachter.fi · 11/12/2025
And it indeed properly works out of the box on Linux and OS X with java -cp:
Screenshot showing the reader software indeed works on OS X
100
Bernd Wachter @bernd.wachter.fi · 11/12/2025
One unzip later - turns out it is. And they're nice enough to ship the serial library for pretty much any OS and CPU relevant in the last 25 years in there. It's open source, so would be possible to replace - but still would add some annoyance to resolve missing libraries as first step
Directory listing showing files from an .exe as a wrapped java application
110
Bernd Wachter @bernd.wachter.fi · 10/12/2025
Now also with fancy voltage and current graphing, doubling as showing off hook functionality.
Screenshot showing Emacs connected to a Peaktech lab power supply, with a second window showing current and voltage graph
020
Bernd Wachter @bernd.wachter.fi · 09/12/2025
A while ago I wrote PeakTech about protocol documentation for the 6070 PSU - never got a reply. But seems they heard it - when I looked for the Windows software to reverse the protocol spotted new protocol documentation. So, here's the Emacs integration: github.com/bwachter/pea...
Screenshot of Emacs connected to a Peaktach P6070 PSU
110
Bernd Wachter @bernd.wachter.fi · 06/11/2025
Not being able to figure out why some slot related queries return strange errors has been bugging me for the last few days. Turns out, if you just spend the effort to make a nice protocol logger you'll spot the off by one error (my sense type structure didn't have the no value) within seconds.
Emacs screenshot, three buffers visible. Left, elisp with protocol constants for the chameleon ultra. Right a connection to a chameleon ultra, bottom protocol debugging.
110
Bernd Wachter @bernd.wachter.fi · 02/11/2025
Slowly getting to the point where this thing is more useful than the official cu GUI (apart from encrypted tags, but that shouldn't be too hard) - already had pulling from a slot into nfc-mode working, now I have reader registration, and can directly write to any slot from a NFC file.
Emacs screenshot with connection to chameleon ultra, Slot 5 shown as emptyEmacs screenshot with nfc mode open, and reader selection displayed, showing the chameleon ultra as 9 readers (physical reader + 8 slots)Another screenshot of emacs with the chameleon ultra reader interface, now showing slot 5 populated
010
Bernd Wachter @bernd.wachter.fi · 02/11/2025
Left one read by chameleon ultra (native elisp protocol implementation), right one by libnfc (communication to emacs via small c++ shim). Seems apart from swapped bytes for ATQA I got it right.
Emacs screenshots showing two NFC dumps side by side.
010
Bernd Wachter @bernd.wachter.fi · 28/10/2025
Small demo - from within emacs, with a libnfc supported reader: search for tags, read one ntag, mark it for comparison, read a second ntag, mark it, arrange the marked windows, and toggle through the different diff visualisation modes (non-matching, matching, blocks, bytes)
000
Bernd Wachter @bernd.wachter.fi · 28/10/2025
As currently I just care about tag contents of mostly fully unencrypted tags the CU (even though the implementation works surprisingly well) was a bit overkill. So I decided to see if I can make use of the cheap libnfc supported readers I have here - which seems to work reasonably well.
Screenshot of emacs, showing a buffer with a libnfc based tag reader, and a second buffer with a read tag
000
Bernd Wachter @bernd.wachter.fi · 28/10/2025
I guess Outlook is calling for a revolution with that new icon design? Socialist fist image for comparison.
Outlook icon looking like a stylized fistSocialist fist image for comparison
000
Bernd Wachter @bernd.wachter.fi · 26/10/2025
Starting to look promising - seems I can find tags now from within Emacs
Emacs mode for Chameleon Ultra, showing device settings and scan result finding one HF tag
000
Bernd Wachter @bernd.wachter.fi · 26/10/2025
I mostly prefer the proxmark3 over Flipper zero/Chameleon Ultra due to its maturity - but the pm3 approach to its serial protocol makes 3rd party clients a bit of a mess. CU did it better from the beginning - so a basic Emacs client is trivial. Goal is to hook it into the analysis mode later on.
An Emacs screenshot showing the status of a connected Chameleon Ultra
100
Bernd Wachter @bernd.wachter.fi · 26/10/2025
The insecure hotel key mess annoyed me enough to start building a (still very broken) emacs mode to help with working on NFC dumps.
Screenshot of Emacs showing 4 parsed NFC dumps with differences highlighted
010
Bernd Wachter @bernd.wachter.fi · 11/10/2025
Some random product developer: "Hey, the manufacturer recommends those NFC tags for locking systems" (Two locks in on this trip, two absolutely botched implementations)
Screenshot, listing Applications as "Industrial: Inventory and Supply Chain Management, Smart Label"
000
Bernd Wachter @bernd.wachter.fi · 09/10/2025
Vingcard Classic RFID doesn't even use the abysmal copy protection you can get from ultralight. Wondering if that's due to them being an upgrade to the mag stripe readers, or if the standalone ones are just as bad. The 2018 paper points to at least some lack of forethought.
101
Bernd Wachter @bernd.wachter.fi · 24/08/2025
0120
Bernd Wachter @bernd.wachter.fi · 17/08/2025
I have a hunch something might be wrong with this Arduino Every. To its credit, it did keep printing debug logs on serial until it reached roughly 170 degrees, and after letting it cool for a bit did so again. So I guess I just stick a heatsink on and see which pins are still working?
Thermal image showing the AVR on an Arduino Every reaching 193 degrees Celcius.
000