01 — BEFORE YOU BEGIN

One app, three devices, no account

Selfish is one universal app for iPhone, iPad, and Mac — a single purchase covers all three — and it needs nothing from us to work — no sign-up, no login, no server of ours between you and your writing. Open it and you are already started.

What you need
iOS 26 or iPadOS 26 on iPhone or iPad, or macOS 26 on a Mac.
What you'll want
Somewhere to put the finished site — your own server, object storage, or a managed host. You can write for weeks before you decide; publishing is set up per site, whenever you're ready.
Where your work lives
On your device, in the app's own storage, and — if you use iCloud — in your own iCloud account. Nowhere else.
SHAPE

The flow never changes: write a post, generate the static site, publish it to your host. Connection setup happens once per site — after that a publish is one tap.

01
Write
02
Generate
03
Connect
04
Publish
02 — GETTING AROUND

The same app, sized to the screen

Selfish is one app built three ways up. Everything below exists on every device; only the arrangement changes.

iPhone
A stack you push through: Sites → the site's Posts and Pages → the composer. New posts open as a sheet with a Cancel button; tapping an existing post pushes it, and the back arrow returns you.
iPad & Mac
Columns side by side: the sites list, the post list, and the editor, with a site dashboard when nothing is open. The Mac adds a site switcher and a Site Actions menu; every deletable row has a right-click menu, since there's no swipe to delete.

Three controls sit in the site's header on every platform, and they are the ones worth learning:

①

+ — starts a new post, or a new page when the Pages tab is selected.

②

⋯ — opens Themes, Categories & Tags, and Site Settings.

③

Publish Site — pinned along the bottom, with a chip counting the drafts that won't go out with this publish.

In the sites list, a site shows a Changes marker while it has unpublished drafts, and a Live marker once it has a site URL and nothing outstanding. It's a nudge, not an alarm.

03 — CREATE A SITE

Start with a name

From the sites list, choose New Site. Three fields, two of them optional — you can be writing inside a minute.

FIELD
WHAT TO ENTER
Site Title
The name that appears on the finished site, e.g. Field Notes.
Description
(optional) A short line about what the site is. Shown on the site and used in its feeds.
Author
(optional) Your name, used in the RSS and JSON feeds.

One more field matters before you publish, and it lives in Site Settings → Site:

FIELD
WHAT TO ENTER
Site URL
The public address readers will actually reach, e.g. https://fieldnotes.example. Selfish builds canonical links, sitemap.xml, and the feeds from it, so a wrong value here is a wrong value in every one of them.
TIP

On a managed host you may not know the address until the site exists. Publish once, take the *.netlify.app or *.pages.dev address you're given, put it in Site URL, and publish again — the feeds and sitemap will then point at the right place.

Site Settings is three screens: Site (title, URL, profile images, directory listing, delete), Theme, and Publishing. Changes apply when you tap Save.

04 — WRITE A POST

The composer

Tap + and you get a title field and a blank page. Type. The body is plain text with light formatting — no blocks to drag, no panels to open before you can start a sentence.

①

Autosave writes your title and body about two seconds after you stop typing, so words survive a crash or a closed lid. It only writes when something actually changed.

②

Save (⌘S on Mac and iPad) commits everything else — status, date, category, tags, slug, description. The button reads Saved once there's nothing left to write.

③

Cancel on a brand-new post offers to discard it. It means it: the draft and any photos you attached are deleted.

Post lists have a filter field at the top — type a word and the list narrows to titles and content containing it. Useful once a site has a few hundred posts in it.

Formatting text

A toolbar sits above the keyboard with six controls, each of which applies to the selection — or to what you type next, if there's no selection.

CONTROL
WHAT IT DOES
Bold · Italic
Toggle emphasis. Both can apply at once. Styling shows live as you type.
Link
Prompts for a web address and links the selected text. With the caret inside an existing link, the same button becomes Remove link.
H2 · H3
Turn every line the selection touches into a second- or third-level heading. Tap again to turn it back.
Quote
Makes the touched lines a block quote.

