<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://openjournal.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=OpenJournalAdmin</id>
	<title>openjournal - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://openjournal.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=OpenJournalAdmin"/>
	<link rel="alternate" type="text/html" href="https://openjournal.wiki/wiki/Special:Contributions/OpenJournalAdmin"/>
	<updated>2026-09-11T00:23:43Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://openjournal.wiki/index.php?title=MediaWiki:Common.js&amp;diff=24</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=MediaWiki:Common.js&amp;diff=24"/>
		<updated>2026-09-10T19:58:31Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: openjournal markdown shortcuts&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*!&lt;br /&gt;
 * openjournal -- Markdown shortcuts for the visual editor.&lt;br /&gt;
 *&lt;br /&gt;
 * Loaded into MediaWiki:Common.js by the seed step. Edit it on-wiki at&lt;br /&gt;
 * /wiki/MediaWiki:Common.js, or here and re-seed.&lt;br /&gt;
 *&lt;br /&gt;
 * MediaWiki stores wikitext, not Markdown, and that does not change here.&lt;br /&gt;
 * What changes is what happens as you type: the visual editor already turns&lt;br /&gt;
 * &amp;quot;* &amp;quot; into a bullet and &amp;quot;1. &amp;quot; into a numbered list, so the rest of a writer&#039;s&lt;br /&gt;
 * Markdown muscle memory is registered the same way. You type Markdown, the&lt;br /&gt;
 * editor formats it immediately, and the page is still wikitext underneath --&lt;br /&gt;
 * which keeps diffs, templates and the API working exactly as before.&lt;br /&gt;
 *&lt;br /&gt;
 * These use ve.ui.sequenceRegistry, VisualEditor&#039;s own public mechanism for&lt;br /&gt;
 * this, and follow the same pattern as its built-in registrations.&lt;br /&gt;
 */&lt;br /&gt;
