#wanderland — Public Fediverse posts
Live and recent posts from across the Fediverse tagged #wanderland, aggregated by home.social.
-
Oh my goodness... I've had a full text search endpoint (powered by ripgrep of course) available in the API for ever and only a slug based search in the UI...
No longer
Hit highlighting, floating widget to scroll hits
The search page filters on viewed / updated / created dates, plus passing through all the useful bits to shape the response.
ripgrep is 💜 when ADHD is life ;)
[I wonder if it can find my keys]
-
Ghirija Jayarraj's 'Wanderland' Weaves Dance, Displacement, and Multi-media Narratives
Ghirija Jayarraj's 'Wanderland' performance uses dance, theatre, and film to explore identity, displacement, and family history across Sri Lanka, India, and Australia.
#Wanderland, #GhirijaJayarraj, #DanceTheatre, #DiasporaStories, #MulticulturalArts
https://newsletter.tf/ghirija-jayarraj-wanderland-dance-film-identity/
-
Ghirija Jayarraj's 'Wanderland' performance combines dance, film, and theatre. It explores themes of displacement and identity across Sri Lanka, India, and Australia.
#Wanderland, #GhirijaJayarraj, #DanceTheatre, #DiasporaStories, #MulticulturalArts
https://newsletter.tf/ghirija-jayarraj-wanderland-dance-film-identity/ -
SmolChalk :: if SmallTalk and Erlang had a baby and it was web components for kids and it composed itself out of markdown and YAML
Just a bunch of little things that mostly don't suck all doing their best to give your children a place to learn whatever you can think of, and letting them explore and learn from the environment they're learning in while they do so.
#humantools #computingforlittles #smoldata #smolchalk #wanderland
-
Anyone following along probably has questions about just how the heck we're using a single YAML fence in a Markdown file as shared storage for multiple users?
Well we're not.
The <oculus-fence> Web Component assigns as session id the first time one is called. The rest of them share the same id while until the session expires. The `write_path` method intercepts calls containing X-Wanderland-Client-Id and cuts them their own slice of the universe - an overlay driver tracking an append-only list of updates made by that session.
Replay on read. Multi-player ready. Collision proof updating.
Game on Wayne. Game on Goose
-
It's Monday night, your daughter is at dance and you're stuck in town at the library waiting for her...
[As you do]
You're bored
[As you do]
What do you do?
Goose Pong Mobile
[As you do]
PEEK / POKE / EXECUTE
state = peek('goose-pong:game-state.yaml')
poke('goose-pong:game-state.yaml', state)
execute('goose-pong:board', action='poke_cell', params={'row': ball_row, 'col': ball_col, 'value': '🪩'})
[As you were]
-
"""
Hello World!
"""
--- wanderland, as to you, inviting you to try executable markdown -
"""
Shut-up and take my money!
"""
--- you, after seeing goose-pong played in a Markdown file in a browser===
Wanderland is built on executable Markdown - think Jupyter, but you know... not those bits...
Markdown has ```code-fences, they're normally used for presentation. But semantics are semantics and MDAST is perfectly happy to pop them out of the tree so we'll take advantage of that to turn them into lovely little addressable distributed functions.
And then we'll wrap them in Web Components to bring them to life (or Emacs, or Neovim, or you know... whatever can talk to a simple HTTP API)
<oculus-fence> exposes a function
<oculus-node> exposes some text (in this case a Markdown table standing in as our beer pong table)new-game resets the game
take-turn ... takes a turn ;)Here we go
#emacs #orgmode #jupyter #smoldata #wanderland #devops #devops_you_say_as_a_question_but_of_course_i_say_as_an_answer_distributed_functions_build_platforms
-
"""
How does that make money for business?
"""
--- my mom, a harsh critic+++
Executable Markdown means executable markdown - fences are functions, the file is the I/O surface
-
"""
Ooh...
"""
--- he, after having a go at this===
Wanderland runs on executable Markdown. Code fences become distributed functions. Patterns in the structure of the text become API surfaces (to-do lists, tables, changelogs...).
Lantern is the rendering engine in front of the graph built on custom Web Components with a two phase rendering pipeline: server side they expand with static content and a hydration marker for non-js enabled friends, client side detects the marker and explodes them into lovely rich, interactive control surfaces
Like this one, for running those embedded fences.
Take a Markdown document, write some code in it. Now you have a tool.
Write some prose around it. Now you have a documented tool.
Write a YAML block in it. Now you have a data store.
Run it and push it to git. Now you have an audit trail
Neat
-
"""
Ooh...
"""
--- he, after having a go at this===
Wanderland runs on executable Markdown. Code fences become distributed functions. Patterns in the structure of the text become API surfaces (to-do lists, tables, changelogs...).
Lantern is the rendering engine in front of the graph built on custom Web Components with a two phase rendering pipeline: server side they expand with static content and a hydration marker for non-js enabled friends, client side detects the marker and explodes them into lovely rich, interactive control surfaces
Like this one, for running those embedded fences.
Take a Markdown document, write some code in it. Now you have a tool.
Write some prose around it. Now you have a documented tool.
Write a YAML block in it. Now you have a data store.
Run it and push it to git. Now you have an audit trail
Neat
-
"""
Of course
"""
--- he, answering the obvious question about themability -
When you're building tools, it's important that you meet people where they are.
That means building your core with a surface area that can be consumed as broadly as possible, with as little effort as possible.
That requires careful consideration. Usually, you need to get a lot of people in the room. Make big decisions.
[PEEK/POKE/EXECUTE]
It doesn't have to be hard. What you're going to be doing is going to boil down to one of those things anyways
[Reading/Writing/Rithmaticing]
Make it easy on yourself, smoldata is your data. Little things compose into lovely ones
-
That's better.
I'm not sure why everyone assumes /cyan/ of all colours should be the primary one when 💜 was right there
Here's Neovim doing things that normally only the `org-babel` folk get to do
Wanderland is built on the idea that computing shouldn't be opaque:
See a thing, want a thing, have a thing
In this case, I want to have the code fences in any Markdown node loaded in the graph be fully composable, distributed functions.
So I could run them in my editor.
Or from the CLI
Or so Claude could play along
As you do
Neat
-
Oh Neovim, I didn't forget you
Same API
Same Markdown
Same YAML(slightly different bindings... I need to clean that up)
Oculus is /OK/ at this. Two things I learned.
1. Event source all of the things
2. See 1`wanderland-core` is the result.
As a wise man with nice socks once said "Build back better"
-
Oh my goodness! I forgot about this too
At the core of Wanderland is this thing I call computational Markdown
[think Jupyter without all the hasslee]
Can't be Turing complete without loops and conditionals and in a declarative world, you get there with composition
When you need to test things that need to be a bit fluid well...
When your knowledge graph has RPG semantics, you need a character sheet.
Change one value and the entire thing shifts with it.
Just Markdown with a bit of YAML in it
Neat
-
Carrying on from yesterday's work to make mo' mode lines...
Wanderland uses the idea of Detective Cases to represent tasks. It gives the work a framing that helps get your agent in the mood to dive into things and take a lot of notes if you play along
[the assistant activation space doesn't have to stay where Anthropic wants it to be - they're theatre kids after all, play to their strengths]
A case is a simple object of metadata + events. You can embed a <task-case> node anywhere you need something like that. Cases for sure, but comments on documents, guestbooks on public pages, the wild rantings and ravings on an old man...
And with two Web Components, I've replaced about 1K LOC of hand rolled templating
[and you can drop them anywhere, it's just Markdown with a bit of YAML in it]
Neat
-
If you've never watched a letter based cellular automata try to spell "knowledge", "tasks" and "graph" while you're eating a bowl of ice cream and watching Chuck from the Buy-More play Jack Ryan on TV...
... it's an interesting way to finish off a Friday
-
Documentation drifts, doubly so when Claude's involved
When it matters, it helps to have eyes on
In Wanderland, that means provenance and that means Web Components
On the page, a mode line presents the current document hash, its version and whether or not the contents have drifted since the last checkpoint - because you never know who's might have POKE'd what
Provenance is tracked in the site configuration, release is calculated from the change log
Event source revision control... why not?
-
Knowledge work generates a lot of artifacts - documents, code, tasks, conversations.
Wanderland organizes these as linked nodes in a shared graph... with benefits
It's a graph-native platform for situated knowledge [and it's a lot of fun]
#ruby #selfhosted #platformengineering #wanderland #basicisnotboring
-
Heh... can your microblog do this?
Yes... I'm looking directly at you BlueSky and your "convenient" lack of an edit button
===
Wanderland - just some markdown with a bit of YAML in it
[and yes, there are emacs and neovim keybinds, I'm not an animal]
-
The payoff of using Web Components in your platform is that you can remix and compose them
They're the web equivalent of Lego MindStorms - little computational blocks of joy
Be kind to yourself and make them self contained. Emits and Subscribes, nothing coupled
And then the fun begins
===
I've got a blog that I use to tell stories on how to build things
And it needed to show real specs, so component was needed
And now it's everywhere
[including inside itself
[including inside itself
[including inside itself
<not scrolling any more>
]]] -
"Now", you say, "why the heck aren't you using a real framework React like a grown up?"
"Because", I say, "I have a low tolerance for pain and a high tolerance for extremely empathetic systems, and the most empathetic systems are those the user can compose themselves."
"After all", he concluded, "not everyone works the same and your tools should meet your users where they are. Wherever that might be"
-
There she is in all her glory
Document focused means the control surface should ideally get out da way
That's what mode lines are for.
Wanderland uses a Case system for task tracking
[theatre kids love playing detective]
The mode line injected at the top of the case detail page starts collapsed, but expands to give you access to everything you might need, including links to the rest of the system and beyond
===
Like emacs, which has a completely isomorphic control plane (same API, same surface)
Cuz... why wouldn't you?
-
"""
Well hello there beautiful
"""
--- me, a moment ago, for no reason in particular===
The mode line refactor in progress. Isn't that lovely?
Serif text, dark on cream
Straight lines
Just a splash of colour to draw the eye
Like Gutenburg intended
-
API | CLI | Test
The test fixture is the same as the production config
The test harness is its own application, same format, the YAML loads the YAML that tests itself
[this guy has a thing for YAML]
And you can run it yourself, make sure things are still working
The same configuration projects all three faces, because when it's 2am and you just want to get back to bed, the test is the tool is the thing you need.
-
Fixtures in Wanderland are fully formed applications
Applications in Wanderland are just YAML files
YAML files in Wanderland define routes as boundary chains with conditions
Routes in Wanderland are isomorphic - the engine dispatches the same shape with Rack for HTTP, Commander for CLI and RSpec for testing
Cuz when you've got a platform to support, who's got time to repeat themselves?
-
Mode lines and status bars
Same function, different location. Information at a glance, quick interactions
Wanderland uses modelines as its primary interface mechanism for interacting with documents
Each indicator in the bar maps to one of its expanded functions. Quick access and status
-
This is cool.
AI is going to write stuff. It just is.
You're going to read it, you're going to edit it, you're going to rewrite it when necessary
And then you're going to sign it, just a little hash in the YAML that declares the site
And that little modeline at the top of the page won't let it lie. If the content, drifts that lovely little splash of colour will remind you.
Never fear, hashing API bound to Emacs and Neovim integrations provides an updated hash in your kill ring. Add a new changelog entry and everyone can be sure that your documentation is that good ol' organic, stick to your ribs variety
-
Wanderland :: for when you've got to be really, really, really sure that World heard "Hello!"
[to_addr |from_addr |type_addr] :: a record
[trace | signature] :: a causal chain
[result] :: anything you want it to beSigned, sealed and delivered. Fully auditable Merkle DAG.
Just some Ruby and a bit of YAML where the test is the app is the test and everything is introspectable
What else should we do?
-
Compliance is boring
[Compliance is sexy]
Compliance theater is boring
[Completely agree]
===
Wanderland has compliance built in. The engine cannot execute without generating a fully auditable trace of itself. Boundaries produce context updates as an append-only log.
A single ContextVariable stack accumulates the layers and offers two projections:
- ctx['Value'] -> the last value written to the key
- ctx.Value -> the last event written containing the keySmooth value projection and a causal trace. Same object.
-
org-capture is cool so I stole my favorite part.
1. Visual select in a buffer
<SPC> WCnc [capture selection]2. Staged selection in a buffer with capture (location, buffer mode etc). Ready for contextualization
<SPC> WCns [submit note]
3. The note is added to the parent task
4. The task itself can be embedded as a collection of notes on a parent node in the graph
Project management, change logs, grocery list, just some stuff you *really, really* want to remember?
Just some markdown with a bit of YAML in it
-
FYI - if you want to use caching in a distributed, event sourced system cache the projections as close to their final form as you can. Any further projection by the client aside for aesthetics is just another boundary between two people and the truth
Alice and Bob didn't have a chance.
Not spooky, just bad document management
-
"""
Oh, one of those
"""
--- me, upon finding one of these#wanderland #testdrivengenderdevelopment #testdriveyouruniverse #philosophy
-
🐷squeal squeal squeal🐷
[that's how you say it right?]
When all you know is one algorithm and it's decomposed to squeal everything's just a roll in the mud
-
When you only know one algorithm and you stare at it long enough, it starts to look like something else.
[a hammer]
[[a nail]]
[[[an old friend]]]
[[a coen]]
[[[acorn]]]
[[[[achoo]]]]
[SQL]
[[[[[SIGKOAN]]]]] -
You don't need SAAS.
You don't need the cloud.
You just need the Coen brothers and to pay attention to when The Dude speaks.
===
"""
Love is all you need
"""
--- jesus or summin[other Dude dude]
"""
The rug really holds the room together, everything else is like your opinion man
"""
--- the dude, speaking in metaphor, about the beauty of event sourcing and append only data structures when managing concurrent updates of shared documents in a mixed agentic / human workflow[there you are my pretties]
-
It was a long way to go to get a button back, but it's a lovely little button.
A little web component that's detected if a `task-{uuid}` string appears in the markdown, and indicator of a case to be viewed. So it can be :)
Except the docs are remote and the cases are local.
Ne'er the 'twain shall meet
Until they met a bi-di manifest sync that is
A launch agent on one end, systemd timer on the other.
Mobile interface lets me dictate case notes on the road
Ping when things are connected.
Eventual consistency is good enough for this guys brain
-
Yo... snappy found a new home in neovim
Publish PDFs straight from Wanderland nodes
Or use a YAML fence as a manifest and compose a book section by section
[and yes `- mastodon: "https://tech.lgbt/@graeme/115980236376137957"` is a valid section, shitposts as PDF filler content is my jam yo]
-
"""
guess who's back?
[back again]
snippy's back
[tell your friends]
"""
--- me, a moment ago, vaguely remembering the lyrics to an Em song I've been shitposting for a week===
"""
🐌 Toodles y'all... it's Toodles 🐌
"""
--- snippy, a moment ago, after her glorious resurrection===
"""
my goodness, it's nice to be back
"""
--- my mind, upon returning -
Note to self:
When building cognitive prosthetics to support your own differently abled cognition, do not in fact chase the squirrel so far into the hole on a rebuild that you lose half your damned mind.
Luckily, I'd externalized it to a place of loss before I started
Unfortunately, I must have stored that fact in the half that's been under construction.
```fish
set -x OCULUS_API_URL https://shitposts.dev.local
set -x OCULUS_API_USER theresalwaysanxkcdforthat
set -x OCULUS_API_PASS correcthorsebatterystaple
```Now we just work our way back up the stack
Stuffy
Toodles
Snippy===
We'll be back to shitposting in no time
===
Split view...
neat
-
It's a long way to go for a requirements doc, but I think we've got it
One table, append only
Everything just depends on how you look at it
-
Physics too as it turns out
-
Ooh... fence execution seems to be wired back in...
My 🧸 is back
-
The 🐘s 💙 and 🩷 have been delivered to school.
They'll be back in a few days.
Time to build
🧶 Loom :: Weave Your Thoughts, Warp Your Mind 🧶
===
There's a joke about underestimating the bandwidth of a woody wagon fully loaded with backup tapes
...
Imagine the context compression power of billions of years of biology
Prompt engineering by innuendo === Context engineering by vaguely gesturing
-
Ooh...
This may no longer be a toy
[yes it will]
[[my last one ran an entire information platform]]
[[[this one should be bigger]]] -
🧶 Loom :: Weave Your Thoughts, Warp Your Mind 🧶
It's back yo!
The StreamEngine refactoring continues and I've decided it deserves the moniker
[and I promised my Mom]
Loom :: the engine
Spindle :: the low level API
Weave :: rich textual interface
Tapestry :: the full progressively enhanced web interfaceHere we go
-
Once you find the right algorithms, it's just a matter of applying them in the correct spot.
There's only like two you need two know.
How to fetch stuff
How to splice stuffThis is how to splice stuff. You might have seen it before
-
"""
capabilities are the way to go man
"""
--- yoneda===
I mean, how cool is that.
Just a bunch of markdown documents telling you what they can do
[not what they are]
[[what they can do]]]
[[[it's not the same thing]]]
[[[[youdidknowthatright]]]]
[[[[[SIGKOAN]]]]] -
I loves me a good browser it seems
Traces this time
That should make debugging easier. Pictures for me, API and tools for the 🪿
#engineering #wanderland #devops #devopsendgamewithallthecheatcodesandallthepeace
-
Trust but verify
1/2
We're checking if the seal is valid, but not the content...
🔄
-
We're going to run a little test.
Two nodes:
- one created with a fake provenance seal
- one created withoutI'll approve both to 🍏 Verified and then I'll have a 🪿 with a ✏️ and do 🪿y things to them
[clearly we're having issues listening and following directions this morning]
[[clearly that's the whole point of this aspect of the system]]Lets see how we get on
-
Sorry, I'm happy about this so here's the rest of my vacation slides
Just mock data for now, but I mean how cool is that
markdown > markdown > http > web component < markdown
[pretty sure there's a rabbit in there somewhere too]
The next iteration hydrates those web components right out of... what was that stuff called again?
-
And on this day, our little girl got all growed up 😿
But look at her 🎂
Those can be a bit more markdown when we're done, but that is officially:
1. markdown fences fedding
2. markdown fences feeding
3. fence exection api feeding
4. web components composing
5. markdown dashboardhomoiconic and on and on... amen
[tomorrow we'll finish wiring it all up and see if Polly was in fact the cracker inside all of us all along]
#wanderland #engineering #mybabysallgrowedup #corporateselloutonthestreetsjustagirlinmarkdowninthesheets
-
Well hello there Ms Cache, how are you today?
Unified execution context is a lovely piece of machinery
All fence executions are cached, regardless of caller. All come through the same door, first guy in lights the stove, everyone else takes their boots off and basks in the warmth of a cache it
Nice
Also, new me seems to love a brutalist typewriter theme... sorry
#engineering #wanderland #devops #devopsendgamewithallthepeaceandnoneofthedevops
-
🧦 PIPPI - Pipeline Inspector and Interactive Processor Interface 🧦
The 🐘💙🩷 are here and daddy may have fallen asleep with them for a while
But we've made some progress
Yesterday, we introduced the world to `pippi` our thematically correct and acronymically challenged new friend. She needs a home base from which to conquer the world...
Villa Villekulla is coming...
🌱 Sprout Garden 🌱 for the discerning analyst.
A fully fledged web IDE for visual fence flow programming.
A ```gridflow fence stores the layout of our grid.
Source -> [stuff] -> Sink
===
```gridflow
A1: Source << {ships: {battleship: [a3, a4], submarine: [d3, d4, d5]}}
A2: right-arrow
A3: guess
A4: guess
A5: Sink << {your_battleship}
```
--- battleship or summin`===
We've got meaning on the edges
We've got diffs across runs (we've even got pretty ones)
The fences are like.. whatever (stateless transforms only please)We've even got execution traces down to the fence level in the output
-
Look at at that little thing :)
I love that little thing.
Write some stuff, drop a list in a YAML
🪿 reads it to learn
🐘 reads it to learn
🦸♀️ reads it to learnBest part is I can just click buttons in the bathtub now
Y'all do sit with your thoughts sometimes right?
[no one said you had to keep them inside while you're sitting]