From cb1c8f8563868979f20be4e4d20a61bee5504821 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?= <p@janouch.name>
Date: Wed, 12 Aug 2020 01:40:45 +0200
Subject: Render the README as AsciiDoc

The little issues aren't worth the monospace font in Gitea.
---
 README.adoc | 294 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 294 insertions(+)
 create mode 100644 README.adoc

(limited to 'README.adoc')

diff --git a/README.adoc b/README.adoc
new file mode 100644
index 0000000..f5fab4c
--- /dev/null
+++ b/README.adoc
@@ -0,0 +1,294 @@
+Project haven
+=============
+
+haven is an umbrella project for a range of mostly desktop applications.
+
+Goal
+----
+The greater goal is to create a fresh computing environment for daily work and
+play--easily controllable, reasonably complex, both visually and internally
+unified and last but not least responsive.  One should be able to use it
+comfortably with a 60% keyboard and no pointing device.
+
+haven serves as a testing ground, leaning on the side of compromises.  It aims
+to use today's Linux desktop as a support, relying on X11/Wayland, existing
+window managers and web browsers.
+
+The focus is therefore on going breadth-first, not depth-first.  Applications
+only need to be good enough to be able to replace their older siblings at all.
+I.e. for me personally.
+
+Scope
+-----
+Subproject names aim to have the minimum viable, reasonably identifiable name.
+To group them together, a common prefix of "h" is used.  The second column is
+what should be used as the name in .desktop files, just like the GNOME project
+figured out it would make sense:
+
+ - hbe  - bitmap editor
+ - hbfe - bitmap font editor
+ - he   - text editor
+ - hfm  - file manager
+ - hib  - IRC bouncer
+ - hic  - IRC client
+ - hid  - IRC daemon
+ - hiv  - image viewer
+ - hm   - mail client
+ - hmpc - MPD client
+ - hnc  - netcat-alike
+ - ho   - all-powerful organizer
+ - hsm  - system monitor
+ - hss  - spreadsheets
+ - htd  - translation dictionary
+ - ht   - terminal emulator
+ - htk  - GUI toolkit library
+
+See Projects for more information about the individual projects.
+
+Some taken names in Debian: hd (important), hte, hy.
+
+Identity
+--------
+The name merely hints at motivations and otherwise isn't of any practical
+significance other than that we need an identifier.  This time I resisted using
+something offensive for personal amusement.
+
+A logo covering the entire project is not needed and it seems hard to figure out
+anything meaninful anyway, though we might pick a specific font to use for the
+project name <1>.
+
+The only mascot I can think of would be a black and white or generally grayscale
+My Little Pony OC but I don't really want to bring my own kinks into the project
+and I'd also need to learn how to draw one so that I don't infringe on someone
+else's copyright, or find someone else to do it.  Anyway, in lack of a proper
+logo, she could have a simple "h" or "hvn" for a cutie mark <2>.
+
+         __
+ <2>   _/ /_    <1>  | _     _          _    _
+      \  _  \        |/ \   / \| \  /  /_\ |/ \
+      / / / /        |   | |   | \  / |    |   |
+     /_/ /_/         |   |  \_/|  \/   \_/ |   |
+
+I'm not sure where I took this "h" letter styling from, it seems too familiar.
+The above illustrations also show how awful it looks when a logo is just
+a stylized version of the first letter of a name when you put the two next to
+each other.  Distinctly redundant.  Facebook and Twitter are doing fine, though,
+perhaps because they do not use them together like that.
+
+Technicalities
+--------------
+
+Languages
+~~~~~~~~~
+Primarily Golang with limited C interfacing glue, secondarily C++17, mostly for
+when the former cannot be reasonably used because of dependencies.
+
+Build system
+~~~~~~~~~~~~
+https://github.com/zevv/bucklespring is a good example of a rather simplified
+project that makes do with a single Makefile, even for cross-compilation on
+Windows.  Let us avoid CMake and the likes of it.
+
+It seems that Go can link dynamically, therefore I could build libhaven.so
+(https://docs.google.com/document/d/1nr-TQHw_er6GOQRsF6T43GGhFDelrAP0NqSS_00RgZQ
+and https://stackoverflow.com/questions/1757090/shared-library-in-go)
+and have the rest of the package as rather small binaries linking to it.
+The "cannot implicitly include runtime/cgo in a shared library" error is solved
+by "go install", which again requires "-pkgdir" because of privileges.
+libstd.so is a beautiful 30 megabytes (compared to libc.a: 4.9M).
+
+GUI
+~~~
+Probably build on top of X11/Xlib or xgb<1>.  Wayland can wait until it
+stabilizes--it should not be a major issue switching the backends.
+Vector graphics can be handled by draw2d<2>.
+
+<1> https://rosettacode.org/wiki/Window_creation/X11#Go
+<2> https://github.com/llgcode/draw2d
+
+The c2 wiki unsurprisingly has a lot of material around the design and
+realisation of GUIs, which might be useful.
+
+It seems like an aligning/constraint-based "layout manager" will be one of the
+first harder problems here.  However I certainly don't want to use fixed
+coordinates as they would introduce problems with different fonts and i18n.
+
+We could use BDF fonts from the X11 distribution, but draw2d has native support
+for FreeType fonts and it's more of a choice between vectors and bitmaps.
+
+The looks will be heavily inspired by Haiku and Windows 2000 and the user will
+have no say in this, for simplicity.
+
+.Resources:
+ - https://github.com/golang/exp/tree/master/shiny is a GUI library
+ - https://github.com/as/shiny is a fork of it
+ - http://man.cat-v.org/plan_9/1/rio has a particular, unusual model
+
+Internationalisation
+~~~~~~~~~~~~~~~~~~~~
+For i18n https://github.com/leonelquinteros/gotext could be used, however I'll
+probably give up on this issue as I'm fine enough with English.
+
+Go also has x/text packages for this purpose, which might be better than GNU,
+but they're essentially still in development.
+
+Versioning
+~~~~~~~~~~
+Versions are for end users.  We can use a zero-based, strictly increasing
+number, be it a simple sequence or date-based numbers such as 1807.  If we do
+this at all, we will eventually also need to release patch versions.
+
+Since dates don't seem to convey important information, let us settle on 0, 1,
+1.1, 2, 3, 3.1, 3.2, ...  In practice releases are going to be scarce, unless
+we find a person to take care of it.  Note that there is no major/minor pair--
+a new project will be created when radical philosophical or architectural
+changes are to be made.  See Goal.
+
+Projects
+--------
+These are sorted in the order in which they should be created in order to gain
+the best possible momentum.  The htk GUI toolkit is implied as a side product
+permeating the entire list.
+
+Some information is omitted from these descriptions and lies either in my head
+or in my other notes.
+
+hid -- IRC daemon
+~~~~~~~~~~~~~~~~~
+This project is unimportant by itself, its sole purpose is to gain experience
+with Go on something that I have already done and understand well.  Nothing
+beyond achieving feature parity is in the initial scope.
+
+One possibility of complicating would be adding simple WebSocket listeners but
+that's already been done for me https://github.com/kiwiirc/webircgateway and
+it's even in Go, I just need to set up kiwiirc.
+
+Later, when we have a pleasant IRC client, implement either the P10 or the TS6
+server-linking protocol and make atheme work with a generic module.
+Alternatively add support for plugins.  The goal is to allow creating integrated
+bridges to various public forums.
+
+hnc -- netcat-alike
+~~~~~~~~~~~~~~~~~~~
+The result of testing hid with telnet, OpenSSL s_client, OpenBSD nc, GNU nc and
+Ncat is that neither of them can properly shutdown the connection.  We need
+a good implementation with TLS support.
+
+hpcu -- PRIMARY-CLIPBOARD unifier
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+An improved replacement for autocutsel in selection synchronization "mode":
+
+ - using only one OS process;
+ - not polling selections twice a second unnecessarily;
+ - calling SetSelectionOwner on change even when it already owns the selection,
+   so that XFIXES SelectionNotify events are delivered;
+ - not using cut buffers for anything.
+
+Only UTF8_STRING-convertible selections are synchronized.
+
+hasp -- (lib)asciidoc syntax preprocessor
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Provisional tool to make libasciidoc understand more syntax, namely
+two-line/underlined titles for my Gitea projects.
+
+ht -- terminal emulator
+~~~~~~~~~~~~~~~~~~~~~~~
+Similar scope to st(1).  Clever display of internal padding for better looks.
+
+hib and hic -- IRC bouncer and client
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+An IRC client is a good starting application for building a GUI toolkit, as the
+UI can afford to be truly minimalistic and most of it is text.
+
+To resolve an issue I have with my current IRC client, the client is going to be
+split into two parts: a bouncer that manages all connections and state, and
+a separate GUI that communicates with the backend over TLS/WebSocket.  Perhaps
+only the per-buffer input line is going to be desynchronized.
+
+https://godoc.org/github.com/gorilla/websocket
+
+The higher-level client-server API could be made rather generic to allow for
+smooth integration with non-IRC "backends" such as Slack or Mattermost.
+
+he -- text editor
+~~~~~~~~~~~~~~~~~
+VIM controls, no scripting, no syntax highlight, single-file, made for
+variable-width/proportional fonts.  Initially done primarily to produce a text
+editing widget, which is going to be an interesting challenge, arguably better
+solved by whole program composition.  Scintilla may provide some inspiration.
+
+In the second stage, support for the Language Server Protocol will be added so
+that the project can be edited using its own tools.  Some scripting, perhaps
+a tiny subset of VimL, might be desirable.  Or other means of configuration.
+
+Visual block mode or the color column may still be implemented.
+
+The real model for the editor is Qt Creator with FakeVIM, though this is not to
+be a clone of it, e.g. the various "Output" lists could be just special buffers,
+which may be have names starting on "// ".
+
+.Resources:
+ - http://doc.cat-v.org/plan_9/4th_edition/papers/sam/
+
+ho -- all-powerful organizer
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Zettelkasten with fulltext search, arbitrary reciprocal links, arbitrary tags.
+Flat storage.  Should be able to use translation dictionaries for search hints.
+
+Indexing and search may be based on a common database, no need to get all fancy:
+
+ - http://rachbelaid.com/postgres-full-text-search-is-good-enough/
+ - https://www.sqlite.org/fts3.html#full_text_index_queries (FTS4 seems better)
+
+htd -- translation dictionary
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+This specific kind of application doesn't need a lot of user interface either,
+just a tab bar, text entry and two columns of text with simple formatting.
+
+For simplicity we will establish a custom dictionary format based on either
+simple compress/gzip with separate files in StarDict style or, since we don't
+really strive for random access and memory-efficiency (those 120M that sdtui
+takes with my 10 dictionaries isn't particularly bad), pack everything with
+archive/zip.
+
+Instead of ICU we may use x/text/collate and that's about everything we need.
+Since we have our own format, we may expect the index to be ordered by the
+locale's rules, assuming they don't change between versions.
+
+hmpc -- MPD client
+~~~~~~~~~~~~~~~~~~
+Here the focus will be on the GUI toolkit.  I don't expect this application to
+get big, since its predecessor nncmpp isn't either.  The daemon takes care of
+all complex stuff.  It would be nice to add lyrics and search later, though.
+
+hiv -- image viewer
+~~~~~~~~~~~~~~~~~~~
+JPG, PNG, first frame of GIF.  Zoom.  Going through adjacent files in directory
+using cursor keys.  Possibly a dialog with image metadata.
+
+hfm -- file manager
+~~~~~~~~~~~~~~~~~~~
+All we need to achieve here is replace Midnight Commander, which besides the
+most basic features includes a VFS for archives.  The editing widget in
+read-only mode could be used for F3.  The shell is going to work very simply,
+creating a PTY device and running things under TERM=dumb while decoding SGR,
+or one could decide to run a new terminal emulator with a different shortcut.
+ht could probably also be integrated.
+
+Eventually the number of panels should be arbitrary with proper shortcuts for
+working with them.  We might also integrate a special view for picture previews,
+which might or might not deserve its own program.
+
+hss -- spreadsheets
+~~~~~~~~~~~~~~~~~~~
+The first version doesn't need to be able to reference other cells, and can more
+or less be a CSV editor.
+
+We can take inspiration from Excel:
+
+ - https://docs.microsoft.com/en-us/office/client-developer/excel/excel-recalculation
+ - https://www.microsoft.com/en-us/research/uploads/prod/2018/03/build-systems.pdf
+
+The rest
+~~~~~~~~
+Currently there are no significant, specific plans about the other applications.
-- 
cgit v1.2.3

