* > +
24 April 2026
Updated: 06 May 2026
Run this presentation using:
1http get https://raw.githubusercontent.com/nabeelvalley/docs/refs/heads/master/src/content/talks/2026/24-04/the-power-of-small-tools.md2 | sed '1,/^--- presenterm-start/d'3 | str trim4 | save presentation.md --force5
6cat presentation.md7 | 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
11presenterm 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
- A (less-technical) Unix Philosophy
- Identify Accidental Complexity
- How Do We Get Faster?
- Let’s Write Some Code
- More Ideas
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:
- Do one thing. Do it well.
- Work well together
- Fail early and allow for iteratation
- Allow for disposability
Identify Accidental Complexity
Opportunities to work more effectively
- The work around your work
- Things that you do frequently
- Things that are slow
- 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
1cat presentation.md2| node extract-headings.js3| node assign-team.js4| 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?
- Buy bread
- Go to the farmer’s market
- Reply to emails
- 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
1 cat presentation.md2 | 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
1import { readFileSync } from 'fs';2
3readFileSync(0, 'utf-8').split('\n')4 .filter(l => l.startsWith('## '))5 .forEach(l => console.log(l.slice(3)))assign-team.js
1import { execSync } from 'child_process';2import { readFileSync } from 'fs';3
4const members = [5 'Alice',6 'Bob',7 'Charles'8]9
10readFileSync(0, 'utf-8')11 .trim()12 .split('\n')13 .forEach((t, i) => console.log(`${t}:${members[i%members.length]}`))create-tasks.js
1import { execSync } from 'child_process';2import { readFileSync } from 'fs';3
4if (process.argv.length < 3) {5 throw new Error("Prefix must be provided")6}7
8const prefix = process.argv[process.argv.length - 1]9
10// this could be the Azure Devops CLI or GitHub CLI or anything really11const createTask = (task, assignee) => console.log(12 execSync(`gh issue create --body "${prefix}" --title "${prefix}: ${task}" --label "${assignee}" --label Presentation`).toString().trim()13)14
15readFileSync(0, 'utf-8')16 .trim()17 .split('\n')18 .forEach(t => createTask(...t.split(':')))Alternative Implementations
tools.nu
1let members = [Alice, Bob, Charles];2
3let prefix = "My task title"4
5def "extract-headings" [] {6 $in | grep -e '^## ' | cut -c 4- | lines7}8
9def "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
20def "create-task" [] {21 print "Enter task prefix:"22 let prefix = (input)23
24 $in25 | par-each { gh issue create --title $"($prefix) - ($in.title)" --body $prefix --label $in.assignee --label Presentation }26
27}assign-team.cs
1string[] team = {"Alice", "Bob", "Charles"};2
3string? line = null;4int count = 0;5
6while((line = Console.In.ReadLine()) != null)7{8 var assigned = team[count % team.Length];9 Console.WriteLine($"{line}:{assigned}");10 count ++;11}extract-headings.cs
1string? line = null;2while((line = Console.In.ReadLine()) != null)3{4 if (line.StartsWith("## ")) {5 Console.WriteLine(line.Substring(3));6 }7}