Third Spruce Tree On The Left

WriteFreely

You like the style of my blog? It only took me all afternoon. I may have some work catch-up to do this weekend.

So one of the reasons I broke up with WordPress, other than it was heckaspensive to host a domain, and it was over featured, and I wanted to self-host, etc., etc. – was because I couldn't futz with the stylesheet for this blog without paying even more money. That's dumb.

I mean all I wanted was monospaced text for snips of code, is that too much to ask for?
Read more...

Its been a week 9 months (10/20) or so since I've set up my #WriteFreely instance. Here's how I did it

I quite like it as a blogging platform. I've learned a few things along the way and since.

Is it the most fully featured blog platform? Nope, not by a long shot. But depending on your needs it might be sufficient for you. On the Fediverse of late I've noticed an uptick of people asking questions about WriteFreely vs. say, Plume or WordPress+their ActivityPub plugin for federation-capable blogs.

Since there are few free WriteFreely instances with open registrations (as opposed to invite only or restricted) where you can experiment with it, you're going to want to know more about what you get with WriteFreely... or more importantly, what you don't get, before you $pony up$ for a paid WriteFreely service, or expend the effort to set yourself up your own instance. So let's answer a few questions, with a particular comparison with WordPress.

WriteFreely vs....

What are the other Federated blog platforms?

  • WriteFreely

  • Plume – this has some additional features that WriteFreely doesn't have, but isn't as actively developed.

  • Write.As – this is actually a hosted WriteFreely instance by the developers of WriteFreely; they have both paid and fee tier accounts.

  • WordPress+ActivityPub plugin: WordPress's parent company just bought the developers of the ActivityPub plugin; but to use plugins you need a paid $WordPress$ ($54/month!!) tier.

  • Drupal + ActivityPub – Drupal has a module that implements ActivityPub on a Drupal site – no shade on Drupal but while its an excellent and capable content management system for managing all of the resources of a complex website, is serious overkill for a personal blog.

Also, rumour has it that

  • Medium (who just launched a Mastodon instance for their users) and
  • Substack are working on ActivityPub integrations

Does WriteFreely have....

  • Themes? no. WP lets you choose a theme. But without $plugins$ you can't customize them.
  • Blocks? no. WP edits chunks of text in blocks <– to which you can apply various block styles. No such thing here.
  • Reeusable text snips/blocks? aka chunks of reusable content? no
  • Text formatting? yes. Text in WriteFreely is formatted using a subset of Markdown. See my writefreely Writer's Guide – Cheat Sheet
  • HTML? yes, a limited subset. see writefreely Writer's Guide – Cheat Sheet
  • Tables? yes; native tables will allow you to use inline Markdown that WF supports, but customization of those tables will be limited to what you can do with stylesheets; if you want to get fancy (e.g. column or row spanning) you can use HTML tables, but any Markdown within those HTML tables will not render.
  • custom CSS? yes, at a blog level. You can define custom styles however and apply them to specific text/Markdown elements by wrapping those in <span style="customstyle"></span> tags.
  • Advanced page layout? no (except what you can accomplish through CSS, divs and tables)

Media/Images

  • link to/display media from another site like Imgur or Pixelfed? yes
  • embed media from another site? yes, with stuff like iframes:

Can WriteFreely Store Media/Images/Files?

  • if you have access to the WriteFreely instance (server) itself? Yes (see below)
  • if you do NOT have admin access to the WF instance: no.

WriteFreely currently does not have any built-in file storage, management or upload capability. It will, however, happily host any file that is stored – or linked to – within its statics folder: this is where images like the site favourite/browser tab icon, user “letter” avatars, default site stylesheets are served from.

All of the images used in this blog are hosted by WriteFreely: I have a link from within the statics folder to a different folder that is a Samba network share accessible to the computers on my home network. It would be trivial to setup any means of remote file upload: FTP, cgi-based HTTP upload; if you have administrative access to the server that hosts WriteFreely.

