<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MakeStaticSite &#8211; ptworld.net</title>
	<atom:link href="https://ptworld.net/blog/tag/makestaticsite/feed/" rel="self" type="application/rss+xml" />
	<link>https://ptworld.net</link>
	<description>e-consultancy, research and publishing</description>
	<lastBuildDate>Tue, 16 Apr 2024 14:58:12 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>Introducing MakeStaticSite for website deployment</title>
		<link>https://ptworld.net/blog/introducing-makestaticsite-for-website-deployment/</link>
		
		<dc:creator><![CDATA[Paul]]></dc:creator>
		<pubDate>Wed, 21 Sep 2022 14:53:20 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[MakeStaticSite]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[shell scripts]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[website]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://ptworld.net/?p=1504</guid>

					<description><![CDATA[(from a technical perspective) Launch of MakeStaticSite.sh Website November 2022: A website dedicated to MakeStaticSite is now available at https://makestaticsite.sh/. It provides the latest version of the software, released under AGPL, along with various documentation to help getting started. Motivation <a class="more-link" href="https://ptworld.net/blog/introducing-makestaticsite-for-website-deployment/">Read More ...</a>]]></description>
										<content:encoded><![CDATA[
<p>(from a technical perspective)</p>



<h2 class="wp-block-heading">Launch of MakeStaticSite.sh Website</h2>



<p><strong>November 2022</strong>: A website dedicated to MakeStaticSite is now available at <a rel="noreferrer noopener" href="https://makestaticsite.sh/" target="_blank">https://makestaticsite.sh/</a>.  It provides the latest version of the software, released under AGPL, along with various documentation to help getting started.</p>



<h2 class="wp-block-heading">Motivation</h2>



<p>The process of developing this website has evolved considerably.  On setting it up a few years ago in the conventional manner using WordPress, I duly familiarised myself with routines for maintaining security and improving performance on a hosted platform.  However, there were several aspects that weren&#8217;t ideal: the live content was hosted remotely, albeit with backups; updating the site <em>in situ</em>, particularly for major redesigns, was inconvenient; and performance wasn&#8217;t always as good as expected.  Observing that most of the content was not dynamic in nature, I resolved to develop the site locally and then, as a separate process, deliver it as a largely static site. </p>



<p>The rationale for generating static sites has been around a long-time; I first tackled this more than 20 years ago, when I needed to generate a <a href="https://ptworld.net/portfolio/multimedia-languages#CD2Go">CD ROM from a CGI/Perl multimedia website</a>.  Nowadays, the field is mature; <a rel="noreferrer noopener" href="https://www.netlify.com/blog/2018/07/12/the-reign-of-static-site-generators/" target="_blank">a Netlify blog post</a> (Netlify is a cloud-based service where many static outputs end up) gives many valid reasons, rooted in the need for more responsive work processes.  Typically underpinned by a simple language called <a rel="noreferrer noopener" href="https://www.w3schools.io/file/markdown-introduction/" target="_blank">markdown</a>, there has been a surge in solutions; hence, <a rel="noreferrer noopener" href="https://jamstack.org/generators/" target="_blank">options for Jamstack</a> abound.  However, the processes tend to be heavily oriented to developers at the expense of content authors, issues I know first-hand from enabling web access to museum collections.</p>



<p>I wanted instead to support existing content management processes, i.e. to continue with creating and managing content in WordPress, and then &#8216;at the press of a button&#8217; generate and publish a static copy online.  There are already some solutions, including dedicated plugins such as <a rel="noreferrer noopener" href="https://wordpress.org/plugins/simply-static/" target="_blank">Simply Static</a>.  Tim Nash, having observed increasingly complexity with the Jamstack options, <a rel="noreferrer noopener" href="https://timnash.co.uk/blog-like-a-confused-hacker-2020/" target="_blank">has described</a> how he used <a rel="noreferrer noopener" href="https://github.com/WP2Static/wp2static" target="_blank">WP2Static</a> via <a rel="noreferrer noopener" href="https://wp-cli.org" target="_blank">WP-CLI</a>, the WordPress command-line interface, for a (relatively) simple and compact solution.  But I hesitate over the use of a WordPress plugin to generate the static site.  Apart from the ongoing issue of maintenance and compatibility with WP Core, plugins are not really necessary since a public-facing website should be <em>de facto</em> crawlable by a web spider and not require internal system information.  </p>



<p>And so I turned to general-purpose tools I could run from the command line.  Enter <a rel="noreferrer noopener" href="https://www.gnu.org/software/wget/" target="_blank">Wget</a>, a ubiquitous utility for retrieving and packaging any number of web pages for subsequent viewing.  I needed to configure it, add a few additional inputs, and then choose where to store the outputs.  This led naturally to delving into (<a rel="noreferrer noopener" href="https://tiswww.case.edu/php/chet/bash/bashtop.html" target="_blank">Bash</a>) shell scripting to bring it all together and I continued the process, adding deployment options and invoking more commands, particularly <a rel="noreferrer noopener" href="https://wp-cli.org" target="_blank">WP-CLI</a> to prep the WordPress output (and to include a version of the plugin, <a rel="noreferrer noopener" href="https://github.com/paultraf/wp-static-search" target="_blank">WP Static Search</a>, revised to work offline).  If you examine the source code of this page, you will see the result.</p>



<h2 class="wp-block-heading">Pipeline</h2>



<p>Shell scripting became a means to orchestrate the overall process, which is readily seen as a <em>pipeline</em> comprising a sequence of <em>phases</em>.  For example, one phases runs <tt>wget</tt> for the initial capture, whilst another re-runs <tt>wget</tt> to more completely capture a site.  In fact, many core web development processes can be incorporated, such as replacing certain internal-facing pages or sections with alternative content; and invoking command-line tools for validation and streamlining output.  As of version 0.21, there are ten phases altogether; and command-line options allow you to control the start phase and end phase.</p>



<p>The flowchart below illustrates an emerging pipeline (for the latest perspective, please refer to pages on <a rel="noreferrer noopener" href="https://makestaticsite.sh/in-depth/workflow/" target="_blank">workflow</a> and <a rel="noreferrer noopener" href="https://makestaticsite.sh/in-depth/workflow/phases/" target="_blank">phases</a>).</p>



<div class="wp-block-cp-timeline-content-timeline-block Cool-Content-Timeline"><div class="cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484"><style scoped="true">.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-vertical-timeline-body .story-time p{color: #333;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-horizontal-timeline-body .story-time p{color: #333;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-vertical-timeline-body::before{background: linear-gradient(to bottom, rgba(230, 230, 230, 0) 0%, #D91B3E 10%, #D91B3E 90%, rgba(230, 230, 230, 0) 100%);}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-horizontal-timeline-body .timeline-content::before{background: #D91B3E;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-horizontal-timeline-body .timeline-content::after{background: #D91B3E;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-vertical-timeline-body .timeline-content::before{background: #D91B3E !important;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-vertical-timeline-body.left .story-details::after{background: #D91B3E !important;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-vertical-timeline-body.right .story-time::after{background: #D91B3E !important;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-vertical-timeline-body .timeline-content .timeline-block-icon{background: #D91B3E !important;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-horizontal-timeline-body .timeline-content .timeline-block-icon{background: #D91B3E !important;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-vertical-timeline-body.both-sided .timeline-content .position-right .story-details::before{border-right-color: #D91B3E !important;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-vertical-timeline-body.both-sided .timeline-content .position-left  .story-details::before{border-left-color: #D91B3E !important;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-vertical-timeline-body.one-sided.left .timeline-content  .story-details::before{border-right-color: #D91B3E !important;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-vertical-timeline-body.one-sided.right .timeline-content  .story-details::before{border-left-color: #D91B3E !important;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-vertical-timeline-body .timeline-content  .story-details{border-color: #D91B3E !important;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-horizontal-timeline-body .timeline-content .ctl-row .ctl-6.timeline-block-detail::before{border-bottom-color: #D91B3E !important;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-horizontal-timeline-body .ctl-6.timeline-block-detail{border-top-color: #D91B3E !important;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-vertical-timeline-body .timeline-content  .timeline-block-icon{border-color: #D91B3EFF !important;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-horizontal-timeline-body .swiper-button-next{color: #D91B3E;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-horizontal-timeline-body .swiper-button-prev{color: #D91B3E;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .cool-horizontal-timeline-body .swiper-pagination-bullet-active{background: #D91B3E;}.cool-timeline-block-9f4fed9e-b053-4040-999f-b8d7bd2d2484 .icon-true .timeline-block-icon span.timeline-block-render-icon svg{fill: white;}</style><div class="cool-vertical-timeline-body both-sided left"><div class="cool-timeline-block-list">
<div class="wp-block-cp-timeline-content-timeline-block-child swiper-slide"><div class="timeline-content icon-false "><div class=" timeline-block-timeline ctl-row  position-right"><div class="ctl-6 timeline-block-time"><div class="story-time"><p>Setup</p></div></div><div class="timeline-block-icon"></div><div class="ctl-6 timeline-block-detail"><div class="story-details"><div class="story-image"><img decoding="async" src="https://ptworld.net/wp-content/uploads/2022/09/sample.cfg-part.png" alt="Extract from a sample configuration (text file) for MakeStaticSite shows options, row by row"/></div><div class="story-content"><h3>Configuration dialogue</h3><p>The first step is to run the <tt>setup.sh</tt> script, which guides the user in an interactive dialogue to specify a series of options. </p></div></div></div></div></div></div>



<div class="wp-block-cp-timeline-content-timeline-block-child swiper-slide"><div class="timeline-content icon-false "><div class=" timeline-block-timeline ctl-row  position-right"><div class="ctl-6 timeline-block-time"><div class="story-time"><p>Initialisation</p></div></div><div class="timeline-block-icon"></div><div class="ctl-6 timeline-block-detail"><div class="story-details"><div class="story-content"><h3>Configure </h3><p>The system reads and processes configuration options<br><ul><li>read runtime options</li><li>read configuration file options</li><li>prepare output layout</li> </ul></p></div></div></div></div></div></div>



<div class="wp-block-cp-timeline-content-timeline-block-child swiper-slide"><div class="timeline-content icon-false "><div class=" timeline-block-timeline ctl-row  position-right"><div class="ctl-6 timeline-block-time"><div class="story-time"><p>Prep the CMS</p></div></div><div class="timeline-block-icon"></div><div class="ctl-6 timeline-block-detail"><div class="story-details"><div class="story-content"><h3>CMS-specific streamlining</h3><p>Optionally use wp-cli to<br><ul><li>ensure nice permalinks</li><li>remove query strings</li><li>remote shortlinks</li><li>replace with static search</li></ul>(Currently WordPress-only, but modules could be developed for other CMS.) </p></div></div></div></div></div></div>



<div class="wp-block-cp-timeline-content-timeline-block-child swiper-slide"><div class="timeline-content icon-false "><div class=" timeline-block-timeline ctl-row  position-right"><div class="ctl-6 timeline-block-time"><div class="story-time"><p>Generate static site  </p></div></div><div class="timeline-block-icon"></div><div class="ctl-6 timeline-block-detail"><div class="story-details"><div class="story-content"><h3>Generate wget mirror (first run) </h3><p>Run wget with the supplied configuration options<br><ul><li>optionally incorporate further input files</li><li>optionally set up a zip files</li><li>store the mirror in its own directory with timestamp</li> </ul></p></div></div></div></div></div></div>



<div class="wp-block-cp-timeline-content-timeline-block-child swiper-slide"><div class="timeline-content icon-false "><div class=" timeline-block-timeline ctl-row  position-right"><div class="ctl-6 timeline-block-time"><div class="story-time"><p>Augment static site  </p></div></div><div class="timeline-block-icon"></div><div class="ctl-6 timeline-block-detail"><div class="story-details"><div class="story-content"><h3>Further processing with wget </h3><p>Run wget with the supplied configuration options to fill in gaps<br><ul><li>optionally crawl static files for further URLs</li><li>Filter the URLs to retrieve only assets (multimedia files, etc.)</li><li>Re-run wget on the additional URLs</li></ul></p></div></div></div></div></div></div>



<div class="wp-block-cp-timeline-content-timeline-block-child swiper-slide"><div class="timeline-content icon-false "><div class=" timeline-block-timeline ctl-row  position-right"><div class="ctl-6 timeline-block-time"><div class="story-time"><p>Optimise static site  </p></div></div><div class="timeline-block-icon"></div><div class="ctl-6 timeline-block-detail"><div class="story-details"><div class="story-content"><h3>Further post-processing for deployment </h3><p>Further post-wget processing<br><ul><li>convert feeds to be XML files and modify references accordingly</li><li>Apply HTML Tidy to make more standards-compliant and use pretty-print (dependent on options)</li></ul>An accessibility validator could be added here.</p></div></div></div></div></div></div>



<div class="wp-block-cp-timeline-content-timeline-block-child swiper-slide"><div class="timeline-content icon-false "><div class=" timeline-block-timeline ctl-row  position-right"><div class="ctl-6 timeline-block-time"><div class="story-time"><p>Create an offline zip archive</p></div></div><div class="timeline-block-icon"></div><div class="ctl-6 timeline-block-detail"><div class="story-details"><div class="story-content"><h3>Create a custom zip based on the mirror</h3><p>The mirror acts as the basis for a zip archive, ready for uploading with the site or other distribution channels.</p></div></div></div></div></div></div>



<div class="wp-block-cp-timeline-content-timeline-block-child swiper-slide"><div class="timeline-content icon-false "><div class=" timeline-block-timeline ctl-row  position-left"><div class="ctl-6 timeline-block-time"><div class="story-time"><p>Augment</p></div></div><div class="timeline-block-icon"></div><div class="ctl-6 timeline-block-detail"><div class="story-details"><div class="story-content"><h3>Further additions</h3><p>Optionally augment the static mirror with <em>snippets</em>, substituting chunks of HTML in particular places according to the use of snippet tags.  These will augment the zip file also.<br>Additionally, allow the inclusion of further files that might not necessarily be static files.</p></div></div></div></div></div></div>



<div class="wp-block-cp-timeline-content-timeline-block-child swiper-slide"><div class="timeline-content icon-false "><div class=" timeline-block-timeline ctl-row  position-right"><div class="ctl-6 timeline-block-time"><div class="story-time"><p>Deploy</p></div></div><div class="timeline-block-icon"></div><div class="ctl-6 timeline-block-detail"><div class="story-details"><div class="story-content"><h3>Finalise and deploy locally or remote </h3><p>Optionally copy over additional <br><ul><li>Optionally copy over additional files, which might be scripts to provide missing interactivity</li><li>Finally deploy on local or remote server using rsync</li></ul></p></div></div></div></div></div></div>
</div></div></div></div>



<h2 class="wp-block-heading">Extending the usefulness</h2>



<p>MakeStaticSite is a prototype that was initially developed for individuals who are creating and maintaining websites on a personal computer.  However, the question soon arose: how might a team of content authors and editors be supported?  (The answer is: yes!)</p>



<p>For example, what if this site is to have multiple contributors?  In this case, the most straightforward approach is to set up or continue hosting with a third-party hosting provider, in the usual way.  This means those who are creating and managing content carry on as normal through the dashboard.  The main change is to separate the editing environment from the public site, which can be achieved by restricting access by some means of web authentication.  Then, run MakeStaticSite to deploy the static site to the public, whether on the server or remotely.  This approach ensures continuity; the only additional consideration is how to initiate MakeStaticSite once changes have been made — from within the CMS or external to it?</p>



<p>An initial test has shown that once set up, the process of maintenance and deployment can be carried out entirely from within WordPress.  This can be achieved by running the script under the terminal emulator <a rel="noreferrer noopener" href="https://wordpress.org/plugins/wpterm/" target="_blank">WPTerm</a> (MakeStaticSite has an option to run &#8216;unattended&#8217;, which makes default selections).  This depends on appropriate support for MakeStaticSite on the server; for shared hosting, the versions of required components, particularly Wget, may be somewhat old and, of course, for any serious use with a third party, access to WPTerm should be properly secured as instructed.  It&#8217;s preferable to keep the running of MakeStaticSite on a personal computer, an arrangement that has been used for <a href="https://fuengsin.org/" target="_blank" rel="noreferrer noopener">fuengsin.org</a>.</p>



<p>However, hosting with a third party means that the data is no longer immediately under our control; although a mixture of database replication and file synchronization can compensate, there&#8217;s some loss of independence.  Perhaps a better solution lies in p2p networks, but that&#8217;s an area I have yet to explore &#8230;</p>



<p>For now, this tool serves my needs well and I hope it is helpful to others.  Please refer to the <a href="https://makestaticsite.sh/" data-type="page" data-id="1499">MakeStaticSite project site</a> for further information.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>MakeStaticSite</title>
		<link>https://ptworld.net/projects/software/makestaticsite/</link>
		
		<dc:creator><![CDATA[Paul]]></dc:creator>
		<pubDate>Tue, 20 Sep 2022 14:26:59 +0000</pubDate>
				<category><![CDATA[development]]></category>
		<category><![CDATA[MakeStaticSite]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[website]]></category>
		<guid isPermaLink="false">https://ptworld.net/?page_id=1499</guid>

					<description><![CDATA[Foreword The issues of Website security and performance continue to loom large, with organisations large and small continuing to suffer severe loss of service following a compromise — whether a site gets defaced, Google results become hijacked, or, more seriously, <a class="more-link" href="https://ptworld.net/projects/software/makestaticsite/">Read More ...</a>]]></description>
										<content:encoded><![CDATA[
<p></p>



<h2 class="wp-block-heading">Foreword</h2>



<p>The issues of Website security and performance continue to loom large, with organisations large and small continuing to suffer severe loss of service following a compromise — whether a site gets defaced, Google results become hijacked, or, more seriously, personal data is breached.  </p>



<p>As will be described below, MakeStaticSite already offers a freely available solution (which has been implemented for this site), but it requires a certain level of technical knowledge.   However, further development is on the way to provide a Web-based service that will be simple and easy to use.  A proof of concept has already been implemented and been successfully tested, which should pave the way for <a href="https://ptworld.net/about/business/" data-type="page" data-id="1034">business</a> investment.   </p>



<h2 class="wp-block-heading">What&#8217;s the problem?</h2>



<p>Security issues arise largely from the way the content is generated and delivered to site visitors using <em>server-side processing</em>, which typically involves scripts and databases to select and deliver specific text, multimedia, and so on.  For example, content management systems (such as <a href="https://wordpress.org/" target="_blank" rel="noreferrer noopener">WordPress</a> and <a href="https://drupal.org/" target="_blank" rel="noreferrer noopener">Drupal</a>) are based on PHP and MySQL, which, if misconfigured, might yield not only the desired pages but be open to requests crafted to subvert the setup and yield unintended access.  Thus, maintaining the security of such a setup is an ongoing process that requires continual vigilance, responding promptly to security notices with the installation of updates, but it&#8217;s a race against time and there&#8217;s no guarantee that all vulnerabilities will be spotted.</p>



<p>MakeStaticSite belongs to the class of software known as <em>static site generators</em>, which removes all the dynamic components from public exposure, replacing them with a set of web pages (plain HTML, CSS, JavaScript) that require no server-side processing.  The pages are prepared beforehand in a safer environment, such as an individual&#8217;s laptop or a shared space behind a firewall, protected by strict access controls.  This simplifies the delivery process as well as helping with security.  Shell scripting is used, making available various tools to handle different aspects of the task.  An <a href="https://ptworld.net/blog/introducing-makestaticsite-for-website-deployment/" data-type="post" data-id="1504">introductory post</a> provides an overview of the processes involved. </p>



<p>For developers and system administrators, MakeStaticSite provides a convenient means to set up and manage the automatic creation and deployment of static versions of websites. Such sites can be administered locally and then deployed remotely to some other hosting provider. Strictly speaking, this is not an archival tool as the output is not an exact mirror, but a version of the site that preserves content whilst aiming to remain current. For example, RSS feeds are saved and then renamed with <tt>.xml</tt> extensions, and further files may be added.</p>



<p>Anyone who has some familiarity with the command line should be able to use the tool to assist in maintaining their sites, though such an interface is off-putting to some.  Further, a scripting-based approach has been chosen to make this tool widely accessible for developers to further fine-tune; a number of refinements are already included that augment the standard use of <a href="https://www.gnu.org/software/wget/" target="_blank" rel="noreferrer noopener">Wget</a>, such as support for arbitrary attributes and, in the case of WordPress, the use of <a href="https://wp-cli.org/" target="_blank" rel="noreferrer noopener">WP-CLI</a> to prepare sites beforehand.</p>



<p>MakeStaticSite has been released as open source software, available under the <a href="https://www.gnu.org/licenses/agpl-3.0.en.html">GNU Affero General Public License version 3</a> .  For further details, please refer to the project site, <a href="https://makestaticsite.sh/" target="_blank" rel="noreferrer noopener">makestaticsite.sh</a>.  Many thanks to various developers for sharing their knowledge on shell scripting, particularly on blogs and Q&amp;A websites such as <a href="https://stackexchange.com/" target="_blank" rel="noreferrer noopener">Stack Exchange</a> and to those who have tested, commented on and otherwise supported MakeStaticSite.</p>



<h2 class="wp-block-heading">Hosted Web Service</h2>



<p>In its present form, it is technical in nature, aimed at developers and system administrators.  However, as a further development, a hosted Web service is being developed, with a simple user interface.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="761" src="https://ptworld.net/wp-content/uploads/2024/01/MSSWeb_publish_architecture-1024x761.png" alt="Graphic showing how the MakeStaticSiteWeb dashboard launches three stages of the publication process at a click of a link or press of a button: authoring in a CMS (WordPress), building the static site and viewing the output." class="wp-image-1652" srcset="https://ptworld.net/wp-content/uploads/2024/01/MSSWeb_publish_architecture-1024x761.png 1024w, https://ptworld.net/wp-content/uploads/2024/01/MSSWeb_publish_architecture-300x223.png 300w, https://ptworld.net/wp-content/uploads/2024/01/MSSWeb_publish_architecture-768x571.png 768w, https://ptworld.net/wp-content/uploads/2024/01/MSSWeb_publish_architecture-500x371.png 500w, https://ptworld.net/wp-content/uploads/2024/01/MSSWeb_publish_architecture-800x594.png 800w, https://ptworld.net/wp-content/uploads/2024/01/MSSWeb_publish_architecture.png 1155w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>The user logs in to a central dashboard to maintain their projects.  By following a link or clicking a button, they can launch their CMS editor, build a static version of the site and browse the output.</p>



<h2 class="wp-block-heading">How you can help!</h2>



<p>At this stage, we are looking for investment.  Please <a href="https://ptworld.net/contact/" data-type="page" data-id="20">get in touch</a> to try out the demo and to arrange for a presentation.</p>



<p></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Software</title>
		<link>https://ptworld.net/projects/software/</link>
		
		<dc:creator><![CDATA[Paul]]></dc:creator>
		<pubDate>Tue, 07 Jun 2022 13:15:13 +0000</pubDate>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[languages]]></category>
		<category><![CDATA[lifecycle]]></category>
		<category><![CDATA[MakeStaticSite]]></category>
		<category><![CDATA[methodologies]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[open standards]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[publishing]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://ptworld.net/?page_id=989</guid>

					<description><![CDATA[The digital world is made up of software and hardware and increasingly permeates our lives. Analogous to making material donations, many developers offer software freely for the wider community in the hope that others may benefit also. They typically do <a class="more-link" href="https://ptworld.net/projects/software/">Read More ...</a>]]></description>
										<content:encoded><![CDATA[
<p>The digital world is made up of software and hardware and increasingly permeates our lives.  Analogous to making material donations, many developers offer software freely for the wider community in the hope that others may benefit also.  They typically do this by releasing software under an <a rel="noreferrer noopener" href="https://opensource.org/osd" target="_blank">open source</a> license.  </p>



<p>The generous ethos is admirable.  Indeed, whereas the spotlight has recently been shone on software developers to become more aware of certain ethical issues, along with pressure to change their practices, there is in fact much to be learnt from that community.  I have tried to intimate this in <a rel="noreferrer noopener" href="https://www.chezpaul.org.uk/interfth/osswisdom.html" target="_blank">Open Sources: A Higher Consciousness in Software Development</a>, a paper I gave at an unusual <a rel="noreferrer noopener" href="https://www.chezpaul.org.uk/interfth/birdofheaven.html" target="_blank">conference on the theme of wisdom</a>.</p>



<p>As a developer myself, I am largely <a rel="noreferrer noopener" href="https://paultrafford.blogspot.com/2007/01/zx-spectrum-and-scrabble-nostalgia.html" target="_blank">self-taught since the 1980s</a>.  It may explain why, when solving programming problems, I can be somewhat unconventional and occasionally original.</p>



<h2 class="wp-block-heading">Open Source contributions</h2>



<p>I&#8217;m not a prolific or fluent coder, but have contributed to a few open source projects and am currently working on two.</p>



<ul class="wp-block-list">
<li><strong><a href="https://ptworld.net/projects/software/makestaticsite/" data-type="page" data-id="1499">MakeStaticSite</a></strong>, a static site generator and deployer, is a Bash script that I already use to generate static versions of locally-developed WordPress sites (like this one and <a href="https://research.siga.la" target="_blank" rel="noreferrer noopener">research.siga.la</a>).  It is release as free/open source software under AGPL v.3 and is <a href="https://makestaticsite.sh/getting-started/installing/">available for download</a>.</li>



<li><strong>WP Offline Search</strong> is a further refinement of my <a href="https://github.com/paultraf/wp-static-search/" target="_blank" rel="noreferrer noopener">fork of WP Static Search</a> by Gergely Szerovay, who developed a WordPress plugin based on <a href="https://lunrjs.com/" target="_blank" rel="noreferrer noopener">Lunr.js</a>. As I&#8217;ve not received any response to my pull requests and have reworked quite a lot of the code, I changed the name and intend to set up a new repository.</li>



<li><a href="https://github.com/jcdarwin/epubcheck-web" target="_blank" rel="noreferrer noopener">epubcheck-web</a> (contributor) – enabling standards-based checking of ePub documents to help self-publishing, motivated by <a href="https://ptworld.net/portfolio/publishing-systems/#ebook">my experiences of self-publishing a Kindle book</a> (see especially the <a href="https://ptworld.net/portfolio/publishing-systems/#ebook" data-type="page" target="_blank" rel="noreferrer noopener">EPUB conversion report slides</a>).</li>
</ul>



<p>I hope to share the Sigala code likewise, once it has reached a certain level of maturity. </p>



<p>For my work using other people&#8217;s software, take a look at the <a href="https://ptworld.net/portfolio/">portfolio</a>.</p>



<h3 class="wp-block-heading">Legacy software, but enduring paradigms</h3>



<p>At the turn of the millennium, there was no universal means for authors to edit and maintain their content through their web browser.  The technical solutions that existed tended to work only on specific platforms, carried a fee, or else require a Java plugin.</p>



<p>In response, I devised one, <a rel="noreferrer noopener" href="https://web.archive.org/web/20011205040442/http://users.ox.ac.uk/~pault/netwedit/index.html" target="_blank">NetWedit</a>, possibly the world&#8217;s first cross-platform JavaScript-based solution, released under <a rel="noreferrer noopener" href="https://fossa.com/blog/open-source-software-licenses-101-lgpl-license/" target="_blank">GNU LGPL</a>, in the days when I still thought that the first &#8216;L&#8217; stood for &#8216;library&#8217; rather than &#8216;lesser&#8217;.  It was experimental and used a crafty method, but it worked well enough for members of Oxford University&#8217;s Theology Faculty to maintain their profiles for a <a href="https://ptworld.net/portfolio/theology-faculty-tlr/" data-type="page" data-id="456">teach and learning resources database</a>. </p>



<p>As browser DOM support improved, I subsequently enhanced the functionality, but kept the same basic user interface, to produce <a rel="noreferrer noopener" href="https://web.archive.org/web/20100109060438/http://users.ox.ac.uk/~pault/rtwedit/" target="_blank">RTWedit</a>, which was incorporated into early versions of WebLearn, Oxford University&#8217;s centrally-hosted virtual learning environment.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="892" height="637" src="https://ptworld.net/wp-content/uploads/2022/08/OUCS-IT_Learning_WebLearn_editor.png" alt="Rich text editing in a pop-up window with basic functions to apply bold and italic, to create hyperlinks and to insert images" class="wp-image-1353" style="width:669px;height:478px" srcset="https://ptworld.net/wp-content/uploads/2022/08/OUCS-IT_Learning_WebLearn_editor.png 892w, https://ptworld.net/wp-content/uploads/2022/08/OUCS-IT_Learning_WebLearn_editor-300x214.png 300w, https://ptworld.net/wp-content/uploads/2022/08/OUCS-IT_Learning_WebLearn_editor-768x548.png 768w, https://ptworld.net/wp-content/uploads/2022/08/OUCS-IT_Learning_WebLearn_editor-500x357.png 500w, https://ptworld.net/wp-content/uploads/2022/08/OUCS-IT_Learning_WebLearn_editor-800x571.png 800w" sizes="(max-width: 892px) 100vw, 892px" /><figcaption class="wp-element-caption">An early example (2005-7) of rich text editing in WebLearn, using RTWedit. <br>(Screenshot of a slide from OUCS IT Learning Programme training course led by Paul Trafford.)</figcaption></figure>
</div>


<p>Standards have moved on and browsers only maintain limited backwards compatibility, so my tools don&#8217;t work in a standard desktop today, but the approach of working from first principles is ever-relevant.  I&#8217;ve recorded some notes in a retrospective piece, <a rel="noreferrer noopener" href="https://paultrafford.blogspot.com/2021/04/adventures-in-readwrite-web.html" target="_blank">Adventures in the Read/Write Web</a>. </p>



<p>Nowadays, we take for granted the fact that we can write content in systems such as WordPress and Drupal using a rich text editor with an experience similar to that in a word processor. Such editors, based on packages such as <a rel="noreferrer noopener" href="https://www.tiny.cloud" target="_blank">TinyMCE</a> and <a rel="noreferrer noopener" href="https://ckeditor.com" target="_blank">CK Editor</a> are still written in JavaScript.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
