Index: trunk/Makefile
===================================================================
--- trunk/Makefile	(revision 64)
+++ trunk/Makefile	(revision 65)
@@ -20,5 +20,5 @@
 	@cp _build/default/cli/txt.exe txt.exe
 	@strip txt.exe
-	@tar czvf "logarion-${OS}-${MACHINE}-${DATE}-${COMMIT}" txt.exe readme.txt
+	@tar czvf "kosuzu-${OS}-${MACHINE}-${DATE}-${COMMIT}" txt.exe readme.txt
 	@rm txt.exe
 install:
Index: trunk/cli/authors.ml
===================================================================
--- trunk/cli/authors.ml	(revision 64)
+++ trunk/cli/authors.ml	(revision 65)
@@ -7,5 +7,5 @@
 	Person.Set.iter (fun x -> print_endline (Person.to_string x)) s
 
-open Cmdliner
+open Ocmd
 let term =
 	let recurse = Arg.(value & flag & info ["R"]
Index: trunk/cli/convert.ml
===================================================================
--- trunk/cli/convert.ml	(revision 64)
+++ trunk/cli/convert.ml	(revision 65)
@@ -77,5 +77,5 @@
 	| path -> Printf.eprintf "Path doesn't exist: %s" path
 
-open Cmdliner
+open Ocmd
 let term =
 	let path = Arg.(value & pos 0 string "" & info [] ~docv:"path"
Index: trunk/cli/edit.ml
===================================================================
--- trunk/cli/edit.ml	(revision 64)
+++ trunk/cli/edit.ml	(revision 65)
@@ -1,3 +1,3 @@
-open Cmdliner
+open Ocmd
 let term =
 	let id = Arg.(value & pos 0 string "" & info [] ~docv:"text ID") in
Index: trunk/cli/file.ml
===================================================================
--- trunk/cli/file.ml	(revision 64)
+++ trunk/cli/file.ml	(revision 65)
@@ -15,5 +15,5 @@
 	List.iter (fun d -> List.iter (unlink d) files) dirs
 
-open Cmdliner
+open Ocmd
 let term =
 	let files = Arg.(value & pos_all string [] & info []
Index: trunk/cli/index.ml
===================================================================
--- trunk/cli/index.ml	(revision 64)
+++ trunk/cli/index.ml	(revision 65)
@@ -68,5 +68,5 @@
 	index { dir; index_path; pck = Header_pack.of_kv kv }
 
-open Cmdliner
+open Ocmd
 let term =
 	let print= Arg.(value & flag & info ["print"] ~doc:"print info") in
Index: trunk/cli/last.ml
===================================================================
--- trunk/cli/last.ml	(revision 64)
+++ trunk/cli/last.ml	(revision 65)
@@ -21,5 +21,5 @@
 	| Some (_, f) -> List.iter print_endline f
 
-open Cmdliner
+open Ocmd
 let term =
 	let mine = Arg.(value & flag & info ["mine"] ~doc:"last text authored by me") in
Index: trunk/cli/listing.ml
===================================================================
--- trunk/cli/listing.ml	(revision 64)
+++ trunk/cli/listing.ml	(revision 65)
@@ -20,5 +20,5 @@
 		| None -> FS.iter ~r ~dir ~predicate ~order list_text
 
-open Cmdliner
+open Ocmd
 let term =
 	let recurse = Arg.(value & flag & info ["R"] ~doc:"recurse, include subdirs") in
Index: trunk/cli/new.ml
===================================================================
--- trunk/cli/new.ml	(revision 64)
+++ trunk/cli/new.ml	(revision 65)
@@ -1,4 +1,4 @@
 open Logarion
-open Cmdliner
+open Ocmd
 
 let new_txt title topics_opt interactive =
Index: trunk/cli/peers.ml
===================================================================
--- trunk/cli/peers.ml	(revision 64)
+++ trunk/cli/peers.ml	(revision 65)
@@ -29,5 +29,5 @@
 		Logarion.Peers.fold print_peer ()
 
-open Cmdliner
+open Ocmd
 let term =
 	let remove = Arg.(value & opt (some string) None & info ["remove"]
Index: trunk/cli/pull.ml
===================================================================
--- trunk/cli/pull.ml	(revision 64)
+++ trunk/cli/pull.ml	(revision 65)
@@ -139,5 +139,5 @@
 	| "" -> pull_list auths topics | x -> ignore (pull_index x auths topics)
 
-open Cmdliner
+open Ocmd
 let term =
 	let authors = Arg.(value & opt (some string) None & info ["a"; "authors"]
Index: trunk/cli/read.ml
===================================================================
--- trunk/cli/read.ml	(revision 64)
+++ trunk/cli/read.ml	(revision 65)
@@ -1,5 +1,5 @@
 open Logarion
 
-open Cmdliner
+open Ocmd
 let term =
 	let id = Arg.(value & pos 0 string "" & info [] ~docv:"text ID") in
Index: trunk/cli/recent.ml
===================================================================
--- trunk/cli/recent.ml	(revision 64)
+++ trunk/cli/recent.ml	(revision 65)
@@ -3,5 +3,5 @@
 module A = Archive
 
-open Cmdliner
+open Ocmd
 let term =
 	let recurse = Arg.(value & flag & info ["R"] ~doc:"recurse, include subdirs") in
Index: trunk/cli/topics.ml
===================================================================
--- trunk/cli/topics.ml	(revision 64)
+++ trunk/cli/topics.ml	(revision 65)
@@ -7,5 +7,5 @@
 	print_endline @@ String_set.to_string s
 
-open Cmdliner
+open Ocmd
 let term =
 	let recurse = Arg.(value & flag & info ["R"]
Index: trunk/cli/txt.ml
===================================================================
--- trunk/cli/txt.ml	(revision 64)
+++ trunk/cli/txt.ml	(revision 65)
@@ -1,9 +1,7 @@
-let version = "1.3.2"
-
-open Cmdliner
+open Ocmd
 let default_cmd =
 	let doc = "Discover, collect & exchange texts" in
 	let man = [ `S "CONTACT"; `P "<mailto:logarion-dev@chaotic.ninja>" ] in
-	Term.(ret (const (`Help (`Pager, None)))), Term.info "txt" ~version ~doc ~man
+	Term.(ret (const (`Help (`Pager, None)))), Term.info "txt" ~version:"%%VERSION%%" ~doc ~man
 
 let () = match Term.eval_choice default_cmd [
Index: trunk/doc/3sqd84.txt
===================================================================
--- trunk/doc/3sqd84.txt	(revision 65)
+++ trunk/doc/3sqd84.txt	(revision 65)
@@ -0,0 +1,11 @@
+ID: 3sqd84
+Date: 2022-11-06T13:01:19Z
+Title: Exploring & pulling texts from Logarion repositories
+Authors: orbifx
+Topics: Logarion
+
+Logarion repositories are collections of text files, accompanied by a special index file. These collections can exist on any server and accessed by any transport protocol. Logarion's client currently supports a plethora of protocols, HTTP, FTP, Gopher to name a few examples.
+
+A remote repository can be registered and texts copied locally. To add a new remote run: `txt pull <url>`, where <url> is the address of the remote repository. The program will connect to the server, copy the `index.pck` file and use it to download each text file. It will not redownload previous texts, unless their Date or Date-Edited dates are newer than the previous ones.
+
+The text files are by default downloaded to `.local/share/texts/peers/`. A new directory is created for each peer's unique id and the index & texts are stored in it. Running `txt pull` with no URL, will refetch indices from all previously pulled repositories, and new text files will be downloaded automatically.
Index: trunk/doc/9egbae.txt
===================================================================
--- trunk/doc/9egbae.txt	(revision 65)
+++ trunk/doc/9egbae.txt	(revision 65)
@@ -0,0 +1,15 @@
+ID: 9egbae
+Date: 2023-06-17T23:27:44Z
+Title: Building from source
+Authors: Izuru Yakumo 
+Topics: Logarion
+
+Requirements:
+* git
+* ocaml (>=4.13)
+
+1. git clone git://git.chaotic.ninja/yakumo_izuru/logarion
+2. cd logarion
+3. git submodule update --init
+4. make deps
+5. make tgz
Index: trunk/doc/Makefile
===================================================================
--- trunk/doc/Makefile	(revision 65)
+++ trunk/doc/Makefile	(revision 65)
@@ -0,0 +1,23 @@
+all: clean build
+
+build: index generate
+
+clean:
+	find htm -type f -name "*.html" -print -delete
+	find htm -type f -name "*.htm" -print -delete
+	find . -type f -name "*.atom" -print -delete
+copy-index: index
+	cp index.pck htm
+generate: relink copy-index
+	txt convert --type=htm htm
+index:
+	txt index .
+link:
+	txt file *.txt htm
+delink:
+	rm htm/*.txt
+serve:
+	darkhttpd htm
+upload:
+	rsync -acv --del htm/ webdev@chaotic.ninja:/var/www/logarion
+relink: delink link
Index: trunk/doc/d41e68.txt
===================================================================
--- trunk/doc/d41e68.txt	(revision 65)
+++ trunk/doc/d41e68.txt	(revision 65)
@@ -0,0 +1,26 @@
+ID: d41e68
+Date: 2023-10-18T18:45:33+00:00
+Title: Header format
+Authors: orbifx <fox@orbitalfox.eu>
+Topics: Logarion
+
+ID:      Unique identifier
+Date:    ISO8601 date of creation
+Topics:  Comma seperated list of topic names & phrases
+Title:   A title for the text, ideally less than 70 characters   
+Authors: List of name with optional set of <address>
+Date-edited: ISO8601, use only when text edited
+References: list of text ID links
+
+A blank line must follow the last header field.
+
+
+Example
+
+ID: 11bcd
+Title: A Logarion exemplar header
+Authors: John Doe <http://example.com> <jd@example.com>
+Date: 1970-11-06T12:29:50-00:00
+Topic: Logarion, examples
+
+Hello world!
Index: trunk/doc/footer.html
===================================================================
--- trunk/doc/footer.html	(revision 65)
+++ trunk/doc/footer.html	(revision 65)
@@ -0,0 +1,4 @@
+<hr>
+<p>
+<a href="git://git.chaotic.ninja/yakumo_izuru/logarion">Source code</a>
+</p>
Index: trunk/doc/h1a9tg.txt
===================================================================
--- trunk/doc/h1a9tg.txt	(revision 65)
+++ trunk/doc/h1a9tg.txt	(revision 65)
@@ -0,0 +1,17 @@
+ID: h1a9tg
+Date: 2022-11-20T13:28:57Z
+Authors: orbifx <orbifx@orbifx.indy>
+Title: Txt uniform resource names
+Topics: Logarion
+
+Logarion texts are transport agnostic. URIs should therefore avoid using URLs and use URNs instead. Some definitions of Uniform Resource:
+- Locator (URL) <http://en.wikipedia.org/wiki/Url>
+- Identifier (URI) <http://en.wikipedia.org/wiki/Uniform_Resource_Identifier>
+- Name (URN) <http://en.wikipedia.org/wiki/Uniform_Resource_Name>
+
+
+Links enclosed in angled brackets <> of the format:
+
+    urn:txtid:abcdef
+
+where `abcdef` is the id of the text are understood by `txt` and handled accordingly. For example when converting to HTML or Gemini, the URNs are converted to relative URLs which browsers can understand.
Index: trunk/doc/header.html
===================================================================
--- trunk/doc/header.html	(revision 65)
+++ trunk/doc/header.html	(revision 65)
@@ -0,0 +1,2 @@
+<h1>Logarion</h1>
+<p>discover, collect &amp; exchange plain text files</p>
Index: trunk/doc/htm/main.css
===================================================================
--- trunk/doc/htm/main.css	(revision 65)
+++ trunk/doc/htm/main.css	(revision 65)
@@ -0,0 +1,8 @@
+body{color:#111;background:#faeed6;margin:auto;padding:1ch;max-width:80ch}
+@media(min-resolution:130dpi){body{font-size:1.5em}}
+article>header{margin:auto;padding:1ch}
+dt{float:left;text-align:right;padding-right:1ch;min-width:8ch;opacity:0.4;clear:left}
+:target::before{content:"☞"}
+body>h1{font-family:cursive}
+h1,h2{color:#ff6600}
+h3,h4{color:#333}
Index: trunk/doc/hvhhwf.txt
===================================================================
--- trunk/doc/hvhhwf.txt	(revision 65)
+++ trunk/doc/hvhhwf.txt	(revision 65)
@@ -0,0 +1,77 @@
+ID: hvhhwf
+Date: 2022-11-06T13:19:57Z
+Title: Creating texts & publishing on the net
+Authors: orbifx
+Topics: Logarion
+
+# New
+
+To create new text files, use "txt new". For example:
+	txt new "Hello world"
+It's important to enclose the title with quotation marks if it contains spaces. The command will return the filename of the new text. The filename starts with a part of the ID and the title of the text. Use the file name to open it with your text editor.
+
+Alternatively add the -i flag to have the text editor launched to edit the newly created file:
+	txt new -i "Some title"
+
+Text files will be stored in either:
+1. The directory pointed at by txtdir if defined
+2. $HOME/.local/share/texts, if directory exists
+3. The current working directory, if all else fails
+
+The simplest approach is to put all texts in the local-share directory and override that on occasion with 
+$txtdir. For example:
+	txtdir=. txt new "Hello world"
+
+
+# Publish
+
+Texts created with "new" are treated as personal until published. To publish a text, use `txt publish [id]` where [id] is the text of the text to publish. Publication requires a `txt.conf` file which must exist in either:
+1. The current working directory
+2. $HOME/.config/txt/txt.conf
+
+With the above in place, `txt publish [id]` will add the text file with [id] in the publication-directory and reproduce the `index.pck` in that directory. If Pubdir is not defined in `txt.conf` then the environmental variable `txtpubdir` is used. If that is also undefined, the current working directory is used as a publication directory.
+
+Logarion is protocol agnostic, so publish looks for the existence of directories to copy the files, ready for publication. At the time of writing the three directories are `public_html`, `public_gemini` and `public_gopher`. For each of these directories, `txt publish [id]` will copy the text file, revise the `index.pck` and also convert produce converted files, such .htm for public_html.
+
+## txt.conf keys
+
+Id:
+	A random, unique, alphanumeric string for distinguishing the repository (atleast 6 characters of Crockford's Base32 recommended)
+
+Title:
+	a human-friendly title
+
+Authors:
+	comma seperated list of names and, optionally, addresses
+
+Topics:
+	topics the repository aims to cover
+
+Locations:
+	list of URIs the repositories can be accessed
+
+Peers:
+	list of peer URIs
+
+Pubdir:
+	(optional) the directory that contains publication subdirectories
+
+
+## HTML
+
+There are some special settings for HTML publication:
+
+HTM-style:
+	path to a CSS style. It will be inserted in every .htm file. To link to a single CSS consider using `@import`
+
+HTM-header:
+	path to a file, inserted in every .htm file, right after the body tag
+
+HTM-footer:
+	path to a file, inserted in every .htm file, right before the body tag
+
+HTM-index:
+	if defined, determines the filename for the index files. Left undefined, defaults to `index.html`
+
+HTM-feed:
+	if defined, this will overrite the feed URI used in HTML files. If left undefined the default `feed.atom` is used
Index: trunk/doc/main.css
===================================================================
--- trunk/doc/main.css	(revision 65)
+++ trunk/doc/main.css	(revision 65)
@@ -0,0 +1,8 @@
+body{color:#111;background:#faeed6;margin:auto;padding:1ch;max-width:80ch}
+@media(min-resolution:130dpi){body{font-size:1.5em}}
+article>header{margin:auto;padding:1ch}
+dt{float:left;text-align:right;padding-right:1ch;min-width:8ch;opacity:0.4;clear:left}
+:target::before{content:"☞"}
+body>h1{font-family:cursive}
+h1,h2{color:#ff6600}
+h3,h4{color:#333}
Index: trunk/doc/txt.conf
===================================================================
--- trunk/doc/txt.conf	(revision 65)
+++ trunk/doc/txt.conf	(revision 65)
@@ -0,0 +1,8 @@
+Id: 17f4e3
+Title: Logarion
+Authors: orbifx <fox@orbifalfox.eu>, Izuru Yakumo <yakumo.izuru@chaotic.ninja>
+HTM-style: main.css
+HTM-header: header.html
+HTM-footer: footer.html
+HTM-feed:
+Topics: Logarion
Index: trunk/dune-project
===================================================================
--- trunk/dune-project	(revision 64)
+++ trunk/dune-project	(revision 65)
@@ -1,5 +1,5 @@
 (lang dune 2.0)
 (name logarion)
-(version 1.3.2)
+(version 1.4.0)
 (license EUPL-1.2)
 (authors "orbifx <fox@orbitalfox.eu>")
@@ -14,3 +14,3 @@
  (name logarion)
  (synopsis "Texts archival and exchange")
- (depends (cmdliner (<= 1.0.4)) msgpck ocurl))
+ (depends ocaml dune ocurl msgpck cmdliner))
Index: trunk/logarion.opam
===================================================================
--- trunk/logarion.opam	(revision 64)
+++ trunk/logarion.opam	(revision 65)
@@ -8,10 +8,5 @@
 homepage: "https://suzunaan.chaotic.ninja/logarion/"
 bug-reports: "mailto:logarion-dev@chaotic.ninja"
-depends: [
-  "dune" {>= "2.0"}
-  "cmdliner" {<= "1.0.4"}
-  "msgpck"
-  "ocurl"
-]
+depends: ["ocaml" "dune" "ocurl" "msgpck" "ocmd"]
 build: [
   ["dune" "subst"] {pinned}
