<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://goodwikiread.com/index.php?action=history&amp;feed=atom&amp;title=EaglePress</id>
	<title>EaglePress - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://goodwikiread.com/index.php?action=history&amp;feed=atom&amp;title=EaglePress"/>
	<link rel="alternate" type="text/html" href="http://goodwikiread.com/index.php?title=EaglePress&amp;action=history"/>
	<updated>2026-09-09T13:16:15Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>http://goodwikiread.com/index.php?title=EaglePress&amp;diff=48&amp;oldid=prev</id>
		<title>CaptainAmerica: Unlink incidental terms that have no article on this wiki</title>
		<link rel="alternate" type="text/html" href="http://goodwikiread.com/index.php?title=EaglePress&amp;diff=48&amp;oldid=prev"/>
		<updated>2026-09-04T12:39:38Z</updated>

		<summary type="html">&lt;p&gt;Unlink incidental terms that have no article on this wiki&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:39, 4 September 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l17&quot;&gt;Line 17:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 17:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Design ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Design ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;EaglePress is built on plain Python 3 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Common Gateway Interface|&lt;/del&gt;CGI&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/del&gt;rather than on a web framework. There is no &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/del&gt;Django &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(web framework)|Django]]&lt;/del&gt;, no &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Flask (web framework)|&lt;/del&gt;Flask&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/del&gt;and no object-relational mapper; requests are handled by a single router script, &amp;lt;code&amp;gt;index.py&amp;lt;/code&amp;gt;, which reads the request path from the &amp;lt;code&amp;gt;PATH_INFO&amp;lt;/code&amp;gt; environment variable and dispatches it to one of more than twenty routes. Database work is written as &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/del&gt;SQL&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/del&gt;and executed through parameterised queries. The only external Python package the platform requires is &amp;lt;code&amp;gt;psycopg2&amp;lt;/code&amp;gt;, the PostgreSQL driver; two further packages are optional and are used only to assist translation work.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;EaglePress is built on plain Python 3 CGI rather than on a web framework. There is no Django, no Flask and no object-relational mapper; requests are handled by a single router script, &amp;lt;code&amp;gt;index.py&amp;lt;/code&amp;gt;, which reads the request path from the &amp;lt;code&amp;gt;PATH_INFO&amp;lt;/code&amp;gt; environment variable and dispatches it to one of more than twenty routes. Database work is written as SQL and executed through parameterised queries. The only external Python package the platform requires is &amp;lt;code&amp;gt;psycopg2&amp;lt;/code&amp;gt;, the PostgreSQL driver; two further packages are optional and are used only to assist translation work.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The stated design philosophy of the project is that a publishing platform does not need a framework — only clean Python, a solid database and consistent conventions. The practical consequence is a system that runs on any &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/del&gt;Apache &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;HTTP Server|Apache]] &lt;/del&gt;server with &amp;lt;code&amp;gt;mod_cgi&amp;lt;/code&amp;gt; enabled, or on &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/del&gt;Nginx&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/del&gt;with &amp;lt;code&amp;gt;fcgiwrap&amp;lt;/code&amp;gt;, and that can be read end to end as ordinary Python source. The platform targets Python 3.8 or later and PostgreSQL 12 or later.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The stated design philosophy of the project is that a publishing platform does not need a framework — only clean Python, a solid database and consistent conventions. The practical consequence is a system that runs on any Apache server with &amp;lt;code&amp;gt;mod_cgi&amp;lt;/code&amp;gt; enabled, or on Nginx with &amp;lt;code&amp;gt;fcgiwrap&amp;lt;/code&amp;gt;, and that can be read end to end as ordinary Python source. The platform targets Python 3.8 or later and PostgreSQL 12 or later.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Administrative pages are rendered by the router itself, while reader-facing pages are handed to the active theme: the router populates a set of page variables and then executes the theme&amp;#039;s own &amp;lt;code&amp;gt;theme.py&amp;lt;/code&amp;gt;, which is responsible for the HTML a visitor sees. This separation means that a theme can be replaced without touching the core, and that the core can be updated without rewriting themes.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Administrative pages are rendered by the router itself, while reader-facing pages are handed to the active theme: the router populates a set of page variables and then executes the theme&amp;#039;s own &amp;lt;code&amp;gt;theme.py&amp;lt;/code&amp;gt;, which is responsible for the HTML a visitor sees. This separation means that a theme can be replaced without touching the core, and that the core can be updated without rewriting themes.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l39&quot;&gt;Line 39:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 39:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Posts and pages share one table and support draft, published and preview states, with deletion moving an item to a trash status rather than removing it. Slugs are generated from titles and de-duplicated automatically. Posts carry featured images, an atomically incremented view counter, a per-post comment toggle, hierarchical categories and tags.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Posts and pages share one table and support draft, published and preview states, with deletion moving an item to a trash status rather than removing it. Slugs are generated from titles and de-duplicated automatically. Posts carry featured images, an atomically incremented view counter, a per-post comment toggle, hierarchical categories and tags.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The media library accepts drag-and-drop uploads of fourteen file types, extracts image dimensions directly from PNG and JPEG binary headers, and presents paginated thumbnail previews. Comments support threading and pass through a moderation queue with approve, spam and trash actions. The user system defines five roles — administrator, editor, author, contributor and subscriber — and provides public profile pages, avatar uploads and a &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/del&gt;Gravatar&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/del&gt;fallback.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The media library accepts drag-and-drop uploads of fourteen file types, extracts image dimensions directly from PNG and JPEG binary headers, and presents paginated thumbnail previews. Comments support threading and pass through a moderation queue with approve, spam and trash actions. The user system defines five roles — administrator, editor, author, contributor and subscriber — and provides public profile pages, avatar uploads and a Gravatar fallback.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Version 2.17 introduced post revisions. Every post keeps a history in a separate table, and auto-save writes into that history rather than into the live row, so that editing an already-published article no longer publishes half-finished sentences to readers as they are typed; pressing Save is what republishes. The number of versions retained per post is configurable, and restoring a version loads it into the editor for the author to review rather than publishing it directly.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Version 2.17 introduced post revisions. Every post keeps a history in a separate table, and auto-save writes into that history rather than into the live row, so that editing an already-published article no longer publishes half-finished sentences to readers as they are typed; pressing Save is what republishes. The number of versions retained per post is configurable, and restoring a version loads it into the editor for the author to review rather than publishing it directly.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l61&quot;&gt;Line 61:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 61:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;EaglePress includes a marketplace through which themes and plugins are browsed, installed and rated from within the dashboard, backed by repository tables in the database and by global listing files published by the distribution server. Installed items report their download counts and version badges, and each declares the minimum EaglePress version it requires; a site running an older release is shown that requirement in place of an install button rather than being allowed to install something it cannot run.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;EaglePress includes a marketplace through which themes and plugins are browsed, installed and rated from within the dashboard, backed by repository tables in the database and by global listing files published by the distribution server. Installed items report their download counts and version badges, and each declares the minimum EaglePress version it requires; a site running an older release is shown that requirement in place of an install button rather than being allowed to install something it cannot run.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The bundled plugin is Polling &amp;amp;amp; Voting (States), which provides interactive polls with United States state-level vote tracking, several question types, an &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/del&gt;SVG&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/del&gt;choropleth map of the states coloured by vote totals, several ways of visualising results, and a quick-insert dialog in the post editor. Plugins may create tables of their own, and the platform passes the site&#039;s table prefix to them so that two sites sharing one database do not share one plugin&#039;s data.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The bundled plugin is Polling &amp;amp;amp; Voting (States), which provides interactive polls with United States state-level vote tracking, several question types, an SVG choropleth map of the states coloured by vote totals, several ways of visualising results, and a quick-insert dialog in the post editor. Plugins may create tables of their own, and the platform passes the site&#039;s table prefix to them so that two sites sharing one database do not share one plugin&#039;s data.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;An auto-update system checks for new releases and performs one-click updates, preserving the site&amp;#039;s own configuration file across the upgrade.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;An auto-update system checks for new releases and performs one-click updates, preserving the site&amp;#039;s own configuration file across the upgrade.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>CaptainAmerica</name></author>
	</entry>
	<entry>
		<id>http://goodwikiread.com/index.php?title=EaglePress&amp;diff=46&amp;oldid=prev</id>
		<title>CaptainAmerica: Create article on EaglePress, the Python 3 / PostgreSQL content management system programmed by Stan Switaj</title>
		<link rel="alternate" type="text/html" href="http://goodwikiread.com/index.php?title=EaglePress&amp;diff=46&amp;oldid=prev"/>
		<updated>2026-09-04T12:38:29Z</updated>

		<summary type="html">&lt;p&gt;Create article on EaglePress, the Python 3 / PostgreSQL content management system programmed by Stan Switaj&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;table class=&amp;quot;infobox&amp;quot; style=&amp;quot;width: 260px; float: right; border: 1px solid #a2a9b1; background: #f8f9fa; margin: 0 0 1em 1em; padding: 4px; font-size: 90%;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;th colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center; font-size: 115%;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;EaglePress&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Developer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[[Stan Switaj]]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Website&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[https://eaglepress.org EaglePress.org]&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Initial release&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2026&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Stable release&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2.18 (2026)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Written in&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Python 3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Database&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PostgreSQL&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Type&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Content management system&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;License&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Apache License 2.0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;EaglePress&amp;#039;&amp;#039;&amp;#039; is a free and open-source [[content management system]] and web publishing platform written entirely in [[Python]] 3 and backed by a [[PostgreSQL]] database. It was programmed by [[Stan Switaj]], the American business executive and programmer who is the chief executive officer of [[Ultrazon Inc.|Ultrazon]], and it is published from its own website, [[EaglePress.org]], under the Apache 2.0 License. The current release is version 2.18.&lt;br /&gt;