How does WriteFreely Organize/Index My Content?

  • create and save multiple drafts? yes
  • unpublish a post back to draft? yes
  • categories? no
  • labels? no
  • hashtags? yes – these are ignored by Federated services, but anything you hashtag in a WriteFreely post becomes a link to a listing of ALL posts that also have that hashtag. So this is similar to labels in WordPress.
  • multiple blogs per user? Yes (if configured by the instance admin)

What stats does WriteFreely offer?

For each blog, you can view

  • how many followers
  • for each blog post, how many views

Thats it. Unlike WordPress, the stats are “lifetime” and there's no advanced breakdown like where viewers are from or how many views per day/month. Unless you're the instance admin, in which case you can get this info from the WriteFreely log file.

How does WriteFreely Federate?

When you post in WriteFreely, the first line of your post becomes the “slug” – the text snip that accompanies your post. The post is just a link back to WriteFreely and a preview generated by whatever is viewing it. Here's how one of my posts appears in Mastadon: Here's how a WriteFreely post appears in Mastadon

  • can your blogs be “followed” by other users on the Fediverse? yes
  • can Fediverse peeps reply/comment on your blog posts? no
  • can you mention a hashtag in your post and have it show up under that hashtag in Federated services? no
  • can you @mention users and have your post show up in their inbox? yes, but the text around their @mention appears like a direct message and a link to the blog post may not be included.
  • can your blog “manage” follows? i.e. block etc. no

In WordPress+ActivityPub plugin Federated users can respond to blog posts, which appear as comments on the post; subsequent comments and replies thread accordingly.

Can data be Imported/Exported?

Yes – all of your posts (including Drafts) can be exported as markdown files, bundled in a convenient zip. These can be imported into any other WriteFreely instance.

Can I monetize my WriteFreely blog?

Supposedly – that's a feature I haven't played around with yet as it doesn't interest me.

How does WriteFreely support multiple users?

