shithub: rc

Download patch

ref: f3afdf563f784c0a5703496f48c1a72dff4617f4
author: thedaemon <thedaemon@9skull>
date: Fri Dec 6 16:26:07 EST 2024

test

--- /dev/null
+++ b/9fs
@@ -1,0 +1,138 @@
+#!/bin/rc
+# 9fs filesystem [mountpoint] - srv & mount filesystem, usually from plan 9
+
+rfork e
+switch($1){
+case ''
+	echo usage: 9fs service '[mountpoint]' >[1=2]
+	exit usage
+case 9fat esp pidos dos
+	if(~ $#2 1)
+		part=`{ls $2 >[2]/dev/null}
+	if not if(~ $1 pidos)
+		part=`{ls /dev/sdM*/dos >[2]/dev/null}
+	if not
+		part=`{ls /dev/fs/$1 /dev/sd*/$1 >[2]/dev/null}
+	if(~ $#part 0) {
+		echo 'no '$1' partition found' >[1=2]
+		exit no.$1
+	}
+	part=$part(1)
+	
+	if(! test -f /srv/dos)
+		dossrv >/dev/null </dev/null >[2]/dev/null
+	
+	unmount /n/$1 >/dev/null >[2]/dev/null
+	mount -c /srv/dos /n/$1 $part
+	if(~ $1 9fat){
+		unmount /n/9 >/dev/null >[2]/dev/null
+		mount -c /srv/dos /n/9 $part
+	}
+case dump other
+	mount -C /srv/boot /n/$1 $1
+case sources
+	srv -nqC tcp!9p.io sources /n/sources
+case sourcesdump
+	9fs sources
+	mount -nC /srv/sources /n/sourcesdump main/archive
+case sourcessnap
+	9fs sources
+	mount -nC /srv/sources /n/sourcessnap main/snapshot
+case atom
+	srv -nq tcp!atom.9atom.org atom && mount -nC /srv/atom /n/atom atom
+case atomdump
+	9fs atom && mount -nC /srv/atom /n/atomdump atomdump
+case 9pio
+	srv -nq tcp!9p.io 9pio && mount -nC /srv/9pio /n/9pio
+case 9front
+	9fs tcp!9front.org!9000
+	for(i in 9front fqa iso lists sites extra)
+		bind /n/9front.org!9000/$i /n/$i
+case 9contrib
+	9fs contrib.9front.org /n/contrib
+case 9grep
+	9fs tcp!9front.org!7734
+	bind -b /n/9front.org!7734 /n/lists
+case 9registry
+	srv tcp!registry.9p.zone!6675 registry /n/registry
+case 9disk
+	srv -c tcp!9p.zone!9991 9p.zone.disk /n/disk
+case 9chat
+	srv tcp!chat.9p.zone!9990 gridchat /n/chat
+case sdf
+	srv -nq tcp!9p.sdf.org sdf && mount -nC /srv/sdf /usr/sdf
+	bind -a /usr/sdf/bin /bin
+	bind -a /usr/sdf/rc /bin
+
+# arbitrary venti archives
+case vac:*
+	vacfs <{echo $1}
+case *.vac
+	if (test -e $1)
+		score=$1
+	if not if (! ~ $1 /* && test -e $home/lib/vac/$1)
+		score=$home/lib/vac/$1
+	if not if (! ~ $1 /* && test -e /lib/vac/$1)
+		score=/lib/vac/$1
+	if not {
+		echo $0: $1: no such score file >[1=2]
+		exit 'no score file'
+	}
+	vacfs -m /n/`{basename $1 .vac} `{cat $score}
+
+case kfs
+	if(! test -f /srv/kfs) disk/kfs
+	mount -c /srv/kfs /n/kfs
+
+case wiki
+	srv -m 'net!9p.io!wiki' wiki /mnt/wiki
+
+case *!snip
+	srv -cnmq tcp!^`{echo $1 | sed 's/snip$/17037/'} $1 /n/$1
+
+# Shortcut for 9srv
+case 9srv
+	srv -q tcp!9srv.net 9srv /n/9srv
+
+# plan9 pastebin
+case 9paste
+	srv -n fs.9paste.net 9paste /n/9paste
+
+# Our other is a fossil with snapshots (but no dumps).
+case other
+	9fs 9srv
+	mount -cC /srv/9srv /n/other other/active
+case othersnap
+	9fs other
+	mount -C /srv/9srv /n/othersnap other/snapshot
+# That "other" has a bunch of CD/DVD images. Shortcut to mount.
+case cd
+	if(~ $#* 1)
+		echo 'Please specify a cd image.' >[1=2]
+	if not {
+		9fs other
+		9660srv 9660.^$user
+		mount /srv/9660.^$user /n/^$2 /n/other/^$2^.iso
+	}
+
+# Cooperating unix hosts
+case ssh:*
+	if(test -e $home/lib/uname) {
+		t=`{echo $1 | sed 's/^ssh://'}
+		user=`{grep '^'$t'	' $home/lib/uname | sed 's/'$t'	+([^@]+)@.+$/\1/'}
+		host=`{grep '^'$t'	' $home/lib/uname | sed 's/'$t'	+[^@]+@(.+)$/\1/'}
+	}
+	srvssh -u /1/bin/u9fs $host $t /n/$t
+
+case nntp:* 
+	t=`{echo $1 | sed 's/^nntp://'}
+	nntpfs -m /n/$t $t
+
+case *
+	switch($#*){
+	case 1
+		srv -m $1
+	case *
+		srv -m $1 $1 $2
+	}
+}
--- /dev/null
+++ b/9paste
@@ -1,0 +1,22 @@
+#!/bin/rc -e
+rfork en
+
+# usage: 9paste [.suffix] <file
+# eg: topng </dev/screen | 9paste .png
+
+if(! test -e /n/9paste/none)
+	9fs 9paste
+
+suf=$1
+if(~ $"suf .png .jpg .jpeg .gif)
+	t=I
+if not
+	t=0
+x=`{randname}^$"suf
+f=/n/9paste/none/$x
+
+cat >$f
+
+echo http://www.9paste.net/none/$x^'
+'^gopher://gopher.9paste.net/$t/none/$x^'
+'^$f >[1=2]
--- /dev/null
+++ b/9psdf
@@ -1,0 +1,12 @@
+#!/bin/rc
+# 9psdf - access files on 9p.sdf.org
+# usage: 9psdf
+
+if(! test -d /usr/sdf){
+	mkdir /usr/sdf
+}
+
+rimport -p -u $user 9p.sdf.org / /n/sdf
+bind -a /n/sdf/usr/sdf /usr/sdf
+bind -a /usr/sdf/bin /bin
+bind -a /n/sdf/usr/$user/html $home/www/sdf
--- /dev/null
+++ b/9void
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+rcpu -h 192.168.0.101
--- /dev/null
+++ b/Bp
@@ -1,0 +1,2 @@
+#!/bin/rc
+B `{walk -f $1 | dmenu -b}
--- /dev/null
+++ b/a
@@ -1,0 +1,2 @@
+#!/bin/rc
+acme -l /usr/thedaemon/docs/acme.dump
--- /dev/null
+++ b/anonradio
@@ -1,0 +1,2 @@
+#!/bin/rc
+hget http://anonradio.net:8000/anonradio | play
--- /dev/null
+++ b/backup.rc
@@ -1,0 +1,23 @@
+#!/bin/rc
+# By jgstratt
+# Just cd into the dir you want to backup and run. Defaults to /mnt/term/rw/. If you want to write to another location, set the "tar_dir" env veriable.
+
+tardir='/mnt/term/rw'
+backdir=`{pwd}
+
+# Overwrite defaults with env, if they exist
+if ( test -s /env/tar_dir ) {
+   tardir=$tar_dir
+}
+
+# Overwrite with args, if they exist
+switch($1){
+case -t*
+   tardir=$2
+case -d*
+   backdir=$2
+}
+
+date=`{date -f YYYYMMDD}
+basebackdir=`{basename $backdir}
+tar czf $tardir/$date.$basebackdir.tgz $backdir
--- /dev/null
+++ b/bandcamp
@@ -1,0 +1,94 @@
+#!/bin/rc
+# data matches 'https://[^.]+\.bandcamp.com/(track|album)/[^ /]+'
+# plumb start window -scroll bandcamp $data
+if(! ~ $1 https://?*.bandcamp.com/^(track album)^/?*){
+	echo 'usage: bandcamp https://artist.bandcamp.com/(track|album)/name' >[1=2]
+	exit usage
+}
+{echo $1; hget $1} | awk '
+	BEGIN{
+		getline
+		sub("^https:/", "/tmp/mp3")
+		if(sub("\.bandcamp\.com/track", "/singles")){
+			single = $0
+			system("mkdir -p `{basename -d "single"}")
+		}
+		else{
+			sub("\.bandcamp\.com/album", "")
+			dir = $0
+			system("mkdir -p "dir)
+		}
+		RS = "{"
+	}
+	!single && /"@type":"ListItem"/{n++}
+	!single && match($0, /"@id":"[^"]+\/track\/[^\/"]+/){
+		track[n] = substr($0, RSTART, RLENGTH)
+		sub(".+/", "", track[n])
+	}
+	/"name":"file_mp3-128"/{
+		match($0, /"https?:\/\/[^"]+/)
+		if(single){
+			src = substr($0, RSTART + 1, RLENGTH - 1)
+			print "track: "single".mp3"
+			system("hget ''"src"'' > "single".mp3")
+		}
+		else
+			url[n] = substr($0, RSTART + 1, RLENGTH - 1)
+	}
+	match($0, /"text":"[^"]+/){
+		lyr = substr($0, RSTART + 8, RLENGTH - 8)
+		gsub(/\\"/, "\"", lyr)
+		gsub(/\\r\\n/, "\n", lyr)
+		if(!single)
+			lyrics[n] = lyr
+	}
+	match($0, /<meta name="description" content="([^"]|\n)+/){
+		info = substr($0, RSTART + 35, RLENGTH - 35)
+		gsub("\r", "", info)
+		gsub("&amp;#39;", "''", info)
+		gsub("&amp;amp;", "\&", info)
+	}
+	match($0, /<a class="popupImage" href="[^"]+">/){
+		src = substr($0, RSTART + 28, RLENGTH - 30)
+		match(src, /\.[^.]+$/)
+		if(single)
+			art = single substr(src, RSTART, RLENGTH)
+		else
+			art = dir"/art"substr(src, RSTART, RLENGTH)
+		print "art: "art
+		system("hget ''"src"'' > "art)
+	}
+	END{
+		if(single){
+			out = single".txt"
+			if(info){
+				print "single info: "out
+				print info > out
+			}
+			if(lyr){
+				print "lyrics: "lyr
+				print lyr >> out
+			}
+		}
+		else{
+			if(info){
+				out = dir"/info.txt"
+				print "album info: "out
+				print info > out
+			}
+			if(n > 99) fmt = "%s/%03d_%s"
+			else if(n > 9) fmt = "%s/%02d_%s"
+			else fmt = "%s/%d_%s"
+			for(i = 1; i <= n; i++){
+				out = sprintf(fmt".mp3", dir, i, track[i])
+				print "track: "out
+				system("hget ''"url[i]"'' > "out)
+				if(lyrics[i]){
+					out = sprintf(fmt".txt", dir, i, track[i])
+					print "lyrics: "out
+					print lyrics[i] > out
+				}
+			}
+		}
+	}
+'
--- /dev/null
+++ b/bunsay
@@ -1,0 +1,28 @@
+#!/bin/rc
+#
+# build a fusen here.
+#
+wc = `{echo $* | wc -c}
+#echo $wc
+
+echo
+echo $* 
+
+cat <<'...'
+                 __
+     \          /  )     
+      \        /' /    __ 
+        _.----'-./  _-"  )
+      -"         "v"  _-' 
+    ."             'Y"    
+   |                |     
+   | o     o        |     
+   |  .><.          |     
+   |  "Ll"         /      
+   '.             |       
+    |             |       
+    \             )       
+    / .          /'\      *
+    '-(_/,__.--^--"  *      * 
+                   *     *        *
+...
--- /dev/null
+++ b/c
@@ -1,0 +1,2 @@
+#!/bin/rc
+echo >/dev/text
--- /dev/null
+++ b/catbox
@@ -1,0 +1,9 @@
+#!/bin/rc
+
+fn usage {
+	echo usage: catbox file >/fd/2
+	exit usage
+}
+if(! ~ $#* 1)
+	usage
+hpost -u https://catbox.moe -m /user/api.php 'reqtype:fileupload' 'fileToUpload@'^$1 | tee /dev/snarf ; echo
--- /dev/null
+++ b/cc
@@ -1,0 +1,2 @@
+#!/bin/rc
+6c -FVw $*
--- /dev/null
+++ b/cl
@@ -1,0 +1,4 @@
+#!/bin/rc
+echo >/dev/text
+pwd
+lc
--- /dev/null
+++ b/clear
@@ -1,0 +1,2 @@
+#!/bin/rc
+echo >/dev/text
--- /dev/null
+++ b/clears
@@ -1,0 +1,10 @@
+#!/bin/rc
+# clears all the output from programs,
+# leaving only the command prompts
+
+grep `{echo -n '^'^$prompt(1)} </dev/text | \
+	grep -v '^'^$prompt(1)^'(clear|"")' | \
+	uniq >/tmp/clearing.$pid
+
+cp /tmp/clearing.$pid /dev/text
+rm -f /tmp/clearing.$pid
--- /dev/null
+++ b/committreason
@@ -1,0 +1,8 @@
+#!/bin/rc
+
+#Downloads and updates treason
+rm -rf /tmp/treason
+mkdir /tmp/treason
+cd /tmp/treason
+hget https://ftrv.se/_/treason.gz | gunzip | disk/mkext -d .
+./treason/install.rc
--- /dev/null
+++ b/crip
@@ -1,0 +1,68 @@
+#!/bin/rc
+# 2016-10-22T22:34:59-0400
+# Repack .cbr as .cbz. Try to fix the file names.
+rfork e
+fn fixname{
+	sed '
+		s/( |\+|%C2)/_/g;
+		s/(\(|\)|\'')//g;
+		s/%..//g;
+		s/(__|___)/_/g;
+		s/_-_/-/g;
+	'
+}
+fn usage {
+	echo 'usage: crip [ -cdnrz ]' >[1=2]
+	exit usage
+}
+zip=(zip -v -f)
+switch($1){
+case -c
+	for(i in *.cbr){
+		wdir=`{pwd}
+		file=`{echo $"i | urlencode | fixname | sed 's/\.cbr$/\.cbz/g'}
+		dir=`{echo $"file | sed 's/\.cbz$//g'}
+		mkdir crip.$file &&
+		cd crip.$file &&
+		unrar x $"wdir'/'$"i &&
+		crip -n &&
+		cd $wdir &&
+		mv crip.$file $dir &&
+		eval $zip $file $dir &&
+		rm -r $dir &&
+		rm $"i &&
+		echo $file
+	}
+case -d
+	for(i in `{ls | grep -v -e '\.cb(r|z)'}){
+		file=`{echo $"i | urlencode | fixname}
+		if(! ~ $i $file)
+			mv $"i $file
+		eval $zip $file.cbz $file &&
+		rm -rf $file
+		echo $file.cbz
+	}
+case -n
+	for(i in *){
+		file=`{echo $"i | urlencode | fixname}
+		if(! ~ $i $file)
+			mv $"i $file
+		echo $file
+	}
+case -r
+	for(i in *.rar){
+		file=`{echo $"i | urlencode | fixname | sed 's/\.rar$/\.cbr/g'}
+		if(! ~ $i $file)
+			mv $"i $file
+		echo $file
+	}
+case -z
+	for(i in *.zip){
+		file=`{echo $"i | urlencode | fixname | sed 's/\.zip$/\.cbz/g'}
+		if(! ~ $i $file)
+			mv $"i $file
+		echo $file
+	}
+case *
+	usage
+}
--- /dev/null
+++ b/df
@@ -1,0 +1,12 @@
+#!/bin/rc
+# df - print disk usage on hjfs/cwfs
+# usage: df
+
+if (test -f /srv/hjfs.cmd) {
+	echo df >> /srv/hjfs.cmd
+}
+if not {
+	echo statw >> /srv/cwfs.cmd
+	dd -if /srv/cwfs.cmd -bs 1024 -count 21 -quiet 1 |
+	grep wmax | sed 's/.*\+//'
+}
--- /dev/null
+++ b/drawterm
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+rcpu -u thedaemon -h thedaemon.space
--- /dev/null
+++ b/duck
@@ -1,0 +1,2 @@
+#!/bin/rc
+mothra 'http://duckduckgo.com/lite?q='^`"{echo $* | sed 's/ /+/g'}
--- /dev/null
+++ b/dump
@@ -1,0 +1,2 @@
+#!/bin/rc
+ echo dump >>/srv/cwfs.cmd
--- /dev/null
+++ b/dus
@@ -1,0 +1,10 @@
+#!/bin/rc
+# dus - disk usage summary for current dir
+# usage: dus
+
+du -s * | sort -nrk 1 | awk '{
+	if ($1 > 1073741824) printf("%7.2f %s\t%s\n", $1/1073741824, "Tb", $2)
+	else if ($1 > 1048576) printf("%7.2f %s\t%s\n", $1/1048576, "Gb", $2)
+	else if ($1 > 1024) printf("%7.2f %s\t%s\n", $1/1024, "Mb", $2)
+	else printf("%7.2f %s\t%s\n", $1, "Kb", $2)
+}'
--- /dev/null
+++ b/emu
@@ -1,0 +1,33 @@
+#!/bin/rc -e
+# emu - a wrapper for games/^(2600 gb gba md nes snes)
+# usage: emu [-j usbep] console width height [params] rom
+# requires:
+#	- rescale
+
+rfork n
+
+if(~ $*(3) ''){
+	echo $0 'usage: emu [-j usbep] console width height [params] rom'
+	exit usage
+}
+
+emu=$1
+rescale $2 $3
+shift 3
+joy=()
+
+if(~ $1 -j){
+	joy=$2
+	shift 2
+}
+
+if(test -d /sys/games/lib/rom/$emu){
+	mkdir -p $home/lib/$emu
+	bind -bc $home/lib/$emu /sys/games/lib/rom/$emu
+	cd /sys/games/lib/rom/$emu
+}
+
+if(~ $#joy 1)
+	nusb/joy /dev/usb/ep^$joy^.0 | joy | {eval games/$emu -a $* || eval games/$emu $*}
+if not
+	eval games/$emu -a $* || eval games/$emu $*
--- /dev/null
+++ b/enabledrawterm
@@ -1,0 +1,3 @@
+#!/bin/rc
+aux/listen1 -t 'tcp!*!rcpu' /rc/bin/service/tcp17019 &
+
--- /dev/null
+++ b/explorer
@@ -1,0 +1,90 @@
+#!/bin/rc
+# a plumber's file browser
+
+#	wdir is /mnt/explorer
+#	plumb to explorer
+
+#	data matches [a-zA-Z¡-￿0-9_\-+.,!/]+
+#	arg isdir $data
+#	plumb to explorer
+#	plumb client window explorer
+
+rfork en
+r = ()
+v = ()
+buttons = '{name} [mtime] [atime] [size]'
+fn list{ls -Fp $v $r $dir}
+fn display{
+	echo unhide >/dev/wctl >[2]/dev/null
+	echo current >/dev/wctl
+	echo -n scroll >/dev/wctl
+	>/dev/text{
+		echo $dir
+		echo $buttons '[reverse] [verbosity] [history] [new]'
+		list
+	}
+	echo -n  >/dev/kbdin
+}
+ramfs -m /mnt/explorer
+cd /mnt/explorer
+echo -n /mnt/explorer >/dev/wdir
+echo -n explorer >/dev/label
+touch hist
+</mnt/plumb/explorer while(>/dev/null{
+	src = `{read}
+	dst = `{read}
+	wdir = `{read}
+	type = `{read}
+	attr = `{read}
+	ndata = `{read}
+	data = `''{read -c $ndata}
+})switch($data){
+case '[new]'
+	window -cd $dir
+case '[history]'
+	cat hist >/dev/text
+case '{name}'
+case '[name]'
+	buttons = '{name} [mtime] [atime] [size]'
+	fn list{ls -Fp $v $r $dir}
+	display
+case '{mtime}'
+case '[mtime]'
+	buttons = '[name] {mtime} [atime] [size]'
+	fn list{ls -Fpt $v $r $dir}
+	display
+case '{atime}'
+case '[atime]'
+	buttons = '[name] [mtime] {atime} [size]'
+	fn list{ls -Fptu $v $r $dir}
+	display
+case '{size}'
+case '[size]'
+	buttons = '[name] [mtime] [atime] {size}'
+	fn list{ls -Fp $v $dir | sort $r +4}
+	display
+case '[reverse]'
+	if(~ $r -r)
+		r = ()
+	if not
+		r = -r
+	display
+case '[verbosity]'
+	if(~ $v -l)
+		v = ()
+	if not
+		v = -l
+	display
+case *
+	if(~ $wdir /mnt/explorer)
+		wdir = $dir
+	d = `{cleanname -d $wdir $data}
+	if(test -d $d){
+		dir = $d
+		if(! ~ $dir `{sed -n '$p' hist})
+			echo $dir >> hist
+		display
+	}
+	if not
+		plumb -s $src -w $wdir -t $type -a $attr $data
+}
--- /dev/null
+++ b/face
@@ -1,0 +1,2 @@
+#!/bin/rc
+window 940,10,1200,210 faces -i
--- /dev/null
+++ b/frogfind
@@ -1,0 +1,21 @@
+#!/bin/rc
+
+baseurl=https://frogfind.com
+querystr=""
+
+if (~ $#* 1) {
+
+	switch($1) {
+	case http://*
+		querystr='read.php?a='$1
+
+	case https://*
+		querystr='read.php?a='$1
+
+	case *
+		querystr='?q='$1
+	}
+} 
+
+
+mothra -a -d $baseurl/$querystr
--- /dev/null
+++ b/gb
@@ -1,0 +1,2 @@
+#!/bin/rc
+games/gb -a $*
--- /dev/null
+++ b/getwsys
@@ -1,0 +1,7 @@
+#!/bin/rc
+# waits for you to click another window, then reports its wsys dir
+read -c 144 /dev/wctl >/dev/null
+for(i in /dev/wsys/*/wctl)
+	if(~ `{read -c 72 $i} *' cur'*)
+		echo $i | sed 's/wctl$//'
+echo current > /dev/wctl
--- /dev/null
+++ b/gfetch
@@ -1,0 +1,88 @@
+#!/bin/rc
+# Warning, parts of this script have been STOLEN!
+
+# TODO:
+# fs usage - done
+# kernel
+
+fn storage {
+	disks = `{ls -d /dev/sd* | uniq}
+	anydisk = 'false'
+	for(i in $disks){
+		if(test -f $i/data){
+			full = `{ls -l $i/data}
+			disk = `{echo $full | awk -F '/' '{print $3}'}
+			size = `{echo $full | awk '{print $6}'}
+			echo $disk^': '^`{echo $size^' / 1024 / 1024 /1024' | bc}^GB
+			anydisk = 'true'
+			echo statw >> /srv/cwfs.cmd
+			dd -if /srv/cwfs.cmd -bs 1024 -count 21 -quiet 1 | grep wmax | sed 's/.*\+//'
+		}
+	}
+	if(~ $anydisk -c 'false')
+		echo Running in the diskless
+}
+
+fn fs {
+	if(ls /srv | grep -s '*.cmd')
+		ls /srv/*.cmd | sed 's/.cmd//g' | sed 's/\/srv\///g'
+	if(test -f /srv/fscons)
+		echo fossil
+	# Logic from storage to scrape for venti arenas
+	v='false'
+	disks = `{ls -d /dev/sd* | uniq}
+	for(i in $disks){
+		if(ls $i | grep -s arena)
+			v='true'
+	}
+	if(~ $v -c 'true')
+		echo venti
+}
+
+fn cpuid {
+	if(test -f /bin/aux/cpuid)
+		aux/cpuid >[2]/dev/null | grep procname | sed 's/.*procname//'
+}
+
+os=`{
+	if(grep -s 'zrv' /dev/drivers)
+		echo 9ants
+	if not if(grep -s 'vmx' /dev/drivers)
+		echo 9front
+	if not
+		echo Bell Labs
+}
+
+# fs and storage require #S bound on /dev 
+bind -b '#S' /dev
+
+arch=`{echo $cputype}
+shell=/bin/rc
+wm=/bin/rio
+uptime=`{uptime| sed 's/.*up//; s/..........$//'}
+scr=`{dd -count 1 < /dev/screen|[2];}
+scr=($scr(4) x $scr(5))
+ram=(`{tr / ' '</dev/swap})
+free=`{echo $ram(1)'/1024^2'|bc}
+used=`{echo '('$ram(3)'*('$ram(7)^+$ram(5)^'))/1024^2'|bc}
+cpu=`{cpuid}
+files=`{fs}
+strg=`{storage}
+
+cat <<EOF
+      __
+     (  \
+ __   \  '\
+(  "-_ \ .-'--____
+ '-_  "v"         "-.		$user @$sysname
+    "γ'              \		---------------
+     |                |		os:		Plan 9 from $os/$arch
+     |         O    O |		shell:	$shell
+     |          ɾᑕᑐɿ  |		wm:		$wm
+      \         "L˩ʺ  |		uptime:	$uptime
+       |             .|		ram:	$used/$free MiB
+       |             |		cpu:	$cpu
+       (             /		res:	$scr
+     ⡎⠉'\         . \		fs:		$files
+     ⠣⠤⋯^__.__/\_)-'		$strg
+EOF
--- /dev/null
+++ b/gfetch.rc
@@ -1,0 +1,80 @@
+#!/bin/rc
+# Warning, parts of this script have been STOLEN!
+
+# TODO:
+# fs usage
+# kernel
+
+fn storage {
+	disks = `{ls -d /dev/sd* | uniq}
+	anydisk = 'false'
+	for(i in $disks){
+		if(test -f $i/data){
+			full = `{ls -l $i/data}
+			disk = `{echo $full | awk -F '/' '{print $3}'}
+			size = `{echo $full | awk '{print $6}'}
+			echo $disk^': '^`{echo $size^' / 1024 / 1024 /1024' | bc}^GB
+			anydisk = 'true'
+		}
+	}
+	if(~ $anydisk -c 'false')
+		echo Running in the diskless
+}
+
+fn fs {
+	if(ls /srv | grep -s '*.cmd')
+		ls /srv/*.cmd | sed 's/.cmd//g' | sed 's/\/srv\///g'
+	if(test -f /srv/fscons)
+		echo fossil
+	# Logic from storage to scrape for venti arenas
+	v='false'
+	disks = `{ls -d /dev/sd* | uniq}
+	for(i in $disks){
+		if(ls $i | grep -s arena)
+			v='true'
+	}
+	if(~ $v -c 'true')
+		echo venti
+}
+
+fn cpuid {
+	if(test -f /bin/aux/cpuid)
+		aux/cpuid >[2]/dev/null | grep procname | sed 's/.*procname//'
+}
+
+os=`{
+	if(grep -s 'zrv' /dev/drivers)
+		echo 9ants
+	if not if(grep -s 'vmx' /dev/drivers)
+		echo 9front
+	if not
+		echo Bell Labs
+}
+
+# fs and storage require #S bound on /dev 
+bind -b '#S' /dev
+
+arch=`{echo $cputype}
+shell=/bin/rc
+uptime=`{uptime| sed 's/.*up//; s/..........$//'}
+scr=`{dd -count 1 < /dev/screen|[2];}
+scr=($scr(4) x $scr(5))
+ram=(`{tr / ' '</dev/swap})
+free=`{echo $ram(1)'/1024^2'|bc}
+used=`{echo '('$ram(3)'*('$ram(7)^+$ram(5)^'))/1024^2'|bc}
+cpu=`{cpuid}
+files=`{fs}
+strg=`{storage}
+
+cat <<EOF
+             $user@$sysname
+    (\(\     -----------
+   j". ..    os: Plan 9 from $os/$arch
+   (  . .)   shell: $shell
+   |   ° ¡   uptime: $uptime
+   ¿     ;   ram: $used/$free MiB
+   c?".UJ    cpu: $cputype $cpu
+             resolution: $scr
+             fs: $files
+             $strg
+EOF
--- /dev/null
+++ b/gitcommit
@@ -1,0 +1,2 @@
+#!/bin/rc
+git/commit -me $1
--- /dev/null
+++ b/gitdpaint
@@ -1,0 +1,2 @@
+#!/bin/rc
+git/push -u hjgit://shithub.us/thedaemon/dpaint
--- /dev/null
+++ b/gopherd
@@ -1,0 +1,87 @@
+#!/bin/rc
+
+root=/usr/web/gopher
+server=thedaemon.space
+port=70
+
+fn gls {
+r='{f=$10
+sub("^'^$"root^'", "", f)
+b=$10
+sub("^.*/", "", b)
+print "'
+x='"b" "f" '^$"server^' '^$"port^'"
+next
+}'
+a='
+/^d/'^$"r^1^$"x^'
+/\.gph$/'^$"r^1^$"x^'
+/README$/'^$"r^0^$"x^'
+/\.Z$/'^$"r^5^$"x^'
+/\.awk$/'^$"r^0^$"x^'
+/\.c$/'^$"r^0^$"x^'
+/\.gif$/'^$"r^g^$"x^'
+/\.h$/'^$"r^0^$"x^'
+/\.html$/'^$"r^h^$"x^'
+/\.man$/'^$"r^0^$"x^'
+/\.mod$/'^$"r^s^$"x^'
+/\.mp3$/'^$"r^s^$"x^'
+/\.ms$/'^$"r^0^$"x^'
+/\.ogg$/'^$"r^s^$"x^'
+/\.pdf$/'^$"r^d^$"x^'
+/\.ps$/'^$"r^d^$"x^'
+/\.rc$/'^$"r^0^$"x^'
+/\.s$/'^$"r^0^$"x^'
+/\.tar$/'^$"r^5^$"x^'
+/\.tex$/'^$"r^0^$"x^'
+/\.tgz$/'^$"r^5^$"x^'
+/\.troff$/'^$"r^0^$"x^'
+/\.txt$/'^$"r^0^$"x^'
+/\.wav$/'^$"r^s^$"x^'
+/\.zip$/'^$"r^5^$"x^'
+/mkfile$/'^$"r^0^$"x^'
+'^$"r^9^$"x
+ls -l $1 | awk $"a | sed 's/$/
+/g'
+}
+
+fn gph {
+ sed 's/\|server\|[^\|\]]+\]$/|'^$"server^'|'^$"port^']/;
+s/^\[//g; s/]$//g; s/(.)\|/\1/;
+s/\|/ /g; s/$//g;' < $1
+}
+
+r=`{read | sed 's/
+//g; s/\.\.//g; s!//!!g;'}
+
+if(~ $"r ''){
+ r=$"root
+}
+if not {
+ r=$"root^$"r
+}
+
+if(test -d $"r){
+ if(test -r $"r/index.gph){
+  gph $"r/index.gph
+ }
+ if not {
+  gls $"r
+ }
+}
+if not {
+ if(test -r $"r) {
+  if(~ $"r *.gph){
+   gph $"r
+  }
+  if not {
+   cat $"r
+   exit
+  }
+ }
+ if not {
+  echo '3"'^$"r^'" not found error.file error.host 0
+'
+ }
+}
+echo '.'
--- /dev/null
+++ b/grid/chat
@@ -1,0 +1,125 @@
+#!/bin/rc
+# grid/chat - minimal chat client for hubfs
+# usage: grid/chat [-j CHANNEL] [-n NICK] [chatsrv]
+
+rfork efn
+
+fn helpmessage{
+	echo '    /c to list channels'
+	echo '    /h for this message'
+	echo '    /j CHANNEL to change channel'
+	echo '    /m MSG to emote'
+	echo '    /n NICK to change nick'
+	echo '    /q to quit'
+}
+
+fn close{
+	#echo $nick vanishes from $channel into the void. >>/n/$chatsrv/$channel
+	@{echo kill>/proc/$catkill/ctl}
+}
+
+fn shutdown{
+	close
+	exit
+}
+
+fn sighup{
+	shutdown
+}
+
+fn sigint{
+	shutdown
+}
+
+channel=chat
+chatsrv=149.28.123.225
+while (~ $1 -*){
+	switch($1){
+	case -j
+		channel = $2
+		shift 2
+	case -n
+		nick = $2
+		shift 2
+	case *
+		echo bad flag $1 -j CHANNEL -n NICK
+		shift
+	}
+}
+if(! ~ $1 '')
+	chatsrv=$1
+if(! test -e /n/$chatsrv/chat)
+	mount /srv/$chatsrv /n/$chatsrv
+if(! test -e /n/$chatsrv/chat){
+	echo no chat service named $chatsrv found >[1=2]
+	exit no.chatsrv
+if(! test -e /n/$chatsrv/$channel)
+	echo no channel named $channel found >[1=2]
+	exit no.channel
+}
+
+label $channel
+if(~ $#nick 0)
+	nick=thedæmon
+#echo JOIN $nick to chat >>/n/$chatsrv/$channel
+cat /n/$chatsrv/$channel &
+catkill=$apid
+
+while(talk=`{read}){
+	if(~ $talk /*){
+		switch($talk){
+		case /c
+			echo available channels:
+			lc /n/$chatsrv
+			echo -------------------
+			echo currently in $channel
+			echo
+			command=yes
+		case /h*
+			helpmessage
+			echo currently in $channel
+			echo
+			command=yes
+		case /j*
+			if (~ $talk(2) '')
+				echo must specify a channel
+			if not if(test -e /n/$chatsrv/$talk(2)){
+				close
+				channel=$talk(2)
+				cat /n/$chatsrv/$channel &
+				catkill=$apid
+				#echo JOIN $nick to $channel >>/n/$chatsrv/$channel
+			}
+			if not
+				echo channel does not exist
+			command=yes
+		case /m*
+			if(! ~ $talk(2) ''){
+				echo ' *' $nick $talk(2-) >>/n/$chatsrv/$channel
+			}
+			if not
+				echo must provide a message
+			command=yes
+		case /n*
+			if(! ~ $talk(2) ''){
+				echo ' *' $nick is now $talk(2) >>/n/$chatsrv/$channel
+				nick=$talk(2)
+			}
+			if not
+				echo must supply a nick
+			command=yes
+		case /q*
+			shutdown
+		case *
+			echo unknown command
+			command=yes
+		}
+	}
+	if(~ $talk '')
+		command=yes
+	if(! ~ $command yes){
+		line=`{echo $nick ' → ' $talk}
+		echo $line >>/n/$chatsrv/$channel
+	}
+	command=no
+}
--- /dev/null
+++ b/grid/chatold
@@ -1,0 +1,127 @@
+#!/bin/rc
+# grid/chat - minimal chat client for hubfs
+# usage: grid/chat [-j CHANNEL] [-n NICK] [chatsrv]
+
+rfork efn
+
+fn helpmessage{
+	echo ------------commands------------
+	echo '    /c to list channels'
+	echo '    /h for this message'
+	echo '    /j CHANNEL to change channel'
+	echo '    /m MSG to emote'
+	echo '    /n NICK to change nick'
+	echo '    /q to quit'
+	echo --------------------------------
+}
+# This is the message when you leave.
+fn close{
+#	echo PART $nick from $channel >>/n/$chatsrv/$channel
+	@{echo kill>/proc/$catkill/ctl}
+}
+
+fn shutdown{
+	close
+	exit
+}
+
+fn sighup{
+	shutdown
+}
+
+fn sigint{
+	shutdown
+}
+
+channel=chat
+chatsrv=chat.9p.zone
+while (~ $1 -*){
+	switch($1){
+	case -j
+		channel = $2
+		shift 2
+	case -n
+		nick = $2
+		shift 2
+	case *
+		echo bad flag $1 -j CHANNEL -n NICK
+		shift
+	}
+}
+if(! ~ $1 '')
+	chatsrv=$1
+if(! test -e /n/$chatsrv/chat)
+	mount /srv/$chatsrv /n/$chatsrv
+if(! test -e /n/$chatsrv/chat){
+	echo no chat service named $chatsrv found >[1=2]
+	exit no.chatsrv
+if(! test -e /n/$chatsrv/$channel)
+	echo no channel named $channel found >[1=2]
+	exit no.channel
+}
+
+label $channel
+if(~ $#nick 0)
+	nick=anon
+#echo JOIN $nick to chat >>/n/$chatsrv/$channel
+cat /n/$chatsrv/$channel &
+catkill=$apid
+
+while(talk=`{read}){
+	if(~ $talk /*){
+		switch($talk){
+		case /c
+			echo available channels:
+			lc /n/$chatsrv
+			echo -------------------
+			echo currently in $channel
+			echo
+			command=yes
+		case /h*
+			helpmessage
+			echo currently in $channel
+			echo
+			command=yes
+		case /j*
+			if (~ $talk(2) '')
+				echo must specify a channel
+			if not if(test -e /n/$chatsrv/$talk(2)){
+				close
+				channel=$talk(2)
+				cat /n/$chatsrv/$channel &
+				catkill=$apid
+				#echo JOIN $nick to $channel >>/n/$chatsrv/$channel
+			}
+			if not
+				echo channel does not exist
+			command=yes
+		case /m*
+			if(! ~ $talk(2) ''){
+				echo ' *' $nick $talk(2-) >>/n/$chatsrv/$channel
+			}
+			if not
+				echo must provide a message
+			command=yes
+		case /n*
+			if(! ~ $talk(2) ''){
+				echo ' *' $nick is now $talk(2) >>/n/$chatsrv/$channel
+				nick=$talk(2)
+			}
+			if not
+				echo must supply a nick
+			command=yes
+		case /q*
+			shutdown
+		case *
+			echo unknown command
+			command=yes
+		}
+	}
+	if(~ $talk '')
+		command=yes
+	if(! ~ $command yes){
+		line=`{echo $nick ' → ' $talk}
+		echo $line >>/n/$chatsrv/$channel
+	}
+	command=no
+}
--- /dev/null
+++ b/grid/now
@@ -1,0 +1,2 @@
+#!/bin/rc
+grid/up && grid/chat
--- /dev/null
+++ b/grid/rio
@@ -1,0 +1,5 @@
+#!/bin/rc
+# grid/rio - rio script for gridchat
+# usage: rio [-s] -i grid/rio
+
+window -scroll grid/chat
--- /dev/null
+++ b/grid/up
@@ -1,0 +1,30 @@
+#!/bin/rc
+# grid/up - initialize grid services
+# usage: grid/up
+
+srv tcp!149.28.123.225!9990 149.28.123.225 /n/grid
+
+#
+#fn clean {
+#	echo $1 | sed 's/.*!([^!]+)!.*/\1/'2
+#}
+#
+#for(s in /n/registry/tcp*){
+#	s=`{basename $s}
+#	srv $s `{clean $s} /n/^`{clean $s} &
+#}
+
+echo
+echo '     -- welcome to 9grid --'
+echo
+
+#while(~ $#nick 0){
+#	echo please enter a nick:
+#	nick=`{read}
+#}
+
+nick=thedæmon
+
+#exec rio -i grid/rio
+#window -scroll grid/chat
+grid/chat
--- /dev/null
+++ b/grid/upold
@@ -1,0 +1,40 @@
+#!/bin/rc
+# grid/up - initialize grid services
+# usage: grid/up
+
+srv tcp!149.28.123.225!9990 149.28.123.225 /n/gridtemp/
+srv -c tcp!149.28.123.225!9991 149.28.123.225 /n/disk
+
+# registry n/a atm
+#srv tcp!registry.9p.zone!6675 9p.zone.registry /n/registry
+#
+#fn clean {
+#	echo $1 | sed 's/.*!([^!]+)!.*/\1/'2
+#}
+#
+#for(s in /n/registry/tcp*){
+#	s=`{basename $s}
+#	srv $s `{clean $s} /n/^`{clean $s} &
+#}
+
+echo
+echo '     -- welcome to 9grid --'
+echo ------------commands------------
+echo '    /c to list channels'
+echo '    /h for this message'
+echo '    /j CHANNEL to change channel'
+echo '    /m MSG to emote'
+echo '    /n NICK to change nick'
+echo '    /q to quit'
+echo --------------------------------
+echo
+
+#while(~ $#nick 0){
+#	echo please enter a nick:
+#	nick=`{read}
+#}
+
+nick=thedæmon
+
+#exec rio -i grid/rio
+#window -scroll grid/chat
--- /dev/null
+++ b/highres
@@ -1,0 +1,2 @@
+#!/bin/rc
+rfork n; aux/realemu; aux/vga -l 2560x1440x32
--- /dev/null
+++ b/irc/catv
@@ -1,0 +1,2 @@
+#!/bin/rc
+ircx -s oftc -t '#cat-v'
--- /dev/null
+++ b/irc/chats
@@ -1,0 +1,9 @@
+#!/bin/rc
+# lower left chat window
+window -r 0 800 900 1440 -scroll
+# lower right chat window
+window -r 910 800 1810 1440 -scroll
+# upper left
+window -r 0 210 900 790 -scroll
+# upper right
+window -r 910 210 1810 790 -scroll
--- /dev/null
+++ b/irc/occ
@@ -1,0 +1,2 @@
+#!/bin/rc
+ircx -s libera -t '#oldcomputerchallenge'
--- /dev/null
+++ b/irc/start
@@ -1,0 +1,3 @@
+#!/bin/rc
+ircs -p -s oftc thedaemon irc.oftc.net &
+ircs -p -s libera thedaemon irc.libera.chat &
--- /dev/null
+++ b/irc/startrek
@@ -1,0 +1,2 @@
+#!/bin/rc
+ircx -s libera -t '#startrek'
--- /dev/null
+++ b/irc/surreal
@@ -1,0 +1,2 @@
+#!/bin/rc
+ircx -s libera -t '#unix_surrealism'
--- /dev/null
+++ b/irctime
@@ -1,0 +1,25 @@
+#!/bin/awk -f
+# irctime: convert ircs timestamps to ISO 8601 format
+BEGIN {
+	mon["Jan"] = "01"
+	mon["Feb"] = "02"
+	mon["Mar"] = "03"
+	mon["Apr"] = "04"
+	mon["May"] = "05"
+	mon["Jun"] = "06"
+	mon["Jul"] = "07"
+	mon["Aug"] = "08"
+	mon["Sep"] = "09"
+	mon["Oct"] = "10"
+	mon["Nov"] = "11"
+	mon["Dec"] = "12"
+}
+/^-- / {
+	dd = $3
+	mm = mon[$4]
+	yyyy = $5
+	next
+}
+{
+	print yyyy "-" mm "-" dd "T" $0
+}
--- /dev/null
+++ b/ircx
@@ -1,0 +1,323 @@
+#!/bin/rc
+# ircx: ircs ui
+rfork e
+
+flagfmt='e,p,r,T,U,s srvname,f file,t target,b lines'
+args='[nick[!user] addr]'
+
+srv=ircs
+mainlog=()
+log=()
+opt=()
+
+lines=()
+target=()
+offset=()
+
+help='<del>, /q       quit ircx (leaves ircs running)
+/h              print this help
+/j #channel     join #channel and set it as target
+/n nick         change nick
+/N              list nicks on channel target
+/p [message]    part from channel target
+/Q [message]    quit (stops ircs)
+/r message      send raw message to server
+/t target       set target (channel or nick)
+/T [topic]      get [set] topic of channel target
+/w mask         send who query
+/W mask         send whois query
+/x              create new ircx window
+[/ ]message     send message to target
+/me message	send an action emote'
+
+fn usage{
+	aux/usage
+	exit usage
+}
+fn fatal{
+	echo $* >[1=2]
+	exit $"*
+}
+fn isnum{
+	echo $1 | grep -s '^[0-9]+$'
+}
+fn clear{
+	awk 'BEGIN {
+		for(i = 0; i < '$1'; i++)
+			printf "\x08"
+	}'
+}
+fn runtail{
+	{	tail -$2
+		while(sleep 1) cat
+	} <$1 &
+	tailpid=$apid
+}
+fn oldlabel{
+	if(! ~ $#oldlabel 0)
+		label $oldlabel
+}
+fn killtail{
+	@{
+		echo kill >/proc/$tailpid/note
+	} &
+}
+fn saveoffset{
+	if(~ $#offset 1 && test -r $log)
+		wc -l <$log | tr -d ' ' >$offset
+}
+fn shutdown{
+	saveoffset
+	killtail
+	oldlabel
+	exit 0
+}
+fn sighup sigint sigterm{
+	shutdown
+}
+fn send{
+	if(test -e /srv/$srv)
+		echo $* >>/srv/$srv
+	if not{
+		echo /srv/$srv not found '(ircs stopped?)'
+		shutdown
+	}
+}
+fn settarget{
+	if(~ $1 ''){
+		target=()
+		label $mainlog
+	}
+	if not{
+		target=$1
+		label $target
+	}
+}
+fn newtarget{
+	if(~ $#flagf 1)
+		settarget $newtarget
+	if not{
+		if(~ $newtarget '#'*){
+			f=/tmp/$srv/$newtarget
+			sleep 1
+		}
+		if not{
+			settarget $newtarget
+			f=$mainlog
+		}
+		if(! ~ $f $log){
+			if(test -r $f){
+				settarget $newtarget
+				saveoffset
+				offset=()
+				killtail
+				log=$f
+				echo $log
+				runtail $log 10
+			}
+			if not
+				echo can''''t access $f
+		}
+	}
+	newtarget=()
+}
+fn lines{
+	if(~ $#offset 1 && test -r $offset && test -r $log){
+		n₀=`{cat $offset}
+		n₁=`{wc -l <$log}
+		δn=`{echo $n₁ - $n₀ + 10 | bc}
+		echo $δn
+	}
+	if not
+		echo 10
+}
+
+if(! ifs=() eval `{aux/getflags $*} || ! ~ $#* 0 2)
+	usage
+
+if(~ $#flagb 1){
+	if(! isnum $flagb)
+		usage
+	lines=$flagb
+}
+if(~ $#flagt 1)
+	target=$flagt
+
+if(~ $#flags 1){
+	if(~ $flags '')
+		fatal empty srvname
+	srv=$flags
+	opt=($opt -s $srv)
+}
+if(~ $#flagf 1){
+	mainlog=$flagf
+	opt=($opt -f $mainlog)
+}
+if not{
+	mainlog=/tmp/$srv/log
+	if(~ $#lines 0){
+		offset=/tmp/$srv/offsets/log
+		mkdir -p /tmp/$srv/offsets
+	}
+}
+if(~ $#flage 1) opt=($opt -e)
+if(~ $#flagp 1) opt=($opt -p)
+if(~ $#flagr 1) opt=($opt -r)
+if(~ $#flagT 1) opt=($opt -T)
+if(~ $#flagU 1) opt=($opt -U)
+
+switch($#*){
+case 0
+	for(i in /srv/$srv $mainlog)
+		if(! test -e $i)
+			fatal $i not found
+case 2
+	if(test -e /srv/$srv)
+		fatal ircs already running
+	nick=$1
+	addr=$2
+	ircs $opt $nick $addr
+	stat=$status
+	if(! ~ $stat '')
+		exit $stat
+case *
+	usage
+}
+
+oldlabel=`{cat /dev/label}
+oifs=$ifs
+log=$mainlog
+
+if(~ $#target 1){
+	label $target
+	if(~ $target '#'*){
+		send JOIN $target
+		if(~ $#flagf 0){
+			log=/tmp/$srv/$target
+			if(~ $#lines 0)
+				offset=/tmp/$srv/offsets/$target
+			if(! test -e $log)
+				sleep 1
+		}
+	}
+}
+if not
+	label $log
+
+if(~ $#lines 0)
+	lines=`{lines}
+
+echo $log -$lines
+runtail $log $lines
+
+while(ifs=() line=`{read | tr -d \xa}){
+	ifs=$oifs
+	clear `{echo $line | wc -r}
+
+	if(! ~ $line ''){
+		msg=()
+		*=`{echo $line}
+		cmd=$1
+		shift
+
+		switch($cmd){
+		case /h
+			echo $help
+		case /j
+			if(~ $#* 0)
+				echo no channel
+			if not{
+				msg='JOIN '^$"*
+				newtarget=$1
+			}
+		case /t
+			if(~ $#* 0)
+				echo no target
+			if not
+				newtarget=$1
+		case /N
+			if(! ~ $target '#'*)
+				echo no channel
+			if not
+				msg='NAMES '^$target
+		case /T
+			if(! ~ $target '#'*)
+				echo no channel
+			if not{
+				msg='TOPIC '^$target
+				if(! ~ $#* 0)
+					msg=$msg^' :'^$"*
+			}
+		case /p
+			if(! ~ $target '#'*)
+				echo no channel
+			if not{
+				msg='PART '^$target
+				if(! ~ $#* 0)
+					msg=$msg^' :'^$"*
+				newtarget=''
+			}
+		case /q
+			shutdown
+		case /Q
+			if(~ $#* 0)
+				send QUIT
+			if not
+				send 'QUIT :'^$"*
+			sleep 1
+			shutdown
+		case /r
+			if(~ $#* 0)
+				echo no message
+			if not{
+				ifs=()
+				msg=`{echo -n $line | sed 's!^[ 	]*/r[ 	]+!!'}
+				ifs=$oifs
+			}
+		case /n
+			if(~ $#* 0)
+				echo no nick
+			if not
+				msg='NICK '^$1
+		case /w
+			if(~ $#* 0)
+				echo no mask
+			if not
+				msg='WHO '^$"*
+		case /W
+			if(~ $#* 0)
+				echo no mask
+			if not
+				msg='WHOIS '^$"*
+		case /x
+			window -m ircx $opt
+		case /
+			if(~ $#target 0)
+				echo no target
+			if not{
+				ifs=()
+				line=`{echo -n $line | sed 's!^[ 	]*/[ 	]*!!'}
+				ifs=$oifs				
+				msg='PRIVMSG '^$target^' :'^$line
+			}
+		case /me
+			if(~ $#target 0)
+				echo no target
+			if not
+				msg='PRIVMSG '^$target^' :ACTION '^$"*^''	
+		case /*
+			echo unknown command
+		case *
+			if(~ $#target 0)
+				echo no target
+			if not
+				msg='PRIVMSG '^$target^' :'^$line
+		}
+		if(! ~ $#msg 0)
+			send $msg
+
+		if(~ $#newtarget 1)
+			newtarget
+	}
+}
+shutdown
--- /dev/null
+++ b/l
@@ -1,0 +1,3 @@
+#!/bin/rc
+pwd
+lc
--- /dev/null
+++ b/lowres
@@ -1,0 +1,2 @@
+#!/bin/rc
+rfork n; aux/realemu; aux/vga -l 1920x1080x32
--- /dev/null
+++ b/m
@@ -1,0 +1,2 @@
+#!/bin/rc
+mothra -a $*
--- /dev/null
+++ b/mailstart
@@ -1,0 +1,2 @@
+#!/bin/rc
+upas/fs -f /imaps/disroot.org/[email protected] &
--- /dev/null
+++ b/masto
@@ -1,0 +1,2 @@
+#!/bin/rc
+masto9 bsd.network $*
--- /dev/null
+++ b/md
@@ -1,0 +1,13 @@
+#!/bin/rc
+# md - play mega drive (genesis) games
+# usage: md [params] rom
+# requires:
+#	- emu
+#	- rescale
+
+if(~ $*(1) ''){
+	echo $0 'usage: md [params] rom' >[1=2]
+	exit usage
+}
+
+emu md 320 224 $*
--- /dev/null
+++ b/mountspace
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+rimport -p -u $user thedaemon.space / /n/space
--- /dev/null
+++ b/nectarineradio
@@ -1,0 +1,2 @@
+#!/bin/rc
+hget http://necta.burn.net:8000/nectarine | play
--- /dev/null
+++ b/news
@@ -1,0 +1,2 @@
+#!/bin/rc
+window 'nntpfs -a news.eternal-september.org'
--- /dev/null
+++ b/nofront
@@ -1,0 +1,2 @@
+#!/bin/rc
+ircx -s libera -t '#nofront'
--- /dev/null
+++ b/nojqpn
@@ -1,0 +1,2 @@
+#!/bin/grep -vf
+^[0-9:]+ (JOIN|QUIT|PART|NICK)
--- /dev/null
+++ b/pkginit
@@ -1,0 +1,305 @@
+#!/bin/rc
+# pkginit - set up pkg
+# usage: pkginit
+
+instdir=/rc/bin/pkg
+
+fn die{
+	>[1=2] echo !! $*
+	>[1=2] echo !! exiting...
+	exit $"*
+}
+
+fn fin{
+	say installation successful
+	say use pkg/add to install packages
+	exit ''
+}
+
+fn say{
+	>[1=2] echo :: $*
+}
+
+>[1=2] echo -n '|| package store location? [/sys/pkg] '
+pkgdir=`{read}
+switch($pkgdir){
+case ''
+	pkgdir=/sys/pkg
+case /*
+	pkgdir=$pkgdir(1)
+case *
+	die please use an absolute path
+}
+
+say initializing pkg...
+if(! test -d $pkgdir){
+	say creating $pkgdir...
+	mkdir -p $pkgdir || die failed to create $pkgdir
+}
+if not say $pkgdir already exists
+if(! test -d $instdir){
+	say creating $instdir...
+	mkdir -p $instdir || die failed to create $instdir
+}
+if not say $instdir already exists
+
+say adding pkg/env to $instdir...
+>$instdir/env cat <<'...' | >[2=] sed -e 's!REPLACE!'$pkgdir'!g' || die failed to install $instdir/env
+pkgdir=REPLACE
+pkglist=$pkgdir/.pkglist
+pkgs=(`{>[2=] sed -e '/^#/d;/^$/d;s/.*pkg=//g;s/\	.*//g' $pkglist})
+t=/tmp/pkg.$pid
+
+fn checklist{
+	if(! test -s $pkglist) die no pkglist found
+}
+
+fn die{
+	rm -f $t
+	>[1=2] echo !! $*
+	>[1=2] echo !! exiting...
+	exit $"*
+}
+
+fn say{
+	>[1=2] echo :: $*
+}
+
+fn sighup sigint sigterm{
+	rm -f $t
+	exit interrupt
+}
+...
+
+say adding pkg/add to $instdir...
+>$instdir/add cat <<'...' || die failed to install $instdir/add
+#!/bin/rc
+rfork en
+. pkg/env
+
+flagfmt=''; args='url ...'
+if(! eval `''{aux/getflags $*} || ~ $#* 0) exec aux/usage
+
+for(repo in $*){
+	pkg=`{echo $repo | awk -F'/' '{print $NF}'}
+	say pulling $pkg...
+	git/clone $repo $pkgdir/$pkg || die failed to clone $pkg
+	cd $pkgdir/$pkg
+	if(~ $pkg 'nsport'){
+		fetch clone http || die failed to fetch $pkg
+		say building $pkg...
+		mk || die failed to build $pkg
+	}
+	say installing $pkg...
+	mk install || die failed to install $pkg
+	say $pkg installed, cleaning...
+	mk clean || die failed to clean $pkg
+	>>$pkglist echo 'pkg='$pkg'	url='$repo
+	say $pkg successfully added to pkglist
+} || exit
+
+say all packages successfully installed
+exit ''
+...
+chmod +x $instdir/add || die failed to chmod $instdir/add
+
+say adding pkg/del to $instdir...
+>$instdir/del cat <<'...'  || die failed to install $instdir/del
+#!/bin/rc
+rfork en
+. pkg/env
+checklist
+
+flagfmt=''; args='name ...'
+if(! eval `''{aux/getflags $*} || ~ $#* 0) exec aux/usage
+
+for(pkg in $*){
+	cp $pkglist $t
+	if(test -d $pkgdir/$pkg){
+		cd $pkgdir/$pkg
+		say uninstalling $pkg...
+		mk uninstall || die failed to uninstall $pkg
+		cd $pkgdir
+		say removing $pkg sources...
+		rm -rf $pkg || die failed to remove $pkg
+		say removing $pkg from pkglist...
+		>$t.x grep -ve 'pkg='$pkg $t
+		mv $t.x $t
+		mv $t $pkglist
+	}
+	if not die $pkg not installed
+} || exit
+
+say all packages successfully removed
+exit ''
+...
+chmod +x $instdir/del || die failed to chmod $instdir/del
+
+say adding pkg/ls to $instdir...
+>$instdir/ls cat <<'...' || die failed to install $instdir/ls
+#!/bin/rc
+rfork en
+. pkg/env
+checklist
+
+flagfmt='c:c'
+eval `''{aux/getflags $*} || exec aux/usage
+
+if(~ $c 1) >[1=2] echo $#pkgs
+if not{
+	say managed packages:
+	>[1=2] echo $pkgs | tr ' ' '\x0A' | sort | mc
+}
+
+exit ''
+...
+chmod +x $instdir/ls || die failed to chmod $instdir/ls
+
+say adding pkg/up to $instdir...
+>$instdir/up cat <<'...' || die failed to install $instdir/up
+#!/bin/rc
+rfork en
+. pkg/env
+checklist
+
+flagfmt=''; args='[name ...]'
+eval `''{aux/getflags $*} || exec aux/usage
+
+if(~ $#* 0) name=$pkgs
+if not name=$*
+
+for(pkg in $name){
+	if(test -d $pkgdir/$pkg){
+		cd $pkgdir/$pkg
+		say updating $pkg...
+		if(~ $pkg 'nsport'){
+			fetch pull || die failed to fetch $pkg
+			say building $pkg...
+			mk || die failed to build $pkg
+		}
+		if not git/pull || die failed to fetch $pkg
+	}
+	if not if(grep -se 'pkg='$pkg $pkglist){
+		sel=($pkg `{grep -e 'pkg='$pkg $pkglist | sed -ne '/^#/d;s/.*url=//g;s/\	.*//g;1p'})
+		if(test $#sel -lt 2) die $pkg not in pkglist
+		say pulling $pkg...
+		git/clone $sel(2) $pkgdir/$sel(1) || die failed to clone $pkg
+		cd $pkgdir/$pkg
+		if(~ $pkg 'nsport'){
+			fetch clone http || die failed to fetch $pkg
+			say building $pkg...
+			mk || die failed to build $pkg
+		}
+	}
+	if not die $pkg not in pkglist
+	say installing $pkg...
+	mk install || die failed to install $pkg
+	say $pkg installed, cleaning...
+	mk clean || die failed to clean $pkg
+} || exit
+
+say all updates successfully completed
+exit ''
+...
+chmod +x $instdir/up || die failed to chmod $instdir/up
+
+say installing manual...
+>/sys/man/1/pkg cat <<'...' | >[2=] sed -e 's!REPLACE!'$pkgdir'!g' || die failed to install manual
+.TH PKG 1
+.SH NAME
+pkg, pkg/add, pkg/del, pkg/ls, pkg/up \- Manage third-party packages.
+
+.SH SYNOPSIS
+.PP
+.B pkg/add
+.I url ...
+.PP
+.B pkg/del
+.I name ...
+.PP
+.B pkg/ls
+[
+.B -c
+]
+.PP
+.B pkg/up
+[
+.I name ...
+]
+
+.SH DESCRIPTION
+.PP
+.I Pkg
+is a simple package manager. It uses
+.IR git (1)
+and
+.IR mk (1)
+to automatically clone, install, and update third-party source
+repositories from a database.
+
+.SH COMMANDS
+.PP
+.B Pkg/add
+is used to install new packages. Packages are fetched via
+.IR git ,
+after which they are built, installed, and finally cleaned with
+.IR mk .
+An entry is then added to the database of managed packages.
+.PP
+.B Pkg/del
+is used to purge packages. Selected packages are uninstalled with
+.I mk
+and their sources are removed from the store, after which their entry
+is removed from the database of managed packages.
+.PP
+.B Pkg/ls
+displays a columnated list of packages currently being managed by
+.IR pkg .
+Passing the
+.B -c
+option will instead display a
+.I count
+of managed packages.
+.PP
+.B Pkg/up
+is used to update packages to their latest versions followed by the
+build steps described above for
+.BR pkg/add .
+If no package is specified, all packages are updated.
+
+.SH FILES
+.TP
+REPLACE/.pkglist
+The database of managed packages.
+
+.SH NOTES
+.PP
+There are no automatic dependency management triggers and packages are
+updated in the order in which they were installed.
+.PP
+Packages without an
+.I uninstall
+target in their
+.I mkfile
+will cause
+.B pkg/del
+to exit without removing sources or purging the entry from the
+database.
+.PP
+Entries without a corresponding source directory in the store will be
+pulled automatically when running
+.BR pkg/up .
+This means a pre-generated
+.I .pkglist
+can be supplied to quickly install a large selection of packages.
+
+.SH BUGS
+.PP
+Probably.
+
+.SH SEE ALSO
+.IR git (1),
+.IR mk (1)
+...
+
+fin
--- /dev/null
+++ b/playbsd
@@ -1,0 +1,4 @@
+#!/bin/rc
+rfork ne
+
+ audio/zuke < /usr/$user/music/bsdmusic.plist
--- /dev/null
+++ b/playmusic
@@ -1,0 +1,4 @@
+#!/bin/rc
+rfork ne
+
+ audio/zuke < /usr/$user/music/bsdmusic.plist
--- /dev/null
+++ b/program
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+acme -l /usr/thedaemon/docs/prog.dump
--- /dev/null
+++ b/quake
@@ -1,0 +1,3 @@
+#!/bin/rc
+games/quake >/dev/null
+
--- /dev/null
+++ b/rcpustart
@@ -1,0 +1,2 @@
+#!/bin/rc
+aux/listen1 -t 'tcp!*!rcpu' /rc/bin/service/tcp17019 &
--- /dev/null
+++ b/rdp
@@ -1,0 +1,2 @@
+#!/bin/rc
+rd 192.168.0.100
--- /dev/null
+++ b/rescale
@@ -1,0 +1,12 @@
+#!/bin/rc
+# rescale - resize a window
+# usage: rescale width height
+echo $vgasize | awk -Fx -v 'w='$1 -v 'h='$2 '
+{
+	dx = $1 / w
+	dy = $2 / h
+	scale = int(dy < dx ? dy : dx)
+	if(scale * w == $1 || scale * h == $2)
+		scale--
+	print "resize -dx", scale * w + 8, "-dy", scale * h + 8 >"/dev/wctl"
+}'
--- /dev/null
+++ b/riostart
@@ -1,0 +1,28 @@
+#!/bin/rc
+
+# theme
+#window 'cat /usr/thedaemon/lib/theme/gruv9.theme > /mnt/wsys/theme'
+themes gruv9
+setbg glenda
+
+# console to keep the horrors at bay
+window -hide -scroll cat /dev/kprint >> /sys/log/kernel
+
+# riow & bar script
+window wm
+
+# password gui popups when needed
+window -hide auth/fgui
+
+# statistics
+window 10,10,200,200 statsdark -lmisce
+
+# window list
+window 10,210,200,600 winwatchsand -e '^(winwatch|auth/fgui|9weather|cat|stats|faces|bar|vol|fgui)'
+
+# weather
+window 10,610,230,800 9weather -i -z 35022,US -k a29dc2d85251c76e67b5be32354be64f
+
+
+# faces
+#window 940,10,1200,210 faces -i
--- /dev/null
+++ b/sdf
@@ -1,0 +1,2 @@
+#!/bin/rc
+rcpu -h 9p.sdf.org -u thedaemon
--- /dev/null
+++ b/sdfcom
@@ -1,0 +1,2 @@
+#!/bin/rc
+9psdf && com
--- /dev/null
+++ b/setbg
@@ -1,0 +1,133 @@
+#!/bin/rc
+
+rfork en
+bgdir=$home/lib/theme/bg
+
+fn default{
+	>/dev/theme cat <<'...'
+rioback 777777
+...
+	exit
+}
+
+fn list{
+	if(! test -d $bgdir)
+		error nodir
+	bglist=`{walk -f $bgdir | grep -e '*.bit' | sort}
+	switch($bglist){
+	case ''
+		error nolist
+	case *
+		echo 'available backgrounds in' $bgdir
+		for(i in $bglist)
+			echo '	-' `{basename $i .bit}
+		exit
+	}
+}
+
+fn error{
+	switch($1){
+	case nodev
+		echo 'error: /dev/theme not found'
+		echo 'is rio running and is it patched?'
+		exit nodev
+	case nodir
+		echo 'error:' $bgdir 'is not a directory'
+		exit nodir
+	case nofile
+		echo 'error: background file for "'$arg'" not found in' $bgdir
+		exit nofile
+	case nolist
+		echo 'error: no valid backgrounds found in' $bgdir
+		exit nolist
+	case nopath
+		echo 'error: no path specified'
+		usage
+	case nobg
+		echo 'error: no background file specified'
+		usage
+	case unknown
+		echo 'error: unknown option "'$flag'"'
+		usage
+	}
+}
+
+fn help{
+	echo 'options:'
+	echo '	-d for default colors'
+	echo '	-p for setting $bgdir (default=$home/lib/theme/bg)'
+	echo '	-l for list of available backgrounds'
+	echo '	-r for random background'
+	echo 'requires:'
+	echo '	- rio patched for theme support (see https://ftrv.se/14)'
+	echo '	- <name>.bit files in $bgdir'
+	echo '		* ex:' $bgdir/glenda_wallpaper.bit
+	usage
+}
+
+fn random{
+	if(! test -d $bgdir)
+		error nodir
+	randbg=`{fortune <{walk -f $bgdir | grep -e '*.bit'}}
+	switch($randbg){
+	case ''
+		error nolist
+	case *
+		echo rioback $randbg >/dev/theme
+		exit
+	}
+}
+
+
+fn usage{
+	echo 'usage: setbg [-h help] [-d default] [-p /path/to/bgdir] [-l list] [-r random] <name>'
+	exit usage
+}
+
+
+############ Main
+if(! test -f /dev/theme)
+	error nodev
+
+while(~ $1 -*){
+	switch($1){
+	case -p
+		switch($2){
+		case '' -*
+			error nopath
+		case *
+			bgdir=$2
+			shift 2
+		}
+	case -d
+		default
+	case -h -help --help
+		help
+	case -l
+		list
+	case -r
+		random
+	case *
+		flag=$1
+		error unknown
+	}
+}
+switch($#*){
+case 0
+	if(~ $#bg 1)
+		arg=$bg
+	if not
+		error nobg
+case 1
+	arg=$1
+case *
+	usage
+}
+
+if(! test -d $bgdir)
+	error nodir
+
+if(! test -f $bgdir/$arg.bit)
+	error nofile
+
+echo rioback $bgdir/$arg.bit > /dev/theme
--- /dev/null
+++ b/surl
@@ -1,0 +1,25 @@
+#!/bin/rc
+#
+# set site and surl then mkdir $surl
+#
+site=https://9p.sdf.org
+surl=/usr/web/l
+
+if(! test -d $surl){
+	echo $surl does not exist.
+	exit
+}
+
+echo -n 'surl: '
+url=`{read}
+if(! ~ $url ''){
+	last=`{ls -rt $surl|awk -F/ '{print $5}'|tail -1}
+	if(~ $last ''){
+		last=0
+	}
+	last=`{echo $last|tr a-z A-Z}
+	next=`{echo 'ibase=16;obase=16; ' $last+1 | bc|awk '{print $1}'}
+	mkdir $surl/$next
+	echo '<html><meta http-equiv=refresh content="0; url='$url'"></html>' > $surl/$next/index.html
+	echo $site/l/$next
+}
--- /dev/null
+++ b/synctime
@@ -1,0 +1,2 @@
+#!/bin/rc
+aux/timesync -n pool.ntp.org
--- /dev/null
+++ b/themes
@@ -1,0 +1,160 @@
+#!/bin/rc
+# theme - set a rio(1) theme
+# usage: theme [-d] [-p /path/to/themedir] [-l] [-r] <name>
+# requires:
+#	- patched rio with theme support (https://ftrv.se/14)
+#	- <name>.theme files in $themedir
+
+############################
+## defaults / definitions ##
+############################
+rfork en
+themedir=$home/lib/theme
+
+fn default{
+	>/dev/theme cat <<'...'
+rioback		777777
+back		ffffff
+high		cccccc
+border		999999
+text		000000
+htext		000000
+title		55aaaa
+ltitle		9eeeee
+hold		000099
+lhold		005dbb
+palehold	4993dd
+paletext	666666
+size		ff0000
+menubar		448844
+menuback	eaffea
+menuhigh	448844
+menubord	88cc88
+menutext	000000
+menuhtext	eaffea
+...
+	exit
+}
+
+fn error{
+	switch($1){
+	case nodev
+		echo 'error: /dev/theme not found'
+		echo 'is rio running and is it patched?'
+		exit nodev
+	case nodir
+		echo 'error:' $themedir 'is not a directory'
+		exit nodir
+	case nofile
+		echo 'error: theme file for "'$arg'" not found in' $themedir
+		exit nofile
+	case nolist
+		echo 'error: no valid themes found in' $themedir
+		exit nolist
+	case nopath
+		echo 'error: no path specified'
+		usage
+	case notheme
+		echo 'error: no theme file specified'
+		usage
+	case unknown
+		echo 'error: unknown option "'$flag'"'
+		usage
+	}
+}
+
+fn help{
+	echo 'options:'
+	echo '	-d for default colors'
+	echo '	-p for setting $themedir (default=$home/lib/theme)'
+	echo '	-l for list of available themes'
+	echo '	-r for random theme'
+	echo 'requires:'
+	echo '	- rio patched for theme support (see https://ftrv.se/14)'
+	echo '	- <name>.theme files in $themedir'
+	echo '		* ex:' $themedir/my_awesome.theme
+	usage
+}
+
+fn list{
+	if(! test -d $themedir)
+		error nodir
+	themelist=`{walk -f $themedir | grep -e '*.theme' | sort}
+	switch($themelist){
+	case ''
+		error nolist
+	case *
+		echo 'available themes in' $themedir
+		for(i in $themelist)
+			echo '	-' `{basename $i .theme}
+		exit
+	}
+}
+
+fn random{
+	if(! test -d $themedir)
+		error nodir
+	randtheme=`{fortune <{walk -f $themedir | grep -e '*.theme'}}
+	switch($randtheme){
+	case ''
+		error nolist
+	case *
+		cat $randtheme >/dev/theme
+		exit
+	}
+}
+
+fn usage{
+	echo 'usage: themes [-h help] [-d default] [-p /path/to/themedir] [-l list] [-r random] <name>'
+	exit usage
+}
+
+###############
+## main body ##
+###############
+if(! test -f /dev/theme)
+	error nodev
+
+while(~ $1 -*){
+	switch($1){
+	case -p
+		switch($2){
+		case '' -*
+			error nopath
+		case *
+			themedir=$2
+			shift 2
+		}
+	case -d
+		default
+	case -h -help --help
+		help
+	case -l
+		list
+	case -r
+		random
+	case *
+		flag=$1
+		error unknown
+	}
+}
+
+switch($#*){
+case 0
+	if(~ $#theme 1)
+		arg=$theme
+	if not
+		error notheme
+case 1
+	arg=$1
+case *
+	usage
+}
+
+if(! test -d $themedir)
+	error nodir
+
+if(! test -f $themedir/$arg.theme)
+	error nofile
+
+cat $themedir/$arg.theme >/dev/theme
--- /dev/null
+++ b/themez
@@ -1,0 +1,17 @@
+#!/bin/rc
+
+if(~ $#* 0){
+    echo 'Usage: theme [ls|set theme]'
+}
+
+comm=$1
+
+switch($comm){
+
+case 'ls'
+    lc $home/lib/theme/
+case 'set'
+    theme=$2
+
+    cat $home/lib/theme/$theme > /dev/theme
+ }
--- /dev/null
+++ b/top
@@ -1,0 +1,2 @@
+#!/bin/rc
+ps -axw|sort -k5n|tail -25
--- /dev/null
+++ b/toppish
@@ -1,0 +1,96 @@
+#!/bin/rc
+# top
+rfork en
+
+flagfmt='d interval,m maxlines'
+args=''
+
+old=/tmp/top.$pid.old
+new=/tmp/top.$pid.new
+out=/tmp/top.$pid.out
+
+int=5
+max=20
+len=()
+
+fn usage{
+	aux/usage
+	exit usage
+}
+fn isfloat{
+	echo $1 | grep -s '^[0-9\.]+$'
+}
+fn isnum{
+	echo $1 | grep -s '^[0-9]+$'
+}
+fn get{
+	grep . */status |
+	sed '
+		s!/status:! !
+		s! +! !g
+	'
+}
+fn clear{
+	awk 'END { for(i = 0; i < '$len'; i++) printf "\x08" }' </dev/null
+}
+fn sigint{
+	rm -f $old $new $out
+	exit
+}
+fn top{
+	get | tee $new | join - $old |
+	awk '
+	{
+		newusr = $5
+		newsys = $6
+		oldusr = $17
+		oldsys = $18
+		delta = newusr + newsys - (oldusr + oldsys)
+		pid = $1
+		name = $2
+		user = $3
+		state = $4
+		mem = $11
+		usr = newusr / 1000
+		sys = newsys / 1000
+		printf("%-10s %8s %6s %4ld:%.2ld %3ld:%.2ld %8ldK %-8s %s\n",
+			user, pid, delta,
+			usr / 60, usr % 60,
+			sys / 60, sys % 60,
+			mem, state, name)
+	}
+	' |
+	sort -nr +2 -3 | sed $max^q
+	mv $new $old
+}
+
+if(! ifs=() eval `{aux/getflags $*})
+	usage
+if(~ $#flagd 1){
+	if(! isfloat $flagd)
+		usage
+	int=$flagd
+}
+if(~ $#flagm 1){
+	if(! isnum $flagm)
+		usage
+	max=$flagm
+}
+cd /proc
+ramfs
+get >$old
+sleep $int
+
+while(){
+	{
+		echo
+		uptime
+		top
+	} >$out
+	if(~ $#len 1)
+		clear
+	len=`{wc -r <$out}
+	cat $out
+	sleep $int
+}
+
--- /dev/null
+++ b/tube
@@ -1,0 +1,82 @@
+#!/bin/rc
+# tube - a wrapper for treason
+# usage: tube
+# requires:
+#	- treason (https://git.sr.ht/~ft/treason)
+#
+# notes:
+#	- use with the following plumbing rules:
+
+# dst is video
+# plumb to video
+# plumb client window tube
+
+# wdir is /mnt/⏵
+# data matches [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]
+# plumb to video
+
+# data matches .+\.(mp4|mkv|webm)
+# arg isfile $data
+# data set $file
+# plumb to video
+# plumb client window tube
+
+ramfs -um/mnt/⏵
+cd /mnt/⏵
+echo -n /mnt/⏵ >/dev/wdir
+echo -n ⏵ >/dev/label
+echo -n scroll >/dev/wctl
+</mnt/plumb/video while(>/dev/null{
+	read	# src
+	read	# dst
+	read	# wdir
+	read	# type
+	attr = `{read}
+	ndata = `{read}
+}){
+	if(~ $attr *'action=showdata'*){
+		read -c $ndata >tmp
+		data = `{sum tmp | read -c 8}
+		mv tmp $data
+	}
+	if not
+		data = `''{read -c $ndata}
+	echo -n unhide >/dev/wctl >[2]/dev/null
+	echo -n current >/dev/wctl
+	if(! ~ $data /* && ~ $data *[~0-9a-f]* || ! test -f $data){
+		echo -n 'bad plumb: '
+		cat /env/data
+		echo
+	}
+	if not{
+		echo playing $data …
+		treason $data
+		if(! ~ $data /*){
+			done = 0
+			echo -n `{{walk -es $data; echo 1048576/1+p}|dc} 'MB: '
+			while(~ $done 0){
+				echo 𝐫ewatch, 𝐰rite to disk, 𝐝elete from ram, or 𝐤eep in ram for now?
+				echo -n  >/dev/kbdin
+				>[3]/dev/consctl{
+					echo rawon >[1=3]
+					k = `''{read -c 1 /dev/cons}
+				}
+				switch($k){
+				case r
+					plumb $data
+					done = 1
+				case w
+					echo -n 'write: '
+					k = `{read /dev/cons}
+					mv $data $k && done = 1
+				case d
+					rm $data && echo $data removed from ramfs && done = 1
+				case i
+					echo ignoring for now: replumb later to watch again, write, or delete
+					done = 1
+				}
+			}
+		}
+		echo -n hide >/dev/wctl
+	}
+}
binary files /dev/null b/upd differ
--- /dev/null
+++ b/update
@@ -1,0 +1,57 @@
+#!/bin/rc
+# update - update your 9front system
+# usage: update
+
+curdir=`{pwd}
+
+echo UPDATING SYSTEM SOURCE CODE
+
+sysupdate
+
+echo DOWNLOAD COMPLETED
+echo CONTINUE AND RECOMPILE [y/N]
+choice=`{read}
+if (~ $choice [yY]* ) echo YOU ASKED FOR IT: RECOMPILING
+if not exit
+
+cd /
+. /sys/lib/rootstub
+
+echo BUILDING
+echo UPDATING COMPILERS
+cd /sys/src/cmd/cc
+mk install
+cd /sys/src/cmd/6c
+mk install
+
+echo UPDATING SYSTEM
+cd /sys/src
+mk install
+mk clean
+
+
+echo UPDATING MANUALS
+cd /sys/man
+mk
+
+
+echo UPDATING DOCUMENTS
+cd /sys/doc
+mk
+mk html
+
+echo UPDATING KERNEL BRAIN
+cd /sys/src/9/pc64
+mk install
+
+echo FLASHING NEW MEMORY BRAIN
+9fs 9fat
+rm /n/9fat/9bootfat
+cp /386/9bootfat /n/9fat/
+chmod +al /n/9fat/9bootfat
+cp /amd64/9pc64 /n/9fat
+
+cd $curdir
+
+echo 9front UPDATE IS COMPLETE
+echo FSHALT -R NOW OR FACE DOOM
--- /dev/null
+++ b/updatemusic
@@ -1,0 +1,6 @@
+#!/bin/rc
+rfork ne
+
+# This updates the playlist for zuke to play, adding all
+# music from /usr/$user/music/
+audio/mkplist /usr/$user/music/ > /usr/$user/music/music.plist
--- /dev/null
+++ b/w
@@ -1,0 +1,3 @@
+#!/bin/rc
+uptime
+who
--- /dev/null
+++ b/weather
@@ -1,0 +1,2 @@
+#!/bin/rc
+9weather -i -z 35022,US -k a29dc2d85251c76e67b5be32354be64f
--- /dev/null
+++ b/webserver
@@ -1,0 +1,4 @@
+#!/bin/rc
+
+aux/listen1 tcp!*!80 rc-httpd/rc-httpd
+
--- /dev/null
+++ b/wifis
@@ -1,0 +1,42 @@
+#!/bin/rc -e
+# wifis - initialize wifi and prompt for network
+# usage: wifis
+
+rfork e
+
+fn Help{ echo `{basename $0}^' [essid]' }
+fn Dump{ grep node '#'l1/ether1/ifstats }
+fn Ask{
+	echo -n $1
+	essid=`{dd -bs 64 -count 1 >[2]/dev/null}
+}
+fn Wifi{
+	ip/ipconfig ether /net/ether0 unbind
+	bind -b '#'l1 /net
+	aux/wpa -p2 -s $essid /net/ether1
+	ip/ipconfig -6
+	ip/ipconfig ra6 recvra 1 &
+	ip/ipconfig ether /net/ether1 &
+	wait
+	secstore=`{grep sys /net/ndb | awk -F'=' '{print $2}'}
+	cat /net/ndb
+}
+
+switch($#*){
+	case 0
+		if(~ $#essid 0){
+			echo Available wifi essids…
+			Dump
+			echo
+			Ask 'essid='
+		}
+		if(! ~ $#essid 0){
+			Wifi
+		}
+	case 1
+		essid=($1)
+		Wifi
+	case *
+		Help
+		Dump
+}
--- /dev/null
+++ b/wm
@@ -1,0 +1,18 @@
+#!/bin/rc
+rfork ne
+
+# Customized Bar - thanks to noam for the script idea.
+# sed command replaces the virtual desktop numbers with labels
+fn custombar {
+	sed -u \
+		-e 's/^1/ one /' -e 's/^2/ two /' -e 's/^3/ three /' \
+		-e 's/^4/ four /' -e 's/^5/ five /' -e 's/^6/ six /' \
+		-e 's/^7/ seven /' -e 's/^8/ eight /' -e 's/^9/ nine /' \
+		-e 's/^0/ ten /' \
+	| bar -b -d 'H:mm a WW M/D/Y'
+}
+
+# Launches bar with riow and custom scripting piped to it.
+# -s makes windows sticky if you add the label of it.
+</dev/kbdtap riow -s 9weather >/dev/kbdtap |[3] custombar
+
--- /dev/null
+++ b/yt/a
@@ -1,0 +1,13 @@
+#!/bin/rc
+# yt/dl - download youtube videos
+# usage: yt/dl videoid
+# requires:
+#	- nvi (https://git.sr.ht/~ft/nvi)
+
+if(! ~ $#* 1){
+	echo 'usage: yt/dl videoid'
+	exit usage
+}
+
+# easiest way, low quality
+nvi -V 18 -v $1.mp4 $"1
--- /dev/null
+++ b/yt/dl
@@ -1,0 +1,13 @@
+#!/bin/rc
+# yt/dl - download youtube videos
+# usage: yt/dl videoid
+# requires:
+#	- nvi (https://git.sr.ht/~ft/nvi)
+
+if(! ~ $#* 1){
+	echo 'usage: yt/dl videoid'
+	exit usage
+}
+
+# easiest way, low quality
+nvi -V 18 -v $1.mp4 $"1
--- /dev/null
+++ b/yt/v
@@ -1,0 +1,15 @@
+#!/bin/rc
+# yt/v - play a youtube video
+# usage: yt/v videoid
+# requires:
+#	- nvi (https://git.sr.ht/~ft/nvi)
+
+if(! ~ $#* 1){
+	echo 'usage: yt/v videoid'
+	exit usage
+}
+
+# easiest way, low quality
+nvi -V 18 -v /tmp/vid.mp4 $"1 \
+	&& treason /tmp/vid.mp4 \
+	&& rm /tmp/vid.mp4