( function () {&lt;br /&gt;
	&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
	// Names of the commands the inline shortcuts run, and whether registration&lt;br /&gt;
	// has already happened. Both hooks below are safe to run more than once.&lt;br /&gt;
	var inlineCommandNames = [],&lt;br /&gt;
		registered = false;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * A sequence that fires at the start of a paragraph, e.g. &amp;quot;## &amp;quot; or &amp;quot;&amp;gt; &amp;quot;.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param {string} name Registry name; reusing an existing name replaces it&lt;br /&gt;
	 * @param {string} command VisualEditor command to run&lt;br /&gt;
	 * @param {string} prefix Characters typed before the space&lt;br /&gt;
	 * @param {boolean} space Whether a trailing space is part of the trigger&lt;br /&gt;
	 * @return {ve.ui.Sequence}&lt;br /&gt;
	 */&lt;br /&gt;
	function paragraphPrefix( name, command, prefix, space ) {&lt;br /&gt;
		var data = [ { type: &#039;paragraph&#039; } ].concat( prefix.split( &#039;&#039; ) );&lt;br /&gt;
		if ( space ) {&lt;br /&gt;
			data.push( &#039; &#039; );&lt;br /&gt;
		}&lt;br /&gt;
		// Strip everything the user typed; the paragraph element is not typed.&lt;br /&gt;
		return new ve.ui.Sequence( name, command, data, data.length - 1 );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function registerMarkdownSequences() {&lt;br /&gt;
		var registry = ve.ui.sequenceRegistry,&lt;br /&gt;
			level;&lt;br /&gt;
&lt;br /&gt;
		for ( level = 1; level &amp;lt;= 6; level++ ) {&lt;br /&gt;
			registry.register( paragraphPrefix(&lt;br /&gt;
				// MediaWiki registers &amp;quot;# &amp;quot; as a wikitext numbered list under the&lt;br /&gt;
				// name &amp;quot;numberHash&amp;quot;. Reusing that name replaces it, so a lone&lt;br /&gt;
				// &amp;quot;# &amp;quot; means a heading here, as a Markdown writer expects.&lt;br /&gt;
				// &amp;quot;1. &amp;quot; still makes a numbered list, which is the Markdown way.&lt;br /&gt;
				level === 1 ? &#039;numberHash&#039; : &#039;openjournalHeading&#039; + level,&lt;br /&gt;
				&#039;heading&#039; + level,&lt;br /&gt;
				new Array( level + 1 ).join( &#039;#&#039; ),&lt;br /&gt;
				true&lt;br /&gt;
			) );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// &amp;quot;- &amp;quot; for bullets. VisualEditor ships &amp;quot;* &amp;quot; already; Markdown uses both.&lt;br /&gt;
		registry.register(&lt;br /&gt;
			paragraphPrefix( &#039;openjournalBulletDash&#039;, &#039;bulletWrapOnce&#039;, &#039;-&#039;, true )&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		// &amp;quot;&amp;gt; &amp;quot; for a blockquote. MediaWiki maps &amp;quot;: &amp;quot; to this; Markdown uses &amp;quot;&amp;gt;&amp;quot;.&lt;br /&gt;
		registry.register(&lt;br /&gt;
			paragraphPrefix( &#039;openjournalBlockquote&#039;, &#039;blockquoteWrap&#039;, &#039;&amp;gt;&#039;, true )&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		// &amp;quot;```&amp;quot; opens a code block.&lt;br /&gt;
		registry.register(&lt;br /&gt;
			paragraphPrefix( &#039;openjournalCodeBlock&#039;, &#039;preformatted&#039;, &#039;```&#039;, false )&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		// &amp;quot;---&amp;quot; is a horizontal rule. VisualEditor wants four dashes; Markdown&lt;br /&gt;
		// takes three, and three fires first, so this supersedes it.&lt;br /&gt;
		registry.register(&lt;br /&gt;
			paragraphPrefix( &#039;openjournalHorizontalRule&#039;, &#039;insertHorizontalRule&#039;, &#039;---&#039;, false )&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Inline Markdown: **bold**, *italic*, `code`.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Block shortcuts above are plain sequences, because the characters that&lt;br /&gt;
	 * trigger them sit at the start of a paragraph and VisualEditor&#039;s `strip`&lt;br /&gt;
	 * removes them. Inline Markdown wraps text instead, and `strip` only takes&lt;br /&gt;
	 * characters off the right-hand end -- so the opening delimiter would be&lt;br /&gt;
	 * left behind. These use a regular expression to match the whole&lt;br /&gt;
	 * &amp;quot;**text**&amp;quot;, select it, and hand it to the action below, which swaps in&lt;br /&gt;
	 * the text without its delimiters and styles it.&lt;br /&gt;
	 */&lt;br /&gt;
	function registerInlineAction() {&lt;br /&gt;
		ve.ui.OpenJournalMarkdownAction = function VeUiOpenJournalMarkdownAction() {&lt;br /&gt;
			ve.ui.OpenJournalMarkdownAction.super.apply( this, arguments );&lt;br /&gt;
		};&lt;br /&gt;
		OO.inheritClass( ve.ui.OpenJournalMarkdownAction, ve.ui.Action );&lt;br /&gt;
&lt;br /&gt;
		ve.ui.OpenJournalMarkdownAction.static.name = &#039;openjournalMarkdown&#039;;&lt;br /&gt;
		ve.ui.OpenJournalMarkdownAction.static.methods = [ &#039;wrap&#039; ];&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * @param {string} delimiter The Markdown characters, e.g. &amp;quot;**&amp;quot;&lt;br /&gt;
		 * @param {string} annotation VisualEditor annotation, e.g. &amp;quot;textStyle/bold&amp;quot;&lt;br /&gt;
		 * @return {boolean} Whether the text was styled&lt;br /&gt;
		 */&lt;br /&gt;
		ve.ui.OpenJournalMarkdownAction.prototype.wrap = function ( delimiter, annotation ) {&lt;br /&gt;
			var surfaceModel = this.surface.getModel(),&lt;br /&gt;
				fragment = surfaceModel.getFragment(),&lt;br /&gt;
				text = fragment.getText(),&lt;br /&gt;
				width = delimiter.length;&lt;br /&gt;
&lt;br /&gt;
			// Returning false makes VisualEditor undo the selection change, so&lt;br /&gt;
			// anything that does not really look like &amp;quot;**text**&amp;quot; is left alone.&lt;br /&gt;
			if (&lt;br /&gt;
				text.length &amp;lt;= width * 2 ||&lt;br /&gt;
				text.slice( 0, width ) !== delimiter ||&lt;br /&gt;
				text.slice( text.length - width ) !== delimiter&lt;br /&gt;
			) {&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			fragment&lt;br /&gt;
				.insertContent( text.slice( width, text.length - width ), false )&lt;br /&gt;
				.annotateContent( &#039;set&#039;, annotation )&lt;br /&gt;
				.collapseToEnd()&lt;br /&gt;
				.select();&lt;br /&gt;
&lt;br /&gt;
			// Without this the annotation stays armed and the next word typed&lt;br /&gt;
			// comes out bold too.&lt;br /&gt;
			surfaceModel.setInsertionAnnotations( null );&lt;br /&gt;
&lt;br /&gt;
			return true;&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		ve.ui.actionFactory.register( ve.ui.OpenJournalMarkdownAction );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function registerInlineSequences() {&lt;br /&gt;
		[&lt;br /&gt;
			// label,  delimiter, annotation,         pattern&lt;br /&gt;
			[ &#039;Bold&#039;, &#039;**&#039;, &#039;textStyle/bold&#039;, &#039;\\*\\*[^*]+\\*\\*$&#039; ],&lt;br /&gt;
			// &amp;quot;*text*&amp;quot; must not fire midway through typing &amp;quot;**text**&amp;quot;, so the&lt;br /&gt;
			// opening star may not itself be preceded by one. Lookbehind is&lt;br /&gt;
			// unsupported on some older browsers, hence the per-pattern guard.&lt;br /&gt;
			[ &#039;Italic&#039;, &#039;*&#039;, &#039;textStyle/italic&#039;, &#039;(?&amp;lt;!\\*)\\*[^*]+\\*$&#039; ],&lt;br /&gt;
			[ &#039;Code&#039;, &#039;`&#039;, &#039;textStyle/code&#039;, &#039;`[^`]+`$&#039; ],&lt;br /&gt;
			// Markdown&#039;s other pair of emphasis characters. These refuse an&lt;br /&gt;
			// opening underscore that follows a word character, which is what&lt;br /&gt;
			// stops snake_case_names turning italic halfway through -- the&lt;br /&gt;
			// same rule CommonMark applies, and the reason &amp;quot;_&amp;quot; needs a guard&lt;br /&gt;
			// that &amp;quot;*&amp;quot; does not. \w covers &amp;quot;_&amp;quot; itself, so it doubles as the&lt;br /&gt;
			// &amp;quot;not midway through __bold__&amp;quot; check.&lt;br /&gt;
			[ &#039;BoldUnderscore&#039;, &#039;__&#039;, &#039;textStyle/bold&#039;, &#039;(?&amp;lt;!\\w)__[^_]+__$&#039; ],&lt;br /&gt;
			[ &#039;ItalicUnderscore&#039;, &#039;_&#039;, &#039;textStyle/italic&#039;, &#039;(?&amp;lt;!\\w)_[^_]+_$&#039; ],&lt;br /&gt;
			[ &#039;Strikethrough&#039;, &#039;~~&#039;, &#039;textStyle/strikethrough&#039;, &#039;~~[^~]+~~$&#039; ]&lt;br /&gt;
		].forEach( function ( spec ) {&lt;br /&gt;
			var name = &#039;openjournalMarkdown&#039; + spec[ 0 ],&lt;br /&gt;
				pattern;&lt;br /&gt;
&lt;br /&gt;
			inlineCommandNames.push( name );&lt;br /&gt;
&lt;br /&gt;
			try {&lt;br /&gt;
				pattern = new RegExp( spec[ 3 ] );&lt;br /&gt;
			} catch ( e ) {&lt;br /&gt;
				mw.log.warn( &#039;openjournal: skipping &#039; + name + &#039; shortcut&#039;, e );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			ve.ui.commandRegistry.register( new ve.ui.Command(&lt;br /&gt;
				name, &#039;openjournalMarkdown&#039;, &#039;wrap&#039;,&lt;br /&gt;
				{ args: [ spec[ 1 ], spec[ 2 ] ], supportedSelections: [ &#039;linear&#039; ] }&lt;br /&gt;
			) );&lt;br /&gt;
			ve.ui.sequenceRegistry.register( new ve.ui.Sequence(&lt;br /&gt;
				name, name, pattern, 0, { setSelection: true }&lt;br /&gt;
			) );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Register through VisualEditor&#039;s plugin hook, which runs after its modules&lt;br /&gt;
	// load but before the editing surface is built. That timing matters: a&lt;br /&gt;
	// surface copies the command registry once, at construction, and&lt;br /&gt;
	// ve.ui.Sequence refuses to run a command the surface does not list. A&lt;br /&gt;
	// custom command registered any later is silently ignored -- the sequence&lt;br /&gt;
	// matches, nothing happens. Sequences themselves are read live on every&lt;br /&gt;
	// keystroke, which is why the block shortcuts survived being registered&lt;br /&gt;
	// late and the inline ones did not.&lt;br /&gt;
	function registerEverything() {&lt;br /&gt;
		if ( registered ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		registered = true;&lt;br /&gt;
		registerInlineAction();&lt;br /&gt;
		registerInlineSequences();&lt;br /&gt;
		registerMarkdownSequences();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Top up the live surface&#039;s command list.&lt;br /&gt;
	 *&lt;br /&gt;
	 * The plugin hook below runs early enough that this should be redundant.&lt;br /&gt;
	 * It is here because the failure it guards against is silent: if anything&lt;br /&gt;
	 * builds a surface without the plugin hook having run, every inline&lt;br /&gt;
	 * shortcut matches and then quietly does nothing, which is a miserable&lt;br /&gt;
	 * thing to debug from the outside.&lt;br /&gt;
	 */&lt;br /&gt;
	function backfillSurfaceCommands() {&lt;br /&gt;
		var surface = ve.init &amp;amp;&amp;amp; ve.init.target &amp;amp;&amp;amp;&lt;br /&gt;
			ve.init.target.getSurface &amp;amp;&amp;amp; ve.init.target.getSurface();&lt;br /&gt;
&lt;br /&gt;
		if ( !surface ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var commands = surface.getCommands();&lt;br /&gt;
		inlineCommandNames.forEach( function ( name ) {&lt;br /&gt;
			if ( commands.indexOf( name ) === -1 ) {&lt;br /&gt;
				commands.push( name );&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function guard( fn ) {&lt;br /&gt;
		return function () {&lt;br /&gt;
			try {&lt;br /&gt;
				fn.apply( null, arguments );&lt;br /&gt;
			} catch ( e ) {&lt;br /&gt;
				// A broken shortcut must never take the editor down with it.&lt;br /&gt;
				mw.log.error( &#039;openjournal: Markdown shortcuts failed&#039;, e );&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &#039;ve.loadModules&#039; ).add( guard( function ( addPlugin ) {&lt;br /&gt;
		addPlugin( guard( registerEverything ) );&lt;br /&gt;
	} ) );&lt;br /&gt;
&lt;br /&gt;
	// Belt and braces, once the editor is actually up.&lt;br /&gt;
	mw.hook( &#039;ve.activationComplete&#039; ).add( guard( function () {&lt;br /&gt;
		registerEverything();&lt;br /&gt;
		backfillSurfaceCommands();&lt;br /&gt;
	} ) );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=MediaWiki:Common.css&amp;diff=23</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=MediaWiki:Common.css&amp;diff=23"/>
		<updated>2026-09-10T19:58:30Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: openjournal styles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* openjournal -- loaded into MediaWiki:Common.css by the seed step.&lt;br /&gt;
   Edit it on-wiki at /wiki/MediaWiki:Common.css, or here and re-seed.&lt;br /&gt;
&lt;br /&gt;
   Colours are MediaWiki&#039;s Codex design tokens rather than literals, so this&lt;br /&gt;
   file follows the reader&#039;s Light/Dark/Automatic choice without needing a&lt;br /&gt;
   second set of rules. The hex values after each token are the light-mode&lt;br /&gt;
   fallback, used only if a skin does not define the token. */&lt;br /&gt;
&lt;br /&gt;
.oj-hero {&lt;br /&gt;
	margin: 0 0 1.5em;&lt;br /&gt;
	padding: 2em 0 1.6em;&lt;br /&gt;
	border-bottom: 1px solid var( --border-color-subtle, #c8ccd1 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-hero-title {&lt;br /&gt;
	font-size: 2.6em;&lt;br /&gt;
	line-height: 1.1;&lt;br /&gt;
	font-weight: 700;&lt;br /&gt;
	letter-spacing: -0.02em;&lt;br /&gt;
	color: var( --color-emphasized, #101418 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-hero-sub {&lt;br /&gt;
	margin-top: 0.4em;&lt;br /&gt;
	font-size: 1.05em;&lt;br /&gt;
	color: var( --color-subtle, #54595d );&lt;br /&gt;
	max-width: 34em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* One article in a feed. */&lt;br /&gt;
.oj-entry {&lt;br /&gt;
	padding: 0.7em 0;&lt;br /&gt;
	border-bottom: 1px solid var( --border-color-muted, #eaecf0 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-entry a {&lt;br /&gt;
	font-size: 1.12em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-byline {&lt;br /&gt;
	color: var( --color-subtle, #54595d );&lt;br /&gt;
	font-size: 0.88em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-journal .oj-feed {&lt;br /&gt;
	margin-top: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-footnote {&lt;br /&gt;
	color: var( --color-subtle, #54595d );&lt;br /&gt;
	font-size: 0.92em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The author list is a run of spans; CSS supplies the separators so there is&lt;br /&gt;
   never a trailing one. */&lt;br /&gt;
.oj-authors span + span::before {&lt;br /&gt;
	content: &amp;quot; \00b7 &amp;quot;;&lt;br /&gt;
	color: var( --color-subtle, #54595d );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The &amp;quot;start a new article&amp;quot; box reads as a call to action, not a search field. */&lt;br /&gt;
.oj-journal .inputbox-element {&lt;br /&gt;
	max-width: 26em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------------------------------------------------------------- Dark mode&lt;br /&gt;
&lt;br /&gt;
   Codex&#039;s dark palette puts body text at #eaecf0 and headings at #f8f9fa on a&lt;br /&gt;
   #101418 page: contrast ratios of 15.6:1 and 17.6:1. WCAG AAA asks for 7:1,&lt;br /&gt;
   so that is roughly twice the contrast anyone needs, and on a near-black&lt;br /&gt;
   ground it is where text starts to glow and smear (halation).&lt;br /&gt;
&lt;br /&gt;
   Soften the text and lift the page a little off black. The ratios below stay&lt;br /&gt;
   above AAA, so nothing becomes harder to read:&lt;br /&gt;
&lt;br /&gt;
     headings   #f8f9fa 17.6:1  -&amp;gt;  #dfe3e7 13.7:1&lt;br /&gt;
     body text  #eaecf0 15.6:1  -&amp;gt;  #ccd1d6 11.5:1&lt;br /&gt;
     bylines    #a2a9b1  7.8:1  -&amp;gt;  #9fa6ae  7.2:1&lt;br /&gt;
&lt;br /&gt;
   These override Codex tokens, so everything on the page follows -- article&lt;br /&gt;
   text, the skin&#039;s own chrome and the styles above alike. */&lt;br /&gt;
&lt;br /&gt;
.oj-dark-palette,&lt;br /&gt;
html.skin-theme-clientpref-night {&lt;br /&gt;
	--color-base: #ccd1d6;&lt;br /&gt;
	--color-emphasized: #dfe3e7;&lt;br /&gt;
	--color-subtle: #9fa6ae;&lt;br /&gt;
	--background-color-base: #17191c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The same, for readers on Automatic whose system is set to dark. */&lt;br /&gt;
@media screen and ( prefers-color-scheme: dark ) {&lt;br /&gt;
	html.skin-theme-clientpref-os {&lt;br /&gt;
		--color-base: #ccd1d6;&lt;br /&gt;
		--color-emphasized: #dfe3e7;&lt;br /&gt;
		--color-subtle: #9fa6ae;&lt;br /&gt;
		--background-color-base: #17191c;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* A single external link styled as a button, for the one place that needs it:&lt;br /&gt;
   the database dump on OpenJournal:Helping out. */&lt;br /&gt;
.oj-download {&lt;br /&gt;
	margin: 1em 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-download a {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	padding: 0.55em 1.1em;&lt;br /&gt;
	border-radius: 2px;&lt;br /&gt;
	background: var( --background-color-progressive, #36c );&lt;br /&gt;
	color: var( --color-inverted, #fff );&lt;br /&gt;
	font-weight: 600;&lt;br /&gt;
	text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-download a:hover {&lt;br /&gt;
	background: var( --background-color-progressive--hover, #4b77d6 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* MediaWiki marks every external link with a small icon by default; it reads&lt;br /&gt;
   oddly against a button. */&lt;br /&gt;
.oj-download a.external {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	padding-right: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Prev/next links at the bottom of each page of the front-page feed. */&lt;br /&gt;
.oj-pager {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	justify-content: space-between;&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
	padding-top: 0.6em;&lt;br /&gt;
	border-top: 1px solid var( --border-color-muted, #eaecf0 );&lt;br /&gt;
	font-size: 0.92em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Either link can be absent (first or last page). flexbox alone can&#039;t tell&lt;br /&gt;
   &amp;quot;only Older present&amp;quot; from &amp;quot;only Newer present&amp;quot; -- both are a lone&lt;br /&gt;
   first-child -- so the template gives Older its own class to push right. */&lt;br /&gt;
.oj-pager .oj-older {&lt;br /&gt;
	margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Appearance (theme/font-size/width) is removed from every page rather than&lt;br /&gt;
   relocated -- Vector wires it into the right column with no config to move&lt;br /&gt;
   it, and Special:Preferences already has a real, working &amp;quot;Color&amp;quot; setting&lt;br /&gt;
   under Appearance, so nothing is lost for anyone with an account; readers&lt;br /&gt;
   without one still get the site&#039;s OJ_DEFAULT_THEME default. */&lt;br /&gt;
.vector-appearance-landmark {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* &amp;quot;Switch to old look&amp;quot; (legacy Vector opt-out), shown to logged-in users at&lt;br /&gt;
   the bottom of the left menu. Vector hardcodes this with no config flag to&lt;br /&gt;
   turn it off -- confirmed by rendering the component directly rather than&lt;br /&gt;
   guessing from the template -- so it&#039;s removed the same way as Appearance. */&lt;br /&gt;
.vector-main-menu-action-opt-out {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The right panel&#039;s &amp;quot;Last modified&amp;quot; link already says this. No config gate&lt;br /&gt;
   exists for the footer&#039;s own copy (unlike Privacy/About/Disclaimers just&lt;br /&gt;
   above, which are disabled the proper way, via their interface messages),&lt;br /&gt;
   so it&#039;s hidden the same way Appearance and the old-look link are. */&lt;br /&gt;
#footer-info-lastmod {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Vector deliberately gives the page title (h1) and h2 section headings a&lt;br /&gt;
   serif font -- Wikipedia&#039;s own visual identity -- while body text, and&lt;br /&gt;
   even h3-h6, stay sans-serif. Confirmed in skins.vector.styles: the rule&lt;br /&gt;
   is .mw-body h1, .mw-body-content h1/h2 { font-family: &#039;Linux Libertine&#039; ...&lt;br /&gt;
   That split reads as inconsistent here, so headings inherit the body font&lt;br /&gt;
   instead of overriding it -- one font, everywhere, and it stays that way&lt;br /&gt;
   even if the body font ever changes. */&lt;br /&gt;
.mw-body h1,&lt;br /&gt;
.mw-body .mw-heading1,&lt;br /&gt;
.mw-body-content h1,&lt;br /&gt;
.mw-body-content .mw-heading1,&lt;br /&gt;
.mw-body-content h2,&lt;br /&gt;
.mw-body-content .mw-heading2 {&lt;br /&gt;
	font-family: inherit;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=OpenJournal:Seeded&amp;diff=22</id>
		<title>OpenJournal:Seeded</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=OpenJournal:Seeded&amp;diff=22"/>
		<updated>2026-09-10T19:58:30Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: seed marker&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Seed data was loaded on 2026-09-10.&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=OpenJournal:Helping_out&amp;diff=21</id>
		<title>OpenJournal:Helping out</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=OpenJournal:Helping_out&amp;diff=21"/>
		<updated>2026-09-10T19:58:29Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: how to download a copy of the site&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;openjournal is nothing but MediaWiki, wikitext and Apache configuration -- every&lt;br /&gt;
article on this site can leave with you.&lt;br /&gt;
&lt;br /&gt;
== Download the database ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;oj-download&amp;quot;&amp;gt;&lt;br /&gt;
[{{SERVER}}/download/openjournal-latest.xml.gz Download the database dump]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That is a standard &#039;&#039;&#039;MediaWiki XML export&#039;&#039;&#039; -- the same format&lt;br /&gt;
[https://en.wikipedia.org/wiki/Wikipedia:Database_download Wikipedia&#039;s own public&lt;br /&gt;
dumps] use. It carries every article and every revision, attributed by username.&lt;br /&gt;
It does &#039;&#039;&#039;not&#039;&#039;&#039; carry passwords, email addresses, or anything else about accounts&lt;br /&gt;
-- that is the whole reason this format exists, separately from a raw database&lt;br /&gt;
backup, and it is why it is safe to download and pass around.&lt;br /&gt;
&lt;br /&gt;
It is a snapshot, refreshed by hand rather than live, so it can lag behind the&lt;br /&gt;
site by a while. If you want the current moment instead of the last snapshot, the&lt;br /&gt;
[[OpenJournal:API|API]] reads straight from the live wiki.&lt;br /&gt;
&lt;br /&gt;
== What to do with it ==&lt;br /&gt;
&lt;br /&gt;
Anyone running their own MediaWiki can load the file directly:&lt;br /&gt;
&lt;br /&gt;
* through the browser, at &#039;&#039;&#039;Special:Import&#039;&#039;&#039; -- or&lt;br /&gt;
* from the command line: &amp;lt;code&amp;gt;php maintenance/run.php importDump openjournal-latest.xml.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Either way you end up with your own copy of every article here, on your own wiki,&lt;br /&gt;
under your own control. Nothing about openjournal is required to read it further&lt;br /&gt;
than that.&lt;br /&gt;
&lt;br /&gt;
== Anything else ==&lt;br /&gt;
&lt;br /&gt;
This page exists because someone asked for exactly this: a way to take the data&lt;br /&gt;
and go. If there is a different kind of help that would actually be useful --&lt;br /&gt;
writing, fixing something, saying what is missing -- &#039;&#039;&#039;Discussion&#039;&#039;&#039; on this page&lt;br /&gt;
reaches whoever maintains the site.&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=OpenJournal:Authors&amp;diff=20</id>
		<title>OpenJournal:Authors</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=OpenJournal:Authors&amp;diff=20"/>
		<updated>2026-09-10T19:58:29Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: list of every author&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Everyone who writes on openjournal. Follow a name to read their journal.&lt;br /&gt;
&lt;br /&gt;
{{#dpl:&lt;br /&gt;
|namespace = User&lt;br /&gt;
|nottitlematch = %/%&lt;br /&gt;
|ordermethod = title&lt;br /&gt;
|count = 200&lt;br /&gt;
|mode = userformat&lt;br /&gt;
|listseparators = &amp;lt;div class=&amp;quot;oj-feed&amp;quot;&amp;gt;,&amp;lt;div class=&amp;quot;oj-entry&amp;quot;&amp;gt;&#039;&#039;&#039;[[%PAGE%{{!}}%TITLE%]]&#039;&#039;&#039;&amp;lt;/div&amp;gt;,,&amp;lt;/div&amp;gt;&lt;br /&gt;
|allowcachedresults = false&lt;br /&gt;
|noresultsheader = &amp;lt;em&amp;gt;Nobody has started a journal yet.&amp;lt;/em&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;div class=&amp;quot;oj-footnote&amp;quot;&amp;gt;&lt;br /&gt;
A journal appears here once its author has created their&lt;br /&gt;
[[Special:MyPage|journal home]]. To browse every page instead, including each&lt;br /&gt;
individual article, see [[Special:PrefixIndex/User:|the full index]].&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=OpenJournal:API&amp;diff=19</id>
		<title>OpenJournal:API</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=OpenJournal:API&amp;diff=19"/>
		<updated>2026-09-10T19:58:28Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: API documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;openjournal is MediaWiki, so it has MediaWiki&#039;s APIs — nothing here is bespoke, and&lt;br /&gt;
anything true of the [https://www.mediawiki.org/wiki/API:Main_page MediaWiki API] is&lt;br /&gt;
true here.&lt;br /&gt;
&lt;br /&gt;
Cross-origin reads are allowed, so you can call these straight from a browser — but&lt;br /&gt;
MediaWiki only sends the CORS headers when you ask for them, so add&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;amp;origin=*&amp;lt;/code&amp;gt;&#039;&#039;&#039; to any &amp;lt;code&amp;gt;api.php&amp;lt;/code&amp;gt; request you make from&lt;br /&gt;
another site. &amp;lt;code&amp;gt;rest.php&amp;lt;/code&amp;gt; needs no such parameter.&lt;br /&gt;
&lt;br /&gt;
Articles are subpages of their author: &#039;&#039;&#039;&amp;lt;code&amp;gt;User:Alice/Some title&amp;lt;/code&amp;gt;&#039;&#039;&#039;. That&lt;br /&gt;
means &amp;quot;everything Alice wrote&amp;quot; is a title-prefix query.&lt;br /&gt;
&lt;br /&gt;
== The friendly routes ==&lt;br /&gt;
&lt;br /&gt;
For the common case -- get someone&#039;s posts, get one post -- these read better than&lt;br /&gt;
the MediaWiki API underneath them, which is all they are: Apache rewrite rules onto&lt;br /&gt;
the exact same &amp;lt;code&amp;gt;api.php&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;action=render&amp;lt;/code&amp;gt; this page&lt;br /&gt;
documents further down, not a second API to keep in sync.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /users/{username}/posts                     all of a user&#039;s posts, alphabetical by title&lt;br /&gt;
GET /users/{username}/posts/{title}              one post: title, wikitext, last-edited time&lt;br /&gt;
GET /users/{username}/posts/{title}?format=html  the same post, rendered to HTML&lt;br /&gt;
GET /users/{username}                            redirects to their journal (browsable)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{title}&amp;lt;/code&amp;gt; is the part after the slash, with spaces as underscores, e.g.&lt;br /&gt;
&amp;lt;code&amp;gt;/users/Alice/posts/Laying_a_hedge&amp;lt;/code&amp;gt; for&lt;br /&gt;
&amp;lt;code&amp;gt;User:Alice/Laying a hedge&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A post that doesn&#039;t exist behaves differently depending on the format: with&lt;br /&gt;
&amp;lt;code&amp;gt;?format=html&amp;lt;/code&amp;gt; you get a real &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt;. Without it -- the default,&lt;br /&gt;
plain JSON -- you always get &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;, with &amp;lt;code&amp;gt;&amp;quot;missing&amp;quot;:true&amp;lt;/code&amp;gt; in the&lt;br /&gt;
body instead. That form is calling &amp;lt;code&amp;gt;api.php&amp;lt;/code&amp;gt; underneath, and there is no&lt;br /&gt;
way to make MediaWiki&#039;s own API answer with a different HTTP status without writing&lt;br /&gt;
code, which&lt;br /&gt;
this project avoids. Check &amp;lt;code&amp;gt;missing&amp;lt;/code&amp;gt; if that matters to you.&lt;br /&gt;
&lt;br /&gt;
== All articles by one user (the underlying MediaWiki call) ==&lt;br /&gt;
&lt;br /&gt;
Same data the &amp;lt;code&amp;gt;/users/{username}/posts&amp;lt;/code&amp;gt; route above returns, and where&lt;br /&gt;
its extra parameters -- excerpts, URLs -- come from, if you want to add your own.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /api.php?action=query&amp;amp;list=allpages&amp;amp;apnamespace=2&amp;amp;apprefix=Alice/&amp;amp;format=json&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== One article, as HTML ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /rest.php/v1/page/User%3AAlice%2FSome_title/html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== One article, as source ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /rest.php/v1/page/User%3AAlice%2FSome_title&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Every article on the site, newest first ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /api.php?action=query&amp;amp;generator=recentchanges&amp;amp;grcnamespace=2&amp;amp;grclimit=30&amp;amp;format=json&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Excerpts and lead images, for a card or a feed ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /api.php?action=query&amp;amp;prop=extracts|pageimages&amp;amp;exchars=300&amp;amp;explaintext=1&amp;amp;titles=User:Alice/Some_title&amp;amp;format=json&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== An Atom feed of everything ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /index.php?title=Special:RecentChanges&amp;amp;feed=atom&amp;amp;namespace=2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One author&#039;s feed is the same URL narrowed with &amp;lt;code&amp;gt;&amp;amp;tagfilter=&amp;lt;/code&amp;gt; or, more&lt;br /&gt;
simply, poll &amp;lt;code&amp;gt;list=allpages&amp;lt;/code&amp;gt; above.&lt;br /&gt;
&lt;br /&gt;
== Writing from your own code ==&lt;br /&gt;
&lt;br /&gt;
Editing over the API uses the same login you use in the browser, which is Wikimedia&lt;br /&gt;
OAuth — so a script writes by acting as you through an&lt;br /&gt;
[https://meta.wikimedia.org/wiki/Special:OAuthConsumerRegistration owner-only OAuth&lt;br /&gt;
consumer], not by sending a password. Bot passwords are switched off here for the&lt;br /&gt;
same reason.&lt;br /&gt;
&lt;br /&gt;
See [[OpenJournal:API/Recipes]] for worked examples, or the full parameter reference&lt;br /&gt;
at [[Special:ApiHelp/query]] — it is generated from this wiki&#039;s own installed modules,&lt;br /&gt;
so it is never out of date.&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=OpenJournal:Latest_articles&amp;diff=18</id>
		<title>OpenJournal:Latest articles</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=OpenJournal:Latest_articles&amp;diff=18"/>
		<updated>2026-09-10T19:58:28Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: every article, 50 per page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every article on openjournal, newest first, 50 to a page.&lt;br /&gt;
&lt;br /&gt;
{{Latest articles page|offset=0|count=50}}&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=OpenJournal:Latest/4&amp;diff=17</id>
		<title>OpenJournal:Latest/4</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=OpenJournal:Latest/4&amp;diff=17"/>
		<updated>2026-09-10T19:58:27Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: page 4 of the front-page feed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Latest articles page|offset=30|prev=OpenJournal:Latest/3}}&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=OpenJournal:Latest/3&amp;diff=16</id>
		<title>OpenJournal:Latest/3</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=OpenJournal:Latest/3&amp;diff=16"/>
		<updated>2026-09-10T19:58:26Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: page 3 of the front-page feed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Latest articles page|offset=20|prev=OpenJournal:Latest/2|next=OpenJournal:Latest/4}}&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=OpenJournal:Latest/2&amp;diff=15</id>
		<title>OpenJournal:Latest/2</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=OpenJournal:Latest/2&amp;diff=15"/>
		<updated>2026-09-10T19:58:26Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: page 2 of the front-page feed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Latest articles page|offset=10|prev=Main Page|next=OpenJournal:Latest/3}}&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=Main_Page&amp;diff=14</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=Main_Page&amp;diff=14"/>
		<updated>2026-09-10T19:58:25Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: openjournal front page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;oj-hero&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;oj-hero-title&amp;quot;&amp;gt;openjournal&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;oj-hero-sub&amp;quot;&amp;gt;&lt;br /&gt;
Welcome to openjournal!&lt;br /&gt;
&lt;br /&gt;
A fully open blogging platform.&lt;br /&gt;
&lt;br /&gt;
Start writing immediately and join the community!&lt;br /&gt;
&lt;br /&gt;
Some handy things to know:&lt;br /&gt;
&lt;br /&gt;
- The visual editor supports both Markdown and wiktext*&lt;br /&gt;
&lt;br /&gt;
Want to write on here but host your posts elsewhere?&lt;br /&gt;
&lt;br /&gt;
Read our API Guide&lt;br /&gt;
&lt;br /&gt;
Wikitext is very powerful and native to openjournal so it&#039;s recommended you use it and learn it.&lt;br /&gt;
&lt;br /&gt;
You can read about it here:&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Help:Wikitext&lt;br /&gt;
&lt;br /&gt;
Happy writing!&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Latest articles ==&lt;br /&gt;
&lt;br /&gt;
{{Latest articles page|offset=0|next=OpenJournal:Latest/2}}&lt;br /&gt;
&lt;br /&gt;
== Everyone writing here ==&lt;br /&gt;
&lt;br /&gt;
{{#dpl:&lt;br /&gt;
|namespace = User&lt;br /&gt;
|nottitlematch = %/%&lt;br /&gt;
|ordermethod = title&lt;br /&gt;
|count = 100&lt;br /&gt;
|mode = userformat&lt;br /&gt;
|listseparators = &amp;lt;span class=&amp;quot;oj-authors&amp;quot;&amp;gt;,&amp;lt;span&amp;gt;[[%PAGE%{{!}}%TITLE%]]&amp;lt;/span&amp;gt;,,&amp;lt;/span&amp;gt;&lt;br /&gt;
|allowcachedresults = false&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Wanting to help out? ==&lt;br /&gt;
&lt;br /&gt;
openjournal is nothing but MediaWiki underneath, which means everything on it can&lt;br /&gt;
leave with you -- see [[OpenJournal:Helping out]] for a database dump you can&lt;br /&gt;
download and load into a wiki of your own.&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=MediaWiki:Dpl-parserfunc-tracking-category&amp;diff=13</id>
		<title>MediaWiki:Dpl-parserfunc-tracking-category</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=MediaWiki:Dpl-parserfunc-tracking-category&amp;diff=13"/>
		<updated>2026-09-10T19:58:24Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: stop DPL&amp;#039;s own tracking category showing up&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=MediaWiki:Dpl-tracking-category&amp;diff=12</id>
		<title>MediaWiki:Dpl-tracking-category</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=MediaWiki:Dpl-tracking-category&amp;diff=12"/>
		<updated>2026-09-10T19:58:24Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: stop DPL&amp;#039;s own tracking category showing up&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=MediaWiki:Disclaimers&amp;diff=11</id>
		<title>MediaWiki:Disclaimers</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=MediaWiki:Disclaimers&amp;diff=11"/>
		<updated>2026-09-10T19:58:23Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: disable the broken Disclaimers footer link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=MediaWiki:Aboutsite&amp;diff=10</id>
		<title>MediaWiki:Aboutsite</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=MediaWiki:Aboutsite&amp;diff=10"/>
		<updated>2026-09-10T19:58:23Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: disable the broken About footer link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=MediaWiki:Privacy&amp;diff=9</id>
		<title>MediaWiki:Privacy</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=MediaWiki:Privacy&amp;diff=9"/>
		<updated>2026-09-10T19:58:22Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: disable the broken Privacy policy footer link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=MediaWiki:Openjournal-write-in-your-journal&amp;diff=8</id>
		<title>MediaWiki:Openjournal-write-in-your-journal</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=MediaWiki:Openjournal-write-in-your-journal&amp;diff=8"/>
		<updated>2026-09-10T19:58:22Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: off-limits message&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This part of openjournal is not a page anyone can write in — the front page,&lt;br /&gt;
templates and site documentation are looked after by the site&#039;s maintainers.&lt;br /&gt;
&lt;br /&gt;
Your own writing goes in your journal, at &amp;lt;code&amp;gt;User:&#039;&#039;You&#039;&#039;/&#039;&#039;Title&#039;&#039;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Head to [[Special:MyPage|your journal]] to start an article, and use the&lt;br /&gt;
&#039;&#039;&#039;Discussion&#039;&#039;&#039; tab if you want to raise something about this page.&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=MediaWiki:Openjournal-not-your-journal&amp;diff=7</id>
		<title>MediaWiki:Openjournal-not-your-journal</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=MediaWiki:Openjournal-not-your-journal&amp;diff=7"/>
		<updated>2026-09-10T19:58:21Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: ownership message&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article belongs to [[User:$1|$1]]&#039;s journal, so only $1 can edit it.&lt;br /&gt;
&lt;br /&gt;
You can still join the conversation on its &#039;&#039;&#039;Discussion&#039;&#039;&#039; tab, or write about it in&lt;br /&gt;
[[Special:MyPage|your own journal]].&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=MediaWiki:Sidebar&amp;diff=6</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=MediaWiki:Sidebar&amp;diff=6"/>
		<updated>2026-09-10T19:58:20Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: openjournal navigation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|Main Page&lt;br /&gt;
** Special:MyPage|My journal&lt;br /&gt;
** OpenJournal:Authors|All Authors&lt;br /&gt;
** OpenJournal:Latest articles|All Articles&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** OpenJournal:API|API&lt;br /&gt;
** OpenJournal:Helping out|Helping out&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=Template:Latest_articles_page&amp;diff=5</id>
		<title>Template:Latest articles page</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=Template:Latest_articles_page&amp;diff=5"/>
		<updated>2026-09-10T19:58:20Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: one page of the front-page feed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
One page of the &amp;quot;Latest articles&amp;quot; feed on the front page. Takes a literal, hardcoded&lt;br /&gt;
offset rather than reading one from the URL: DPL&#039;s own offset-caching does not vary&lt;br /&gt;
by query string, so two different offsets requested close together can otherwise&lt;br /&gt;
serve each other&#039;s cached page -- confirmed the hard way, not a hypothetical. A&lt;br /&gt;
handful of separate, ordinary wiki pages, each pinned to its own offset, has no such&lt;br /&gt;
problem, at the cost of being a fixed number of pages rather than infinite scroll.&lt;br /&gt;
&lt;br /&gt;
Parameters: &#039;&#039;&#039;offset&#039;&#039;&#039; (required), &#039;&#039;&#039;prev&#039;&#039;&#039; and &#039;&#039;&#039;next&#039;&#039;&#039; (page titles, omit&lt;br /&gt;
whichever end doesn&#039;t apply), &#039;&#039;&#039;count&#039;&#039;&#039; (articles per page, default 10).&lt;br /&gt;
&lt;br /&gt;
To add a page once there is enough new content: create the next page with&lt;br /&gt;
&amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; higher than the last one by however many &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; is&lt;br /&gt;
for that feed, point its &amp;lt;code&amp;gt;prev&amp;lt;/code&amp;gt; at the page before it, and set that&lt;br /&gt;
previous page&#039;s &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; to the new page.&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;oj-feed-page&amp;quot;&amp;gt;&lt;br /&gt;
{{#dpl:&lt;br /&gt;
|namespace = User&lt;br /&gt;
|titlematch = %/%&lt;br /&gt;
|ordermethod = lastedit&lt;br /&gt;
|order = descending&lt;br /&gt;
|count = {{{count|10}}}&lt;br /&gt;
|offset = {{{offset}}}&lt;br /&gt;
|mode = userformat&lt;br /&gt;
|listseparators = &amp;lt;div class=&amp;quot;oj-feed&amp;quot;&amp;gt;,&amp;lt;div class=&amp;quot;oj-entry&amp;quot;&amp;gt;&#039;&#039;&#039;[[%PAGE%{{!}}%TITLE%]]&#039;&#039;&#039;&amp;lt;br /&amp;gt;&amp;lt;span class=&amp;quot;oj-byline&amp;quot;&amp;gt;by [[User:%USER%{{!}}%USER%]] · %DATE%&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;,,&amp;lt;/div&amp;gt;&lt;br /&gt;
|replaceintitle = /^[^\/]*\//,&lt;br /&gt;
|addauthor = true&lt;br /&gt;
|addeditdate = true&lt;br /&gt;
|allowcachedresults = false&lt;br /&gt;
|noresultsheader = &amp;lt;em&amp;gt;No more articles.&amp;lt;/em&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;oj-pager&amp;quot;&amp;gt;{{#if:{{{prev|}}}|&amp;lt;span class=&amp;quot;oj-newer&amp;quot;&amp;gt;[[{{{prev}}}|← Newer articles]]&amp;lt;/span&amp;gt;}}{{#if:{{{next|}}}|&amp;lt;span class=&amp;quot;oj-older&amp;quot;&amp;gt;[[{{{next}}}|Older articles →]]&amp;lt;/span&amp;gt;}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=Template:Article/preload&amp;diff=4</id>
		<title>Template:Article/preload</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=Template:Article/preload&amp;diff=4"/>
		<updated>2026-09-10T19:58:19Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: skeleton for new articles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;Skeleton loaded into every new openjournal article.&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;/includeonly&amp;gt;Write your article here, then delete this.&lt;br /&gt;
&lt;br /&gt;
Markdown works as you type:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;**bold**&amp;lt;/nowiki&amp;gt; or &amp;lt;nowiki&amp;gt;__bold__&amp;lt;/nowiki&amp;gt;, &amp;lt;nowiki&amp;gt;*italics*&amp;lt;/nowiki&amp;gt; or &amp;lt;nowiki&amp;gt;_italics_&amp;lt;/nowiki&amp;gt;,&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;`code`&amp;lt;/nowiki&amp;gt; and &amp;lt;nowiki&amp;gt;~~strikethrough~~&amp;lt;/nowiki&amp;gt; format themselves once you close them&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;# &amp;lt;/nowiki&amp;gt; to &amp;lt;nowiki&amp;gt;###### &amp;lt;/nowiki&amp;gt; at the start of a line make headings&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;- &amp;lt;/nowiki&amp;gt; or &amp;lt;nowiki&amp;gt;* &amp;lt;/nowiki&amp;gt; starts a bullet list, &amp;lt;nowiki&amp;gt;1. &amp;lt;/nowiki&amp;gt; a numbered one&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;&amp;gt; &amp;lt;/nowiki&amp;gt; quotes, &amp;lt;nowiki&amp;gt;```&amp;lt;/nowiki&amp;gt; opens a code block, &amp;lt;nowiki&amp;gt;---&amp;lt;/nowiki&amp;gt; draws a rule&lt;br /&gt;
&lt;br /&gt;
These are typing shortcuts, so they only apply in the visual editor — the one&lt;br /&gt;
this button opened. Under &amp;quot;Edit source&amp;quot; you are writing wikitext, where bold is&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&#039;&#039;&#039;three quotes&#039;&#039;&#039;&amp;lt;/nowiki&amp;gt; and Markdown characters stay as you typed them.&lt;br /&gt;
&lt;br /&gt;
When you save, this article appears on the [[Main Page|front page]] and in your&lt;br /&gt;
journal, and anyone logged in can reply on its &#039;&#039;&#039;Discussion&#039;&#039;&#039; tab.&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
	<entry>
		<id>https://openjournal.wiki/index.php?title=Template:Journal&amp;diff=3</id>
		<title>Template:Journal</title>
		<link rel="alternate" type="text/html" href="https://openjournal.wiki/index.php?title=Template:Journal&amp;diff=3"/>
		<updated>2026-09-10T19:58:19Z</updated>

		<summary type="html">&lt;p&gt;OpenJournalAdmin: journal home template&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
Put &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Journal}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; on your user page to turn it into your journal home:&lt;br /&gt;
it lists your articles and gives you a box for starting a new one.&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;oj-journal&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;inputbox&amp;gt;&lt;br /&gt;
type=create&lt;br /&gt;
prefix={{FULLPAGENAME}}/&lt;br /&gt;
buttonlabel=Start a new article&lt;br /&gt;
placeholder=Title of your next article&lt;br /&gt;
preload=Template:Article/preload&lt;br /&gt;
useve=true&lt;br /&gt;
break=no&lt;br /&gt;
&amp;lt;/inputbox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#dpl:&lt;br /&gt;
|namespace = User&lt;br /&gt;
|titlematch = {{PAGENAME}}/%&lt;br /&gt;
|ordermethod = lastedit&lt;br /&gt;
|order = descending&lt;br /&gt;
|count = 100&lt;br /&gt;
|mode = userformat&lt;br /&gt;
|listseparators = &amp;lt;div class=&amp;quot;oj-feed&amp;quot;&amp;gt;,&amp;lt;div class=&amp;quot;oj-entry&amp;quot;&amp;gt;&#039;&#039;&#039;[[%PAGE%{{!}}%TITLE%]]&#039;&#039;&#039; &amp;lt;span class=&amp;quot;oj-byline&amp;quot;&amp;gt;· %DATE%&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;,,&amp;lt;/div&amp;gt;&lt;br /&gt;
|replaceintitle = /^[^\/]*\//,&lt;br /&gt;
|addeditdate = true&lt;br /&gt;
|noresultsheader = &amp;lt;em&amp;gt;No articles here yet.&amp;lt;/em&amp;gt;&lt;br /&gt;
|allowcachedresults = false&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>OpenJournalAdmin</name></author>
	</entry>
</feed>