* > +

24 April 2026

Updated: 06 May 2026

Run this presentation using:

Terminal window
1
http get https://raw.githubusercontent.com/nabeelvalley/docs/refs/heads/master/src/content/talks/2026/24-04/the-power-of-small-tools.md
2
| sed '1,/^--- presenterm-start/d'
3
| str trim
4
| save presentation.md --force
5
6
cat presentation.md
7
| split row "---"
8
| str trim | parse --regex '`(?<path>.+)`\n\n```(?<lang>\w+)\n(?<content>(.|\n)+)```'
9
| each {|i| echo $i.content | save $i.path --force}
10
11
presenterm presentation.md

--- presenterm-start


options: end_slide_shorthand: true

* > +, Or, the Multiplicative Power of Small Tools

A mindset for working more efficiently


Agenda


Ideas First

The first bit of this is all a bit abstract

Try to be open to the ideas without thinking too much about application right now, we’ll get to that later


A (less-technical) Unix Philosophy

An emergent set of principles within the Unix ecosystem1 with a personal spin

Technology should:

  1. Do one thing. Do it well.
  2. Work well together
  3. Fail early and allow for iteratation
  4. Allow for disposability

Identify Accidental Complexity

Opportunities to work more effectively

  1. The work around your work
  2. Things that you do frequently
  3. Things that are slow
  4. Things that don’t play well together

It’s a Numbers Game

  • A little faster each day adds up pretty quick
  • Composition helps small solutions solve big problems really quickly

How Do We Get Faster?

The terminal, unfortunately

Shell commands are:

  • Fast
  • Repeatable
  • Composable

UI’s are generally none of these things


Let’s Write Some Code

We have a weekly team presentation we want to assign a section to each team member


Some Scripts to Do the Things

We’ll make small generalized tools instead of one big one


Composing the Tools

Do the entire workflow at once

Terminal window
1
cat presentation.md
2
| node extract-headings.js
3
| node assign-team.js
4
| node create-tasks.js "My Task Prefix"

Greater than the Sum of Their Parts

Small tools can be composed in more complex ways

Can you assign these tasks on the fly?

  1. Buy bread
  2. Go to the farmer’s market
  3. Reply to emails
  4. Drop PROD database

Tip: If you’re using helix, this is :| node assign-team.js


More Ideas


Composition with Nushell

Create all the files listed in this presentation

Terminal window
1
cat presentation.md
2
| split row "---"
3
| str trim | parse --regex '`(?<path>.+)`\n\n```(?<lang>\w+)\n(?<content>(.|\n)+)```'
4
| each {|i| echo $i.content | save $i.path --force}

JS Implementations


extract-headings.js

1
import { readFileSync } from 'fs';
2
3
readFileSync(0, 'utf-8').split('\n')
4
.filter(l => l.startsWith('## '))
5
.forEach(l => console.log(l.slice(3)))

assign-team.js

1
import { execSync } from 'child_process';
2
import { readFileSync } from 'fs';
3
4
const members = [
5
'Alice',
6
'Bob',
7
'Charles'
8
]
9
10
readFileSync(0, 'utf-8')
11
.trim()
12
.split('\n')
13
.forEach((t, i) => console.log(`${t}:${members[i%members.length]}`))

create-tasks.js

1
import { execSync } from 'child_process';
2
import { readFileSync } from 'fs';
3
4
if (process.argv.length < 3) {
5
throw new Error("Prefix must be provided")
6
}
7
8
const prefix = process.argv[process.argv.length - 1]
9
10
// this could be the Azure Devops CLI or GitHub CLI or anything really
11
const createTask = (task, assignee) => console.log(
12
execSync(`gh issue create --body "${prefix}" --title "${prefix}: ${task}" --label "${assignee}" --label Presentation`).toString().trim()
13
)
14
15
readFileSync(0, 'utf-8')
16
.trim()
17
.split('\n')
18
.forEach(t => createTask(...t.split(':')))

Alternative Implementations


tools.nu

Terminal window
1
let members = [Alice, Bob, Charles];
2
3
let prefix = "My task title"
4
5
def "extract-headings" [] {
6
$in | grep -e '^## ' | cut -c 4- | lines
7
}
8
9
def "assign-tasks" [] {
10
$in | enumerate | each {|i|
11
let assignee = $members | get ($i.index mod 3)
12
13
({
14
title: $i.item,
15
assignee: $assignee,
16
})
17
}
18
}
19
20
def "create-task" [] {
21
print "Enter task prefix:"
22
let prefix = (input)
23
24
$in
25
| par-each { gh issue create --title $"($prefix) - ($in.title)" --body $prefix --label $in.assignee --label Presentation }
26
27
}

assign-team.cs

1
string[] team = {"Alice", "Bob", "Charles"};
2
3
string? line = null;
4
int count = 0;
5
6
while((line = Console.In.ReadLine()) != null)
7
{
8
var assigned = team[count % team.Length];
9
Console.WriteLine($"{line}:{assigned}");
10
count ++;
11
}

extract-headings.cs

1
string? line = null;
2
while((line = Console.In.ReadLine()) != null)
3
{
4
if (line.StartsWith("## ")) {
5
Console.WriteLine(line.Substring(3));
6
}
7
}

Additional Resources


Footnotes

Footnotes

  1. Wikipedia - Unix Philosophy