Sign in

DACTAL.org

@dactal.org
16 followers 2 following 55 posts

A notional organization for an experimental query language.

PostsRepliesMedia
DACTAL.org @dactal.org · 22/07/2026
I'm very actively undecided about how I think AI should be used to write code, or really at all, but if you're having AI write apps for you, and want to try having it write them so that their data and algorithms are open to inspection, here's an AI-written Skill for that. dactal.org/dactal.html?...
001
DACTAL.org @dactal.org · 09/07/2026
If you hate punctuation-centric data tools, DACTAL has both bad news and good news for you. furia.com/log/523
000
DACTAL.org @dactal.org · 19/06/2026
Extensions are accumulating. Here's a geo adapter feeding into a weather adapter feeding into a map renderer. Europe .search countries .weather forecast |temp=(.history@1.temperature_2m_max) ...map=(...colorField=temp,width=700,height=700) |data-of
010
DACTAL.org @dactal.org · 18/06/2026
Also casually showing off the columnar browse module I just added...
500
DACTAL.org @dactal.org · 18/06/2026
Query written by a human, but explainable by AI:
130
DACTAL.org @dactal.org · 18/06/2026
Club teammates, but World Cup group opponents? Yes, several. dactal.org?dbname=wc202...
dactal.org
DACTAL
211
DACTAL.org @dactal.org · 31/05/2026
If you haven't learned what >> and << and ~~ do, it's too late because they don't do anything any more.
000
DACTAL.org @dactal.org · 26/05/2026
Lastly, if you think you might like the idea of constructing DACTAL queries within Javascript using named function-calls with verbose parameters, instead of this terse punctuation syntax, you can find out whether you actually do at dactal.org/about_dactal...
dactal.org
DACTAL df
000
DACTAL.org @dactal.org · 26/05/2026
You could already use | with ; to reorder properties. artist|name,id,country; → make those the first three properties Now you can add a trailing ~ to drop the others: artist|name,id,country;~ → make those the only three properties
100
DACTAL.org @dactal.org · 26/05/2026
You can also now use annotators in annotate operations, because duh. These two produce the same results: ...count ...|count In the first one, a new item is created and annotated within the synthesize operation. In the second, the item is created by synthesize, and then annotated by annotate.
100
DACTAL.org @dactal.org · 26/05/2026
| means annotate. || used to mean annotate with literal values. This has been removed entirely. Now you just do that with ~: |artist=~Nightwish
100
DACTAL.org @dactal.org · 26/05/2026
You can also now create multiple objects in one synthesize operation, using semicolons: ...artist=Nightwish; artist=Flight of Icarus
100
DACTAL.org @dactal.org · 26/05/2026
To coerce a literal property, use ~: ...artist=Nightwish → ["Nightwish"] ...artist=~Nightwish → "Nightwish" To suppress the normal automatic "of" property, add a bare ~: ...artist=~Nightwish,~
100
DACTAL.org @dactal.org · 26/05/2026
.... is "synthesize and extract". ...count → an object with a "count" property ....count → a number .... used to have two other unrelated wrinkles: it coerced parameters into literals, and it did not create an "of" property. These have been removed, so now .... just does its actual job.
100
DACTAL.org @dactal.org · 26/05/2026
Short version: .... and || used to make simple properties, but now you do that with ...x=~y and |x=~(y) ... is now called "synthesize", and works the same except you can create multiple items by separating them with ;s .... is now "synthesize and extract", and only adds the auto-traverse behavior
100
DACTAL.org @dactal.org · 25/05/2026
I've made some changes that are either exciting or too geeky to comprehend, depending on how geeky you are. I'll post about them, but if you have any trouble in the meantime, you can use dactal1.js to keep using the previous version.
100
Reposted by DACTAL.org
Every Noise at Once @everynoise.bsky.social · 14/05/2026
And if you want a bizarrely oblique quasi-command-line interface to Spotify and Apple Music at once, there's also dactal.org/curiax.html
dactal.org
DACTAL Apple/Spotify cross-explorer
022
DACTAL.org @dactal.org · 23/04/2026
Everything is a list.
Picture of the difference in DACTAL between picking the top item (:@1) and picking the top group of potentially-tied items (/@found:@1.of).
000
DACTAL.org @dactal.org · 14/04/2026
Let the AI explain the human logic, instead of vice versa.
000
Reposted by DACTAL.org
glenn mcdonald @glennmcdonald.bsky.social · 14/04/2026
There are services that will magically move your music collection from one service to another. But we don't have to put up with secret magic and what if we didn't?
me.spotify user artists.artists
|apple artist=(??sname=(.name)
  .spotify artist catalogs.catalog.tracks.spotify tracks.isrc
  .apple isrc to tracks.tracks
  /artist#(....name,(sname),sortsame),count:@1.key
)
271
Reposted by DACTAL.org
glenn mcdonald @glennmcdonald.bsky.social · 13/04/2026
A "Jump to Recipe" button for software.
001
Reposted by DACTAL.org
glenn mcdonald @glennmcdonald.bsky.social · 01/04/2026
Hmm, what about a query that traverses music services?
153
Reposted by DACTAL.org
Every Noise at Once @everynoise.bsky.social · 08/03/2026
Data navigation. (dactal.org/curiam.html – you'll need Apple Music for this one, and tolerance for a deliberately unadorned state.)
041
DACTAL.org @dactal.org · 05/11/2025
You have a rack with no good Scrabble plays. Which tile is the best to unload? Here's that question asked in DACTAL.
DACTAL query:

DFOYBB_
??rack=(....characters)
?rack.(...unload=_,next=(..(rack),-_,~_....str))
|temp=(.next.possible words),
 7s=(.temp:length=7....count),
 8s=(.temp:length=8....count),
 words=(.temp....count),
 -temp
#(....7s,8s,total),words
000
DACTAL.org @dactal.org · 03/11/2025
The new property on each traversal result gets a copy of the starting item with the traversed property excluded (to avoid loops). The interactive spec/doc/console at dactal.org has examples and tests for this, and everything else.
dactal.org
DACTAL
000
DACTAL.org @dactal.org · 03/11/2025
Structurally tiny but useful addition. Inverting a graph arc can now be done like this: .inverse name>forward property E.g., in data where each album has track objects, but the tracks don't refer back to their album: .album>tracks adds an "album" property to each track while traversing.
100
DACTAL.org @dactal.org · 03/11/2025
Tiny additions. Filtering items that have any, or no, values for a property can now be done with: :property+ :property- as shorthand for the subquery forms: :(.property) :-(.property) But the subquery forms are still needed for any path more complicated than a single property.
000
DACTAL.org @dactal.org · 08/10/2025
I should pretend I designed this feature intentionally, but in reality I just realized that because something/someprop.10 gives us the first 10 items from each group, you can also truncate each group to 10 items in place, like this: something/someprop|of=10
000
DACTAL.org @dactal.org · 02/10/2025
The Gallery now includes a DACTAL Sudoku solver! Or, more accurately, a Sudoku solution-process revealer. dactal.org/dactal.html?...
000
DACTAL.org @dactal.org · 01/10/2025
This may not interest you until you suddenly hit a case where you need it, but you can now short-circuit a traverse operation when it gets its first results, like this: some data.<(.some expensive subquery) instead of running the subquery N times only to throw away N-1 of the results.
000
DACTAL.org @dactal.org · 23/09/2025
Data access for computer programs vs data exploration for humans.
On the left: ATProto API page for the feed.repostedBy endpoint, describing mostly HTTP mechanics.

On the right: `.post reposters` DACTAL extension in the middle of this query:

|reposted by=(.post.uri.post reposters.reposters.handle:-[handle.invalid]);
000
DACTAL.org @dactal.org · 17/09/2025
DACTAL,ATProto.fun
100
DACTAL.org @dactal.org · 30/08/2025
A start/labeling operation can append to the existing list with ?label=+(subquery) ??label=+(subquery) And a start operation can use the value ONLY as a reference with =label =type Thus this form for setting a label if it isn't already set: ??district size=(=district size;~1000)
000
DACTAL.org @dactal.org · 27/08/2025
Sometimes you want (or just need) the results of another query in the middle of the one you're writing. Highlight the subquery and hit Command-U to unpack it.
000
DACTAL.org @dactal.org · 22/08/2025
Saved relative queries let you encapsulate complexity, like AEIODLT .possible words .by added letter And now you can decapsulate it again with command-I (for Inline).
000
DACTAL.org @dactal.org · 19/08/2025
Data parsimony: not our angle.
010
DACTAL.org @dactal.org · 16/08/2025
Also: added regex filtering. And then, only a little later, added documentation of regex filtering.
010
DACTAL.org @dactal.org · 16/08/2025
If it doesn't, what platform/browser? And do you get any console errors?
000
DACTAL.org @dactal.org · 16/08/2025
Everything is always in progress, but this one is a little farther along than the header. Might take a few seconds to load, though.
200
DACTAL.org @dactal.org · 15/08/2025
If anybody can vibe-code embryonic ideas into slick apps, we're gonna get a lot of slick apps sealed airlessly around ideas that never got a chance to become. I want the opposite of that, unslick explorers of exposed exologic. We only start at the beginning. dactal.org/Scrabble.html
221
DACTAL.org @dactal.org · 08/08/2025
In honor of today's relevant word, I have updated the example guesses used in this demonstration query. dactal.org?queryname=Wo...
dactal.org
DACTAL
011
DACTAL.org @dactal.org · 08/08/2025
Yesterday's excellent tiny realization: subtractive traversal is a set-disjunction operation, but subtractive traversal with duplicates is itemwise removal. ...x=(1,1,2,2,3,3),y=(2) .x,-y → 1,3 ..x,y → 1,1,2,3,3
000
DACTAL.org @dactal.org · 01/08/2025
dactal.org/dactal.html?...
000
DACTAL.org @dactal.org · 01/08/2025
On one hand, we already know all the prime numbers below 1000. On the other, here's the Sieve of Eratosthenes in a DACTAL query. dactal.org/dactal.html?...
dactal.org
DACTAL
000
DACTAL.org @dactal.org · 31/07/2025
I give you your carets back. ^ and ^^ for comments have been replaced by ??? for notes, so ^ is no longer a reserved character. ??? your notes here Notes in DACTAL are a null operation, not meta-text, which has some cool implications that I haven't thought of yet.
000
DACTAL.org @dactal.org · 25/07/2025
I moved the inline-math handling to a more sensible place in the resolution process, so now you can use it in traversal, grouping, sorting, or either form of annotation.
000
DACTAL.org @dactal.org · 23/07/2025
Realized and fixed an early-implementation laziness that evaluated :x=y as :(.x:@1:=y) instead of :(.x:=y)
000
DACTAL.org @dactal.org · 21/07/2025
One of my guesses today revealed a bug in this. Gotta use ".." instead of "." in the parse routine to preserve duplicate letter/color pairs in the guess! Here's the difference: dactal.org/dactal.html?...
100
DACTAL.org @dactal.org · 18/07/2025
Oh look, a Wordle solver that fits (kinda) in a URL. dactal.org/dactal.html?...
dactal.org
DACTAL
111
DACTAL.org @dactal.org · 18/07/2025
To go with /@x, which groups consecutive sequences with shared x properties, you can now also do /@@y to group sequences that start with each occurrence of y. E.g grouping streams into listening sessions broken by gaps of more than 10 minutes between songs:
listening sample....pairs
||px=@,
  clock=(....(.pair.ts),timediff);
  this<pair;
  px=(this.px);
  clock=(this.clock);
  silence=[=clock-ms_played];
  restart=(.silence:>60000);
.(.pair:px=1,@2)/@@restart
000