Underneath, your post is stored as plain text with a small, familiar Markdown subset — which means you can also just type it. What you type stays as plain characters in the composer rather than styling as you go, but it publishes exactly as you’d expect:

  • **bold**, *italic*, and ***both***
  • [text](https://example.com) for links — bare URLs are linked automatically too
  • #, ##, ### for headings, and > for a quote
  • -, * or + for a bulleted list; 1. for a numbered one
  • Three backticks to open and close a code block
  • \* and \\ when you want a literal asterisk or backslash
NOTE

Lists and code blocks are the two things the editor shows as you typed them rather than styling live — they render properly in the preview and on the published page. Everything round-trips exactly; nothing is lost by editing a post again later.

Photos, video & audio

Two chips sit below the composer. Media opens the photo library — up to ten photos or videos at a time. Audio opens the file picker, because audio doesn't live in the photo library.

Everything you attach is optimised once, on import, and the optimised file is the only copy Selfish keeps. That is deliberate: it protects your storage and, more to the point, your privacy.

Photos
Scaled to fit within 1920px and re-encoded as JPEG. Because they're rebuilt from pixels alone, EXIF and GPS data are stripped — the coordinates of your kitchen don't ship with the picture of your dinner.
Video
Transcoded to H.264 MP4 for maximum browser compatibility, optimised to start playing before it finishes downloading, with location and timestamps removed. Selfish asks the quality once per clip: High (1080p) or Standard (720p). Neither upscales a smaller source.
Audio
Always saved as .m4a with tags stripped. AAC files are re-packaged without re-encoding, so nothing is lost; MP3, WAV and other formats are converted to AAC so browsers can play them.

Attachments appear as thumbnails in a strip — a poster frame for video, a waveform for audio. Tap one to open its details:

FIELD
WHAT TO ENTER
Alt Text
A description read aloud by screen readers in place of the file. Worth writing for every image — it's the difference between a usable page and a decorative one.
Caption
(optional) A line shown beneath the item on the published page.

Media is published inline, where you place it in the post. Put the caret where you want a photo and add it; the composer shows it in place as you write, and the published page puts it exactly there. An attachment you never place renders at the top of the post rather than being lost.

Post details

The Details chip on iPhone and iPad — and the Post Details toolbar button on the Mac, which opens a side panel — holds everything about the post that isn't the post. None of it is required — a title and some words are enough — but this is where a post becomes a properly addressed page.

FIELD
WHAT IT CONTROLS
Status
Draft or Published. Drafts are never generated and never uploaded — this is the switch that decides whether the world sees it.
Publish Date
The date shown on the post and used to order the site's index and feeds. Set it back to backdate an import; set it forward and it still publishes — Selfish doesn't hold posts for a future date.
Category
One per post, chosen from the categories you've created for this site. Each gets its own archive page.
Tags
As many as you like, tapped on and off. Each tag gets an archive page too.
Slug
The last part of the post's address. Leave it empty and Selfish builds one from the title the first time you save.
Search & Social Description
The summary shown in search results and link previews. Leave it empty and Selfish uses an excerpt of the post.
ADDRESSES

A slug is fixed once it's saved — renaming the post later does not move the page, which is the right default: links you've already shared keep working. If you do want the address to change, edit Slug yourself, and remember the old URL will stop resolving. Two posts that would produce the same slug get -2, -3 and so on, so an archive page is never silently overwritten.

05 — PAGES

For the things that aren't news

The Pages tab holds the fixed parts of a site — About, Contact, Now, Colophon. A page is written in exactly the same composer as a post, with the same formatting and the same media handling.

Two differences, both of them the point:

①

Pages have no category and no tags. They aren't part of the stream, so they aren't filed like it.

②

Pages are left out of the RSS and JSON feeds, and published under /pages/ rather than /posts/. Nobody wants your About page turning up in their reader twice a year.

Pages honour Draft and Published in the same way, so you can write one in the open without it going live.

06 — CATEGORIES & TAGS

Filing, and what it costs

Open ⋯ → Categories & Tags. Both are per site, and both need creating here before they can be picked in a post's details. A category is the one broad bucket a post sits in; tags are the labels you can pile on.

FIELD
WHAT TO ENTER
Name
What readers see, e.g. Field Notes.
URL Slug
The address of its archive page. Built from the name if you leave it alone.
Description
(optional) A line shown on the archive page.
DELETING

Deleting a category or a tag never deletes posts. The posts simply stop carrying that label, and its archive page disappears from the next publish. Because archive pages are real files on your server, a deleted category's old page can linger on hosts that don't remove files — see the note on republishing in what gets built.

07 — THEMES & IMAGES

Change the wrapper, not the words

Open ⋯ → Themes, pick one, publish again. Your content is untouched — a theme is CSS and layout, so switching is free and reversible. Every theme is responsive, dependency-free, and carries no tracking code.

Default
Clean and minimal, system fonts
Modern
Bold typography, vibrant accents
Classic
Traditional serif, timeless
Sky
Social feed with image mosaics

Those four are included. Mono, Editorial and Zine are optional one-time purchases in the same gallery, with Restore Purchases there if you've bought one before. Publishing itself is never paywalled. See all seven →

Under Site Settings → Site → Profile Images you can set two pictures for the site itself:

Avatar
A square image for the site's header. Used by themes that show one — Sky does.
Banner
A wide image behind or above the header, again for themes that use it.

Themes that don't use profile images ignore them rather than cropping them oddly; the settings screen tells you which case you're in.

08 — PREVIEW & PUBLISH

See it, then send it

There are two previews, and they're both honest — the same renderer draws the preview and the published page, so what you see is what uploads.

①

The post preview — the eye button in the composer. One post, rendered as it will appear, without leaving what you're writing.

②

The site preview — after generating, Preview Site opens the whole built site, linked pages and all, before anything leaves your device.

Tap Publish Site and the sheet walks a fixed path:

  1. 01Generate Site — Selfish renders every published post and page into a complete static site on your device. Drafts are counted and called out, not included.
  2. 02Check it — preview the built site, share the files, or (on Mac) reveal them in the Finder. Nothing has been uploaded yet.
  3. 03Upload — the button names your target: Upload to SFTP Server, Upload to S3 Storage, Deploy to Netlify, Deploy to Cloudflare Pages, or Publish to GitHub Pages. A live log and a per-file progress bar run while it works, and Cancel Upload stops it.
  4. 04You're live — with a link straight to the site.
▸ generating static site…
▸ 142 pages rendered · sitemap.xml · feed.xml
▸ uploading ████████████ 100%
live at https://fieldnotes.example

Haven't set up a host yet? The sheet says so and offers Configure Publishing to Upload — you can still generate, preview, and share the files. Use Test Connection in Site Settings before your first publish; it checks credentials and target, and on SFTP it checks and creates the remote path.

Five ways out
SFTP to your own server, any S3-compatible storage, Netlify, Cloudflare Pages, or GitHub Pages. Each site remembers its own, and you can switch whenever you like. Field-by-field setup →

What gets built

This is your site — plain files, no database, nothing that needs patching. It's worth knowing the shape, because it's yours to move anywhere.

PATH
WHAT IT IS
index.html
The front page, listing your published posts newest first.
posts/
One HTML file per published post, named by its slug.
pages/
One file per published page.
categories/ · tags/
An archive page per category and per tag that has posts.
media/
Every attached photo, video and audio file, already optimised.
style.css
Your theme. One file, no dependencies, no fonts phoning home.
sitemap.xml
For search engines. Needs your Site URL to be set.
feed.xml · feed.json
RSS and JSON Feed, posts only. Also need the Site URL.

Post pages carry meta descriptions plus OpenGraph and Twitter Card tags, so links to them unfurl properly in messages and social apps. On S3, Netlify, Cloudflare Pages and GitHub Pages, files that haven't changed are skipped on a repeat publish — a photo-heavy site republishes quickly. SFTP uploads what it's given.

09 — SEVERAL SITES & iCLOUD

More than one, on more than one device

Every site in Selfish is fully independent: its own posts, pages, categories, tags, theme, images, and publishing target. A personal blog, a project log, a photo journal, and a client's site can sit in one list without touching each other.

If you're signed in to iCloud, your sites sync across your own devices — start a post on the train, finish it at the desk. This runs through your iCloud account. There is no Selfish server, so there is no Selfish copy of your writing.

①

Sync needs iCloud Drive turned on and enough space in your account. With iCloud unavailable, Selfish keeps working, locally, and picks sync back up when it returns.

②

Photos, video and audio sync with their posts. On a second device a file may materialise the moment you first open the post that uses it.

③

Server credentials never sync. They live in the Keychain on the device that created them — set publishing up per device, or publish from the one that has it.

DELETING

Deleting a site removes it, its posts and its photos from the device and from iCloud, and it can't be undone. It does not touch anything already on your server — your published site keeps running. That's the ownership test, and Selfish is built to pass it.

10 — SHORTCUTS & SIRI

Capture without opening the app

Selfish ships a Shortcuts action, Create Draft, so a thought can reach the right site without you navigating to it.

PARAMETER
WHAT IT TAKES
Content
The text of the draft. Multi-line — dictation, a clipboard, another shortcut's output.
Title
(optional) Left empty, the draft is titled from its first line.
Site
Which of your sites to save it in.

Siri knows it too — "New Selfish draft", "Create a draft in Selfish", "Capture a note in Selfish". Everything captured this way is saved as a draft, always, so nothing reaches your site until you've read it back and set it to Published.

Good uses: a Home Screen button for quick notes, a shortcut that turns selected text into a draft, or an automation that files a daily prompt into a journal site.

11 — KEYBOARD SHORTCUTS

For Mac and iPad keyboards

KEYS
ACTION
⌘N
New post — or new page, when the Pages tab is selected.
⌘S
Save the post you're editing.
⌘⇧P
Open the publish sheet for the current site.
⌘,
Open Site Settings.
Esc
Cancel a sheet, or step back a screen in Site Settings.

On the Mac, right-click any site, post or page for its menu — including Delete. There's no swipe-to-delete on a Mac, so the context menu is the way.

12 — YOUR DATA

What Selfish does and doesn't hold

Worth stating plainly, because it shapes how the app behaves in several places above.

Your writing
Stored on your device, synced only through your own iCloud account. We never receive it.
Your credentials
SFTP passwords and SSH keys, S3 secret keys, Netlify, Cloudflare and GitHub tokens — all in the Apple Keychain, read fresh at each publish. Never in a database, never in a log, never synced by the app.
Your photos' metadata
Stripped at import. Location and timestamps don't reach the web.
Your readers
The generated site carries no analytics and no Selfish code. Nothing watches them on your behalf.
Your exit
The output is plain HTML. Delete the app and your site keeps serving.

If you'd like your site listed publicly among sites made with Selfish, there's Submit to the Directory in Site Settings → Site. It opens a pre-filled form in your browser; nothing is sent unless you submit it there, and entries are reviewed by hand. It's opt-in, once, and easy to ignore. See the directory →

13 — QUESTIONS & FIXES

The ones that come up

I published, but my new post isn't on the site
It's almost certainly still a Draft. Open the post's Details, set Status to Published, save, and publish again. The draft count on the Publish Site button tells you how many posts are being held back.
My photos came out smaller, and the location data is gone
Both are intentional and neither is reversible — Selfish keeps only the optimised copy. Your originals are untouched in your photo library; the web copy is the one that's been resized and scrubbed.
I renamed a post but its address didn't change
Slugs are fixed at first save so shared links keep working. Edit Slug in the post's Details to move it — and know that the old address will then 404 unless your host redirects it.
My RSS feed or sitemap is empty, or full of wrong links
Both are built from Site URL in Site Settings. If it's empty they aren't generated at all; if it's wrong, every link in them is wrong. Fix it and publish again.
A deleted post is still on my live site
Deleting locally removes it from the next build, but hosts differ on removing files that are no longer sent. Netlify, Cloudflare Pages and a whole-branch GitHub Pages publish drop them; SFTP and S3 leave the old file in place — delete it on the server yourself.
My theme changed back to Default on its own
That happens when a premium theme's purchase can't be verified at generation time — the site builds with Default and tells you. Restore purchases in the Theme gallery, or pick another theme.
My other device doesn't have my sites
Check both devices are signed into the same iCloud account with iCloud Drive on, and give the first sync a moment. Publishing credentials are a separate matter — those live in the Keychain and are set per device by design.
The upload itself failed
That's a connection problem rather than a content one. The publishing docs cover each route's failures — refused connections, authentication, permissions, changed host keys, expired tokens, and rate limits.
NEXT
Set up publishing, field by field
→