This site is handwritten in [featherdown] by site.author, after several [#iterations].

The core technologies of vanilla  JS, CSS and HTML, are combined with a few libraries [1] to create a site that is:
- **glocal** -- runs equally well on a your //local// computer folder as on the //global// internet
- **reflective** -- many aspects of the site can be edited, live, without leaving the browser [2]
- **semi-static** -- comments and a few user-contributed elements, but without an actual backend.


## Iterations

Iterations of the whole site or of particular features are listed, most recent first.

TITLE								SUMMARY																																				SUBSEQUENT PROBLEM
Project-based organisation			Pages organised by project (deeper CMS splitting, abandoning common templates), each with its own image folder										-
Featherdown Smooth Fallback			Fallback text (Featherdown Progressive Enhancement) now fades in gradually, thus only showing when really needed (or on very slow connections)		-
Continuous rss aggregation			The same for the RSS feed, which includes the changestream summary as a weekly item																	-
Continuous changestream aggregation	Changestream aggregation is now automatically triggered on push, on the server, reducing cognitive load.											-
Continuous bundling					The bundle script runs now only in the server, triggered by each push (instead of locally and manually).											-
Redirects							Server-side redirects serve short memorable urls for pages stored in different folders.																Internal links may fail during local navigation; changestream sources may be missed, etc..
Dual loading						At runtime, the browser decides whether to load a #bundle or all modules.																			Errors in the bundler, if any, may pass undetected, since the bundle is effectively "forgotten".
Bundled loading						Loading +100 modules starts to cause network requests to slow down page loading unacceptably. Hence a code #bundle is loaded instead.				Suddenly, there are two versions to keep track of, as locally, a fresh unbundled version is needed. The bundle step is a repetitive action,and pollutes the repository.
Featherdown Progressive Enhancement	In pages without javascript (or at the initial stages of loading), #featherdown code (readable by design) is dislayed, before becoming styled HTML	Seeing pre-displayed text or code may be perceived as a "software error" rather than "deliberate design".
Changestream aggregation			A script gathers new changes in all relevant pages into a file that can be consumed to display "recent changes"										Script triggered manually 
CMS splitting						CMS is divided into smaller portions, loaded as-needed (e.g. by page listings). Each page loads now its own metadata, ignoring others				-
Inner Link listing					Internal links are now explicilty listed so they can be changed easily (shall a page move or be merged). Pages can load the link list as needed.	-
Test filter & warp (Kudamono)		Test all genres [matching a string|kudamono/tests?text=subw] and warp directly to a playable version of failed test case, in the [Kudamono Editor]	-
Source warping						Direct warping from the cursor's position in any page to the often precise line/column in source, 													-
Featherdown playground				A live editing [featherdown playground] was devised as site.name works towards closing the feedback loop											text-only editors are not ergonomic [3] unless packed with the many conveniences available in IDEs
Featherdown							#feather V1 was renamed [Featherdown] and simplified for easier extensibility with fewer self-conflicts												perhaps it became a bit slower
Reflective [Puzlog]					Each page on the [puzlog] is generated on-demand from any puzzle page using the [kudamono editor]													the link pointing to the last puzzle is always "broken", because the future does not yet exist.
Reflective RSS, Sitemap...			#RSS, Sitemap and other info refreshed on-demand																									firefox won't remember last download location for specific pages. Should make a plugin for that.
Reflective  Unit-tests	 			User-selected outdated unit #tests are now automatically replaced in the original source, instead of copy-pasting 									-
Reflective  Meta Tags				Keyboard shortcut [[ctrl shift h]] copies the current page #META, condensed as single line															-
Minimal Feather						A [single-line of code|_] is sufficient to generate a full #feather page, live																			-
Offline archival					Pages can now be archived for offline use, preserving all dynamism																					-
Function Download					Each individual function (or set thereof) can now be exported as a standalone JS script without dependencies, to use anywhere						-
Regenerative  TOC					The Table of Contents (#TOC) listens for new page elements, updating accordingly																			-
site.name domain					Old github pages are now redirected to the new domain, passing on fragments and query strings. Static page hosting at [netlify.com]					Google was slow to find the new pages, and sometimes still shows the old domain
Single-page app loading				Trying to reduce page load time by avoiding re-drawing common page elements																			Conflicts with history, and especially with dynamic content rendered after page load. Some pages would become intermixed.
Automatic image resizing			#Images automatically resized using the ´´Sharp´´ node library																						Having to manually run a script each time
CMS regeneration					Short "frontmatter" instructions on each page auto-moved to the cms										-
Feather V0							The #feather preprocessor was added to every post to reduce the amount of ´´$ {}´´ string template insertions										Too many bugs affected layout. Paragraph detection was too eager. Debugging nightmare as it affected every page ever written.
Animated GIFs						Animated gif #images recorded using the Screen2Gif program, e.g in the [Kudamono Editor] (thanks @JackLance for the tip)							-
CMS inheritance						#cms Page objects also use an #inheritance system, recovering info from similar page or dummy template pages										-
Kudamono inheritance				Kudamono genres inherit from other genres using a flexible #inheritance system, substantially decreasing amount of copy-paste						Loading a genre became more complex as now several files are involved
Function Naming convention			To tackle the complexity of the [kudamono editor] codebase, the [etymological programming] conventions were created									-
Proper Intellisense configuration	The workspace file was configured to enable project-wide function search 																			Later on, for some reason intellisense stopped finding JS function names in HTML files
Dynamic  CSS font size				font sizes, padding, line height and other aspects dynamically adapt to the available viewport using #CSS variables									A minimal and maximal size needs to be set for extremely small and huge viewports
Dynamic  CSS Palette				Using #CSS variables, the [colour palette of the site|codes/core/skin.css] could be centralised, and dynamically changed							The pages may render black and white for a split-second until the colour palette loads
Live Unit testing					Important or hard-to debug functions now [unit tested|test]. Unit #tests double as code comments and require no special syntax						In the longer term, outdated tests were a chore to update 
Progressive Web Apps				Game pages received special #meta tags to transform them into PWAs																					Offline caching was so aggressive it generated issues that lasted for months
Dynamic  TOC						A Table of Contents (#TOC) is automatically added to each page																						Late loading elements wouldn't show
Referencing people					Known people could be referenced via a shorthand, autolinking to their personal pages or profiles													Link generation was inefficient and slowing page rendering considerably
Optimised SVG  Icons				SVG #icons now drawn directly as bezier curves using @YannArmelin's [SVG Path Editor|https://yqnn.github.io/svg-path-editor/]						-
Night and Monochrome mode			Using #CSS filters, 2x2=4 modes were added																											Images, emojis and other non-textual content would stand out undesirably
Unicode  Icons						Some #icons were taken from [Unicode Table|unicode-table.com] or searched via [shapecatcher|https://shapecatcher.com]								Turns out those characters display differently on different devices and browsers (some even transform into emojis), because not all fonts are available, etc...
Comments and Hall of Fame			Comments could be added to the [Guestbook|contacts] and winners to the [Hall of Fame], using Google Apps Script										Works well for a small number of entries, but is not scalable
RSS & Sitemap Generation			News items automatically produce #RSS [entries|rss.xml], and new pages automatically added to [sitemap|sitemap.xml], via node script					-
Automatic  Meta Tags				#Meta Tags automatically etched on each page's HTML, via a node script																				Need to manually refresh a script for each page change
Shared HTML fragments				HTML fragments shared across pages could be dynamically loaded from a central location																Late loading posed some problems
News and page additions integrated	Each new page generates a new item element, to be displayed in the [news] and [index] pages															Draft pages were sometimes shown prematurely
Dynamic  Meta Tags					#Meta Tags dynamically added to each page, after loading																							Google fails to recognise Meta tags; no images appear in link previews
Icons and images					PNG and SVG #icons and #images were drawn on Microsoft Powerpoint and exported at various sizes														Image size not always optimised, cumbersome process
CMS as lazy-evaluated object		By lazily evaluating the #CMS, common information could centrally saved elsewhere, avoiding rote duplication											-
Glocal Javascript					All pages work the same whether opened locally or served from the global internet. No need for localservers, preprocessors or complex toolchains.	-
CMS as javascript object			By storing page information on a #cms JS Object, a [list of all pages|tag] can be generated live													In time, this object may grow to hundreds of lines
Source control						Using github pages to push live page edits																											At some point it made sense to have a proper domain, shorter 



## Outstanding problems

Some strategic aspects remain to be solved:
- **closing the editing cycle** -- it should be possible to update every single aspect of the site, offline, without leaving the browser
- **futureproofing** -- how to protect old pages from newer features, and their inevitable bugs,  without simply creating an archival copy of the entire codebase?
- **link rot** -- how to ensure outgoing links do not disappear in the future? (perhaps autolinking to archive.org? otherwise the only solution is to periodically scan the entire site for links, load them, store some hash, and regularly report hash changes for manual review) 
- **energy efficiency** -- when multiple users render the exact same page on their computers, they are wasting duplicate computational resources.
- **browser whims** -- how long will it take until a random browser feature will be deprecated, breaking the site?



## Alternatives for resilience

Localservers accepted				Support for [VSCode preview server|https://marketplace.visualstudio.com/items?itemName=yuichinukiyama.vscode-preview-server] added [4]
Githubless							Using VSCode and Git, Github desktop is no longer necessary																			



^^^^^^^^^^^^^^^^^^
1 Specialised external libraries include: [ToneJS|https://tonejs.github.io/], [JSZip|https://stuk.github.io/jszip/], [Puzzlescript|www.puzzlescript.net]
2 Using the command line is //less// powerful than any HTML interface (it lacks visual feedback and single click convenience); the only (fading) advantage being direct access to the filesystem
3 See the useful shortcuts in this [memo]
4 On Firefox, setting ´´privacy.file_unique_origin´´ to false disables CORS for local files, if localserver is not an option; on chrome a special flag can be set as well.