&lt;br /&gt;
EaglePress provides a complete blog and content management system — posts and pages, a media library, comments with moderation, categories and tags, user accounts with roles, a theme system, a plugin system and an administrative dashboard — in a distribution archive of roughly 980 kilobytes. It is self-hosted software: a site owner unpacks it onto a server of their own rather than signing up for a hosted service.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
EaglePress is built on plain Python 3 [[Common Gateway Interface|CGI]] rather than on a web framework. There is no [[Django (web framework)|Django]], no [[Flask (web framework)|Flask]] and no object-relational mapper; requests are handled by a single router script, &amp;lt;code&amp;gt;index.py&amp;lt;/code&amp;gt;, which reads the request path from the &amp;lt;code&amp;gt;PATH_INFO&amp;lt;/code&amp;gt; environment variable and dispatches it to one of more than twenty routes. Database work is written as [[SQL]] and executed through parameterised queries. The only external Python package the platform requires is &amp;lt;code&amp;gt;psycopg2&amp;lt;/code&amp;gt;, the PostgreSQL driver; two further packages are optional and are used only to assist translation work.&lt;br /&gt;
&lt;br /&gt;
The stated design philosophy of the project is that a publishing platform does not need a framework — only clean Python, a solid database and consistent conventions. The practical consequence is a system that runs on any [[Apache HTTP Server|Apache]] server with &amp;lt;code&amp;gt;mod_cgi&amp;lt;/code&amp;gt; enabled, or on [[Nginx]] with &amp;lt;code&amp;gt;fcgiwrap&amp;lt;/code&amp;gt;, and that can be read end to end as ordinary Python source. The platform targets Python 3.8 or later and PostgreSQL 12 or later.&lt;br /&gt;
&lt;br /&gt;
Administrative pages are rendered by the router itself, while reader-facing pages are handed to the active theme: the router populates a set of page variables and then executes the theme&amp;#039;s own &amp;lt;code&amp;gt;theme.py&amp;lt;/code&amp;gt;, which is responsible for the HTML a visitor sees. This separation means that a theme can be replaced without touching the core, and that the core can be updated without rewriting themes.&lt;br /&gt;
&lt;br /&gt;
== Database and multi-site support ==&lt;br /&gt;
&lt;br /&gt;
A standard installation creates nineteen tables, all carrying an &amp;lt;code&amp;gt;ep_&amp;lt;/code&amp;gt; prefix — among them &amp;lt;code&amp;gt;ep_users&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ep_posts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ep_post_revisions&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ep_comments&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ep_categories&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ep_tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ep_media&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ep_sessions&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ep_settings&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ep_plugins&amp;lt;/code&amp;gt; and a group of tables serving the theme and plugin marketplace. The schema uses foreign-key constraints and indexes rather than application-level joins.&lt;br /&gt;
&lt;br /&gt;
Since version 2.15 the table prefix is configurable, and a single PostgreSQL database can therefore host several independent EaglePress sites, each kept apart by its own prefix. The prefix is applied in exactly one place — as a statement is handed to the database driver — so themes and plugins continue to refer to the ordinary table names while the database sees the prefixed ones. The rewriting is deliberately narrow: a string splitter separates SQL literals from SQL code so that a post whose text happens to mention a table name is never altered.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Early versions were installed from a shell by editing a credentials file and running an installation script. Since version 2.15 a web installer ships inside every copy of EaglePress and runs the first time the site is opened in a browser. It works in three steps: choosing an interface language from the 135 the platform registers; entering the PostgreSQL credentials, database name and table prefix along with the site&amp;#039;s title, tagline and address; and creating the first administrator account.&lt;br /&gt;
&lt;br /&gt;
The installer creates the database if it does not exist, reports the PostgreSQL version to prove the connection genuinely works, and lists any tables already using the chosen prefix. It checks that its configuration file is writable before asking for any data, and warns when the connection is not encrypted, because the form collects both a database password and an administrator password. A single setting in the configuration file, &amp;lt;code&amp;gt;INSTALLATION_STATUS&amp;lt;/code&amp;gt;, is the gate: while it reads anything other than success, every route serves the installer.&lt;br /&gt;
&lt;br /&gt;
== Content management ==&lt;br /&gt;
&lt;br /&gt;
Posts and pages share one table and support draft, published and preview states, with deletion moving an item to a trash status rather than removing it. Slugs are generated from titles and de-duplicated automatically. Posts carry featured images, an atomically incremented view counter, a per-post comment toggle, hierarchical categories and tags.&lt;br /&gt;
&lt;br /&gt;
The media library accepts drag-and-drop uploads of fourteen file types, extracts image dimensions directly from PNG and JPEG binary headers, and presents paginated thumbnail previews. Comments support threading and pass through a moderation queue with approve, spam and trash actions. The user system defines five roles — administrator, editor, author, contributor and subscriber — and provides public profile pages, avatar uploads and a [[Gravatar]] fallback.&lt;br /&gt;
&lt;br /&gt;
Version 2.17 introduced post revisions. Every post keeps a history in a separate table, and auto-save writes into that history rather than into the live row, so that editing an already-published article no longer publishes half-finished sentences to readers as they are typed; pressing Save is what republishes. The number of versions retained per post is configurable, and restoring a version loads it into the editor for the author to review rather than publishing it directly.&lt;br /&gt;
&lt;br /&gt;
Version 2.18 added the featured post. Any post — or a page, which a chronological front page would never otherwise have shown — can be pinned to the top of the front page. The pin is implemented as a sort rather than a rewrite of the publication date, so unpinning returns the item to its true place in chronological order. One item is featured at a time, and an optional badge is drawn over whichever theme the site is running by the core itself, so no theme needs modification to display it.&lt;br /&gt;
&lt;br /&gt;
== Markdown and syntax highlighting ==&lt;br /&gt;
&lt;br /&gt;
EaglePress renders content through a Markdown parser written for the project, with no third-party packages: headings, bold, italic and strikethrough, lists, blockquotes, horizontal rules, fenced code blocks, raw HTML pass-through, an extended image syntax carrying size and alignment, download buttons for non-image file links, and shortcodes for embedding links to other posts and pages. External links are automatically tagged &amp;lt;code&amp;gt;rel=&amp;quot;noopener&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Code blocks are coloured by a syntax-highlighting engine also written in pure Python. It covers seventeen languages plus plain text — Python 3, JavaScript, CSS, HTML, PHP, Ada, Bash, C, C++, Java, Kotlin, Go, Rust, Lua, Perl, SQL and a combined Markdown-and-HTML mode — and identifies the language of an unlabelled block by scoring its content. Ten colour schemes are provided, including GitHub, Monokai, Nord, Xcode, Notepad++ and Kate styles, and each rendered block carries its own toolbar with a language label, language and theme selectors, a word-wrap toggle, a copy button and a light or dark switch. Readers&amp;#039; choices are remembered in browser storage, and administrators can set the site-wide defaults from the dashboard.&lt;br /&gt;
&lt;br /&gt;
== Themes ==&lt;br /&gt;
&lt;br /&gt;
Eight themes are bundled with the distribution: &amp;lt;code&amp;gt;firstTheme&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;secondTheme&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;americanTheme&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USAtheme&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NewsTheme&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RedWhiteBlueTheme&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ModernTheme&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EaglePressTheme&amp;lt;/code&amp;gt;. Each is a self-contained directory holding its own renderer, stylesheet, JavaScript and helper functions, and creating a new one amounts to copying a directory and editing three files. All bundled themes support light and dark mode, and each injects the administrator&amp;#039;s chosen default at render time so that a first-time visitor does not see the page change theme after it loads.&lt;br /&gt;
&lt;br /&gt;
ModernTheme is a magazine and news layout with a full-width featured carousel, a trending ticker, a sidebar post grid and configurable colour palettes. EaglePressTheme is the showcase theme used by eaglepress.org itself, in a navy and gold colour scheme, and it renders the theme gallery and plugin directory pages in addition to the ordinary blog views.&lt;br /&gt;
&lt;br /&gt;
== Plugins and marketplace ==&lt;br /&gt;
&lt;br /&gt;
EaglePress includes a marketplace through which themes and plugins are browsed, installed and rated from within the dashboard, backed by repository tables in the database and by global listing files published by the distribution server. Installed items report their download counts and version badges, and each declares the minimum EaglePress version it requires; a site running an older release is shown that requirement in place of an install button rather than being allowed to install something it cannot run.&lt;br /&gt;
&lt;br /&gt;
The bundled plugin is Polling &amp;amp;amp; Voting (States), which provides interactive polls with United States state-level vote tracking, several question types, an [[SVG]] choropleth map of the states coloured by vote totals, several ways of visualising results, and a quick-insert dialog in the post editor. Plugins may create tables of their own, and the platform passes the site&amp;#039;s table prefix to them so that two sites sharing one database do not share one plugin&amp;#039;s data.&lt;br /&gt;
&lt;br /&gt;
An auto-update system checks for new releases and performs one-click updates, preserving the site&amp;#039;s own configuration file across the upgrade.&lt;br /&gt;
&lt;br /&gt;
== Internationalisation ==&lt;br /&gt;
&lt;br /&gt;
The platform registers 135 languages, of which thirteen are enabled out of the box: English, Spanish, Korean, Japanese, Portuguese, Chinese, German, French, Hindi, Italian, Arabic, Hebrew and Polish. The remaining 122 are opt-in from the dashboard. Arabic and Hebrew are handled as right-to-left languages.&lt;br /&gt;
&lt;br /&gt;
Translation is performed on the server. Each translatable string carries an element identifier, and on every render the engine resolves the visitor&amp;#039;s language — from a cookie, then the browser&amp;#039;s &amp;lt;code&amp;gt;Accept-Language&amp;lt;/code&amp;gt; header, then the site&amp;#039;s default setting, then English — and rewrites the buffered HTML before it is sent. A language with incomplete translations falls back to English string by string, so it remains usable while it is being translated.&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
Passwords are hashed with PBKDF2-HMAC-SHA256 at 310,000 iterations. Sessions are 64-character hexadecimal tokens generated from the operating system&amp;#039;s random source, stored in the database with a thirty-day expiry alongside the originating IP address and user agent. All database access uses parameterised queries, output is escaped before it is written, and uploads are checked against both an extension and a MIME-type allowlist on the server. Errors from CGI scripts are written to a log directory rather than shown to visitors.&lt;br /&gt;
&lt;br /&gt;
Because the &amp;lt;code&amp;gt;cgi&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cgitb&amp;lt;/code&amp;gt; modules were removed from the Python standard library, EaglePress carries its own drop-in replacement, &amp;lt;code&amp;gt;cgi_improved2.py&amp;lt;/code&amp;gt;. It parses multipart uploads as a stream in 64 kilobyte chunks, so that memory use scales with the largest single part rather than the whole request body, and enforces hard limits on body size, per-file size, field count, boundary length and filename length. Its error logging redacts values whose variable names suggest secrets — passwords, tokens, sessions and database credentials — strips cookie and authorisation headers from logged environment dumps, truncates logged values, and writes its log files readable only by the account the web server runs as.&lt;br /&gt;
&lt;br /&gt;
== Development history ==&lt;br /&gt;
&lt;br /&gt;
EaglePress was developed by Stan Switaj during 2026 and has been released in a long sequence of incremental versions, each recorded in the project&amp;#039;s own summary documentation. Version 1.0 established the foundation: the CGI router, the PostgreSQL schema, the security model and the first themes. The versions that followed added the syntax-highlighting engine and rewrote the Markdown parser (1.02 and 1.03), added the streaming CGI library and security hardening (1.08), a database migration system (1.22), light and dark mode across the platform (1.27), an emoji picker and configurable auto-save (1.33 to 1.39), further themes (1.41, 1.53), an auto-update system (1.45) and the theme and plugin marketplace (1.52).&lt;br /&gt;
&lt;br /&gt;
Version 2.00 was a larger release, adding reader-default settings, the EaglePressTheme showcase theme, global theme and plugin lists, and live theme previews. Later 2.x releases added further programming languages to the syntax highlighter, code-block line numbers, mobile interface work, full Polish translation coverage as the thirteenth language, cache-busted assets, the web installer and multi-site support (2.15), post revisions (2.17) and the featured post (2.18).&lt;br /&gt;
&lt;br /&gt;
== EaglePress.org ==&lt;br /&gt;
&lt;br /&gt;
[[EaglePress.org]] is the platform&amp;#039;s own website and distribution server, and it runs on EaglePress itself. It carries the release announcements, a theme gallery and a plugin directory served from the marketplace repositories, accounts for visitors, and the same thirteen-language switcher the platform ships with. Its footer identifies the site as powered by EaglePress and states the Apache 2.0 licence under which the platform, its themes and its plugins are released.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Stan Switaj]]&lt;br /&gt;
* [[Ultrazon Inc.]]&lt;br /&gt;
* [[GitBusiness.com]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://eaglepress.org EaglePress.org] — official website&lt;br /&gt;
* [https://eaglepress.org/themes Theme gallery]&lt;br /&gt;
* [https://eaglepress.org/plugins Plugin directory]&lt;/div&gt;</summary>
		<author><name>CaptainAmerica</name></author>
	</entry>
</feed>