WF instances can be configured as single user (in which case registrations aren't even applicable) or multi-user. If multi-user, the instance can be configured with open registrations (anyone can sign up), invite-only (where invites can be sent from users or only admins).

What about blog privacy?

Each blog can be configured to be: Unlisted -This blog is visible to anyone with its link. Private – Only you may read this blog (while you're logged in). Password-protected: A password is required to read this blog. Public – This blog is displayed on the public reader, and is visible to anyone with its link. (the Reader is a meta “aggregate” blog where all blogs on the instance show up in a single feed on the instance home page)

There doesn't seem to be a lot of WriteFreely instances out there where I can sign up for a free account

WF Instances with open registrations get invaded by bot spam accounts relatively quickly. These drown out the active user accounts on each instance (like in the Reader) and/or cause problems for the instance hosting (hardware usage, bandwidth, denial of service).

WriteFreely is Open-Source – How Actively Is It Maintained?

WriteFreely is actively-ish maintained. As I write this of 2023-09-27, the latest release (https://github.com/writefreely/writefreely/releases) is 3 months old 0.14. The maintainer of the project, @matt@writing.exchange is one of the founders of Write.As, which is a subscription/paid WriteFreely-based blog hosting service, so #writeas is getting all the attention but new updates are promised soon. I can't comment on how frequently features/fixes get backported from Write.As to WF, I just got here.

~~Having said that, poking around the GitHub for WF, there are a lot of comments like “is this actively maintained?” ... so .. ¯\(ツ)/¯ ~~

It's fairly good “as is,” and I haven't encountered any bugs so far, but you should know this going in. In any case, the fear of having your blog “locked in” to an unmaintained platform isn't a concern with WriteFreely as you can export your posts with a click, and Markdown conversion engines are all over the place. Markdown is a fairly ubiquitous text syntax.

Can I have a trial account on YOUR instance?

Maybe. DM me at @tezoatlipoca@mas.to after you read the about page.

I would like to set up my own WriteFreely Instance

Well that's good cause I just wrote up how to do just that.

Changelog

2023-02-xx – initial 2023-09-27 – update to “freshness” as 0.14 just dropped.

From the CAN YOU BELEIVE, THIS IS RUN ON A SPEAK AND SPELL POWERED BY TWO HAMSTERS ON A WHEEL? Dept.

#WordPress is nice and all, but it would be nice to have a blog that was ActivityPub friendly, and would fit in with #Mastodon, #Pixelfed, #Friendica and the rest of the #Fediverse. #WriteFreely is one. Here's how to set yourself up a #WriteFreely instance.

I originally was going to write this as a comparison between all the Fediverated or ActivityPub capable blogging platforms out there. But when I got into it, I realized that there are really only a few viable options, as per the Awesome Mastodon Big List of Everything Fediverse:Blogging (which is an exhaustive and actively maintained resource by the way check it out.).

I think when I migrated to Mastadon from #Birdsite in November, I thought there were way more federated blog platforms, but I've since discovered that some Mastadon instances and other microblogging services like #Calkey and #misskey have higher character caps than Mastadon by default – and that's what I was seeing.

So really WriteFreely was it, and I just dug right into setting it up.

Why are you ditching WordPress? We broke up. They were a high maintenance partner and I couldn't even touch the stylesheet

Why WriteFreely vs. ? What other options are there? What do I need to know about it? I wrote an FAQ – everything you need to know about WriteFreely.

Setting Up WriteFreely

I'm not going to regurgitate the Getting Started/Installation guide as it's already pretty good. I will however call attention to a few snags I ran into and a few bonus tips I discovered through experimentation.

WriteFreely is written in Go, for which there are cross-platform compilers. At the moment, the project only builds 64-bit linux binaries due to a tool issue (see the change notes), but if you're not afraid to compile from source you could set this up on a Windows PC if you wanted to.

Platform Choice – OpenSUSE linux

So for now lets go Linux. My “server” is an old gaming PC I've been using to run my TV for the last decade, with a stack of spare 60 and 80 GB drives shoved in. I choose OpenSUSE Tumbleweed after some research as

  • SUSE isn't a “desktop” distro; it has a KDE desktop sure, but its intended for server operation not end user applications
  • it has (Tumbleweed anyway) a continuously updated patch engine like Windows Update; I don't have to worry about keeping it up to date, I just have to schedule the automatic updates.
  • its administration console, Yast, has both a graphical KDE interface, but it also runs from a CLI. Since Im shoving this in a corner of my basement without a monitor, the ability to administer it remotely is key.

Steps followed:

From here it was following the setup wizard really. When asked, I chose “Desktop with KDE Plasma” so I'd have a nice desktop environment for configuration.

After installation, I:

  • disabled the “Network Manager” KDE utility so I could control the network interface manually so I could..
  • configured the firewall setup/zone and bind it to the network interface: we need to open ports 80 (HTTP), 443 (HTTPs) and allow the ssh service for remote administration.
  • configured Network Services > Hostnames
  • enabled Samba Server so I could host a network share for static files I want to use in my blog posts (images, files) like \\servername\img\blogname\ – WriteFreely doesn't have an image/static file “upload” feature yet.
  • I used the Yast and zypper package managers to download and install MySQL (mariadb)
    • you'll be prompted to create one or more “users” for the database. If you create a user for WriteFreely at this point make sure you write down the user name and its password. The username WriteFreely uses doesn't have to be “writefreely”, it can be “the database user”. I used “mysql”.
  • used the MySQL command line tools to make sure the database timezone was UTC.

Download and install WriteFreely

Following the instructions here: https://writefreely.org/start When yo get to the writefreely config start stage, this invokes a setup wizard. Most of the questions are straight forward and/or the parameters are described in more detail here: https://writefreely.org/docs/latest/admin/config. I would recommend reading through that list before you run the wizard, although you can always go back and do it again, or just modify the config.ini file it generates and restart writefreely.

You can configure WF to run Secure or Insecure. If secure, it will require a security certificate for HTTPs and host your blogs on port 443. Any request to HTTP on port 80 is redirected.

Eventually the wizard will ask you for site name (awadwatt.com in my case) and a hostname – this should match the fully qualified domain name of this WriteFreely host (e.g. https://awadwatt.com) – if you setup as writefreely.urdomain.org, be sure to include this. This host name is used to generate the crypto keys and it has to match how this host is visible to the internet, otherwise visitors will get HTTPS/TLS handshake errors when trying to view your blog: the hostname WriteFreely is responding from doesn't match the hostname in the security certificate its presenting to browsers: viewing browsers will go nope! and no one can read your blog.

When asked for database parameters, make sure to use the user name and pwd you wrote down for the database when you configured users in MySql earlier.

The bit about writefreely keys generate: this command has WF reach out to a free service at https://letsencrypt.org/ to generate its HTTPs certificate. What isn't mentioned is how Let's Encrypt will block/ignore your host making certificate requests if you do more than 5 requests in the space of an hour. Like, if you flail around trying to get a dynamic DNS working. So, what I'd recommend is running WriteFreely unsecured until you're ready to get things hooked up on the internet.

Don't run keys generate until you have a domain mapping setup! – jump ahead to the Dynamic DNS mapping section.

Troubleshooting

So at this point, you've configured WriteFreely and if you start it from the command line writefreely, you'll see a message about how its serving on port 80/443. If you point a web-browser on your home network to your server's hostname:

  • you'll see your WriteFreely instance hosted OR
  • you'll get a website didn't respond msg.

If the latter, check: * firewall issues; WriteFreely doesn't register as a linux network service (by default) so it doesn't show up in most linux firewall managers (like Yast); all you can do is open the ports 80 and/or 443. * if you want to see if WriteFreely is alive and responding, try from the WF host itself: * curl -v HTTP://localhost – curl is a command line HTTP/s request tool; connecting to localhost sidesteps all firewalls; you should see WriteFreely respond and the curl request show up in the logs WriteFreely is dumping to the command line. * curl -v HTTP://<IP address of WF on your network> -try the same thing but using the IP address of your server. * curl -v HTTP://<hostname of wf on your network> – this will depend on the ability of your servers hostname to be able to resolve * if the first one works but the latter two don't you have firewall issues or DNS resolution issues.

Once you sort these things out, using curl or a web-browser from another computer on your network you'll see the default WriteFreely page, and in the console where you started WF you'll see the requests from that remote computer appear.

Post installation Setup

We can run WriteFreely but we want to setup things so WriteFreely starts as a system service so if we have to reboot or whatever we don't have to remember to restart WriteFreely.

Steps taken: (I installed writefreely in /usr/local/bin/writefreely) * I moved my config.ini to outside the WF folder so if I update later I don't destroy my config.ini with a default. Tell WF to use it in another location by stating writefreely -c <path/config.ini> * wrote a script to launch WF and dump its standard out and any errors to a file. /usr/local/bin/run_wf:

#!/bin/bash
/usr/local/bin/writefreely/writefreely -c /usr/local/bin/config.ini > /var/log/writefreely.log 2>&1
[Unit]
Description=writefreely systemd service unit file.
Requires=mariadb.service
After=mariadb.service
[Service]
ExecStart=/bin/bash /usr/local/bin/run_wf
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
  • the Requires/After tells systems that WriteFreely should wait until after MySql starts before starting.
  • ExecStart invokes the script above
  • Restart* attepts to restart WF every 5 seconds if it stops running for whatever reason

Great! Now WriteFreely starts with our system and can be started/stopped with our admin tools (Yast) or from the command line with systemctl start/stop/restart writefreely

Post post setup Config

Now we have our WF instance running, we want to forward some ports through our home wifi router, host some images and map our domain to it points itself at our home's external IP address.

Setup WriteFreely to Host Images

I thought about throwing up a Pixelfed instance on this box – I have the disk space and the database. But I'd have to futz around with the conflicting port addresses and mapping/forwarding through my firewall, or get into subdomain mapping like pixelfed.awadwatt.com etc.

I toyed around with setting up an Apache virtual host at awadwatt.com/img/ on a random port (remember WF already gloms 80 and 443) and was able to get that to work, but as I found out, linking to unsecure http images from within a WriteFreely page hosted in secure https throws browsers for a loop; I'd have to run WF unsecure at port 80 for that to work or figure out how to get that virtual host, at a custom port (6900) to host https. Getting an Apache virtual host to do Secure HTTP NOT on port 443 was beyond my skills, or rather my patience. And having to type image URLs as https://awadwatt.com:6900/img/file.png got to be real tedious real fast.

Then I realized: WriteFreely already hosts images (or static files anyway)! The little draft icon this, the avatar icons, the (default) CSS stylesheets, the browser tab “favicon.ico” file etc. Sure enough, poking around in /usr/local/bin/writefreely there's a statics folder, and everything in there is addressable from the domain root. So we could just toss our images in the statics folder, but we can do better than that; for one, I didn't want my images folder trashed whenever I upgraded the application.

So I linked a user specific sub-folder from the static folder to where the images live and made sure the user that WriteFreely runs as can traverse it. Remember that samba folder I created earlier? yep:

tezoatlipoca@famine:/usr/local/bin/writefreely/static> ls -lat
total 16
drwxrwxr-x 1 tezoatlipoca tezoatlipoca  118 Mar  9 14:32 .
-rwxrwxrwx 1 root         root           53 Mar  9 14:29 google296e6456a3479f2c.html
lrwxrwxrwx 1 root         root           23 Mar  6 22:00 tez -> /diskb/img/tezoatlipoca
drwxrwxr-x 1 tezoatlipoca tezoatlipoca   90 Mar  6 10:54 ..
drwxrwxr-x 1 tezoatlipoca tezoatlipoca   98 Nov 11 02:51 css
-rw-rw-r-- 1 tezoatlipoca tezoatlipoca 6090 Nov 11 02:51 favicon.ico
drwxrwxr-x 1 tezoatlipoca tezoatlipoca 1218 Nov 11 02:51 fonts
drwxrwxr-x 1 tezoatlipoca tezoatlipoca  852 Nov 11 02:51 img
drwxrwxr-x 1 tezoatlipoca tezoatlipoca  390 Nov 11 02:51 js
drwxrwxr-x 1 tezoatlipoca tezoatlipoca   20 Nov 11 02:51 local

So now (at least on my home network), all I have to do is save an image to \\famine\img\tezoatlipoca and it shows up at http://awadwatt.com/tez/

Dunno how robust WF's static hosting will hold up under punishment, but I've had a few img bearing posts get hit by a few hundred Mastodon instances and so far so good.

At some point Ill go back to that Apache virtual host method, I really want to get a CGI file uploading script working so I can upload images from work (without opening an ssh hole in my home router for sftp)

Port Forwarding

Not too much to say here other than log into your home wifi/internet router and forward ports 80 (http) and 443 (https) to your WriteFreely instance host.

To diagnose that your host is reachable, use a service like https://whatismyipaddress.com/ to determine your wifi router's external IP address. Then, use your cell phone (disable the wifi!) or from work/school/somewhere not at home, try and connect to that IP address. If you see your WriteFreely instance, huzzah!

If not, check to see if those ports are open/being forwarded properly by probing those ports at that external IP address. The Shields Up! tool by Gibson Research > Scan “All system ports” has been around forever and its still good. The only ports you should see in red are 80 and 443: Shields Up map: only 80 and 443 are forwarded and responding == red

Domain Mapping – Dynamic DNS

Our last step is to set up DNS mapping to our external IP. You could call it quits here, I suppose, and just say, “hey, my blog is at ,” but any Federated service that picks up your blog posts will always expect to find it at the same domain location. Home IP addresses on fixed cable/fibre connections tend not to change too much, but you can never be sure that your IP won't change. Having a static DNS domain->IP address mapping solves that problem.

If our instance was hosted by, or colocated IN an ISP's data center, then yes, part of that hosting arrangement would be allocation of a fixed IP address.

Fortunately, there are (paid, cheap or free) Dynamic DNS services. Essentially these work in two steps:

  • YOU modify your (or some) domain registration (GoDaddy.com, Network Solutions, wherever you registered it) so that its DNS servers of record (i.e. the ones who own the mapping) are the Dynamic DNS services' servers.
    • now, when a computer wants to find yourdomain.org, it asks ITS upstream DNS server (wifi router, ISP etc.); the upstream DNS server know to ask Dynamic DNS's DNS server; it will know. How?
  • YOU tell Dynamic DNS's servers what IP address to map yourdomain.org TO.
    • you can do this manually, or you can set up some automated job/process that runs periodically to update/confirm your server's IP address.

How you set this up will depend on the specific Dynamic DNS provider.

I used https://freedns.afraid.org/ which has both free and paid tiers of dynamic DNS mapping. At my domain registrar, I changed my domain registration's DNS servers:

Domain Name: AWADWATT.COM
Registrar WHOIS Server: whois.networksolutions.com
Registrar URL: http://networksolutions.com
Creation Date: 1999-08-25T21:28:32Z
<snip>
Name Server: NS1.AFRAID.ORG
Name Server: NS2.AFRAID.ORG
Name Server: NS3.AFRAID.ORG
Name Server: NS4.AFRAID.ORG

to theirs.

Then, an hourly cron (scheduled system task) job runs to update the afraid.org name servers with my external IP address. Easy!

Just remember the SSL keys that writefreely keys generate depend on the domain address your instance is found at. So once you get your domain mapping up, be sure to go back and create secure https keys otherwise visiting clients/federated services will get TLS and SSL errors – the host/domain in the keys doesn't match how your server appears on the internet.

Also: DNS propagation can take some time: several days. So don't be surprised after changing your domain > DNS servers and setting up dynamic DNS mapping, it could take several hours to several days before your WriteFreely instance consistently is available at yourdomain.org.

Done! Whats left? Feedback

That wasn't so bad? Figuring this out and flexing some long dormant linux skills took me maybe 6? 8? hours over a weekend. Im sure I could do this in just a few hours. I'd still like to:

  • try and get WriteFreely running on Windows; there are some older Windows binaries available in various repositories, but supposedly its possible to compile from source. But getting a current Windows binary (or a MacOS one!) makes self-hosting available to so many more people.
  • figure out an image uploading mechanism to complement my static subfolder link hack. For one, if I have guest accounts on my WF instance I'd like to be able to offer them image hosting capabilities, without having to log into my home wifi to do it.
  • in-post table of contents using headers! – sometime in the last week or so I saw a post from a Write.As user who figured out a way – using only CSS – to dynamically generate a table of contents of all the headers in your post; gotta dig that up.
  • experiment with CSS for customization – WriteFreely/Write.As have a pretty nice, minimalistic default view, but one of the joys of self-hosting (going back to the GeoCities/MySpace days) is obsessively tweaking your site's stylesheet. CSS tools like Stylizer (which is awesome btw) show there's quite a few styles to tweak in WF pages so Ill have to distill that down a bit to the minimum set required – they're not called cascading for nothing.

Did you follow this? Did It work? Problems?

Seriously, I'd love to hear from you. tezoatlipoca @ gmail.com or @tezoatlipoca @ mas.to.

The #writefreely Writer's Guide latest – over here is quite good, but I wanted a quick cheat sheet for formatting. Also, I have found that WriteFreely can support a bit more of the Markdown Standard, but not all of it.

\<!--more--\> snip (get rid of the \'s) — truncates your post on the blog homepage with a “Read more..” link. (everything above it makes the front page, everything below doesn't)

# h1 Title ###### h6 title *italics* or _italics_ **bold** __bold__ mix and match is ok _mix and **match** is ok_

* bullet1 * bullet2 * sub-bullet2.1

1. list1 2. list2 1. if you reuse 1. it auto-numbers from last

IMAGE: ![image text maybe ALT text?](http://url/) LINK: [link text](http://link url) EMAIL: [email link](mailto:me@somewhere.org)

> this stuff is > quoted

this stuff is — leave a blank line before to work properly quoted

`this is code` this is code The backticks are greedy! (if you have `blah` more text`, all of your text will be glommed as code.

HTML

Properly formatted and enclosed tags: h1 (thru h4), p, ul, li, ol, blockquote, strong, em, u, span, div, a href

Use spans and divs to have custom css styles. <span style="color:red">Style</span> Style

<div id="myDiv" name="myDiv" title="Example Div Element" style="color: #0900C4; border: 1px solid black;">
  <h5>Subtitle in the box</h5>
  <p>This paragraph is also inside the box...</p>
</div>
Subtitle in the box

This paragraph is also inside the box...

These let you make a jump from somewhere in your page to elsewhere. These are just old school HTML anchors, but because we edit in Markdown here we have to add some HTML to insert the anchor/bookmark id in our destination:

Where you want to jump TO: wrap the destination text in a <span id="bookmarkname"> </span> tag. e.g (to this section):

## <span id="Bookmarks">Bookmarks</span>

Where you want to jump FROM: make an href but include the bookmark after a pound/hashtag sign:

<a href="#Bookmarks">click here to jump to the Bookmarks section</a>

click here to jump to the Bookmarks section <— click on this should scroll back up to the top of this section.

You can do this across sites or between your own WriteFreely pages:

<a href="writefreely-writers-guide-cheat-sheet#Bookmarks">click here to jump to the Bookmarks section</a>

click here to jump to the Bookmarks section

Extended Markdown Support in WriteFreely

WriteFreely supports some, but not all of the extended Markdown standard.

Horizontal Rule ok

---


Table ok

| Syntax | Description |
| ----------- | ----------- |
| Header | Title |
| Paragraph | **bold Text**  |
Syntax Description
Header Title
Paragraph bold Text

edit 23/6/24: Markdown tables only seem to work up to about page width, or about seven columns.

You can use HTML <table><tr><td>.. notation but markdown inside won't render properly unless you use HTML markup:

<table><thead><tr><td>hdr1</td><td>hdr2</td></tr></thead>
<tr><td>**cell 1**</td><td><b>bold cell 2</b></td></tr>
</table>

hdr1hdr2
cell 1bold cell 2


Fenced Code Block ok

```
{
  "firstName": "John",
  "lastName": "Smith",
  "age": 25
}
```
{
  "firstName": "John",
  "lastName": "Smith",
  "age": 25
}

Footnote not

Here's a sentence with a footnote. [^1]

[^1]: This is the footnote.

Here's a sentence with a footnote. [^1]

[^1]: This is the footnote.


Heading ID not

### My Great Heading {#custom-id}

My Great Heading {#custom-id}


Definition List not

term : definition term : definition


Strikethrough ok

~~The world is flat.~~ The world is flat.


Task List not

- [x] Write the press release
- [ ] Update the website
- [ ] Contact the media
  • [x] Write the press release
  • [ ] Update the website
  • [ ] Contact the media

Emojis not

That is so funny! :joy: That is so funny! :joy:


Highlight not

the following 3 ==words are very== important the following 3 ==words are very== important


Superscript not

x^2^ x^2^

Changelog

2023-03-05 – initial 2023-06-24 – discovered markdown tables break around column 8 or so. added note.