Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
2313338
Render catalog, fee category, and shortcut page words from MDX
Oct 9, 2026
ea48657
Rewrite the DNS lookup, domain age, RAID, and MRR pages in MDX
Oct 9, 2026
204b076
Rewrite the chmod calculator page in MDX
Oct 9, 2026
57538e8
Move 19 rewritten tool pages to MDX with the same words
Oct 9, 2026
1c6a8d6
Mark the content pass in progress in the plan
Oct 9, 2026
9729443
Keep page words, titles, and search fields when record scripts run
Oct 9, 2026
c73e619
Rewrite the six other DNS tool pages in MDX
Oct 9, 2026
b0df532
Rewrite the nine other domain tool pages in MDX
Oct 9, 2026
61cfd4e
Rewrite the nine other SaaS calculator pages in MDX
Oct 9, 2026
e487ed3
Rewrite the twelve other storage tool pages in MDX
Oct 9, 2026
81cde15
Rewrite the developer and self-host tool pages in MDX
Oct 9, 2026
1e9f5ef
Rewrite the six hardware directory pages in MDX
Oct 9, 2026
ddec331
Rewrite the keyboard shortcuts hub and six app intros in MDX
Oct 9, 2026
1357850
Give 66 keyboard shortcut pages their own intros (7-Zip to FileZilla)
Oct 9, 2026
3b5c0b5
Give 76 keyboard shortcut pages their own intros (Numbers to Zulip)
Oct 9, 2026
686e5c0
Give 70 keyboard shortcut pages their own intros (Final Cut Pro to No…
Oct 9, 2026
e0e798f
Rewrite the TLD, EPP, terminal app, self-host app, and license pages …
Oct 9, 2026
2b91da1
Rewrite launch directories, platform fees, and the eight fee categori…
Oct 9, 2026
664aea7
Rewrite the eight tool catalog pages in MDX
Oct 9, 2026
bb4769f
Open source links in a new tab on the licenses and launch pages again
Oct 9, 2026
eaa9590
Apply the content audit fixes
Oct 9, 2026
cb6943a
Add record readiness checks for three database directories
Oct 9, 2026
fccdcb8
Keep the new readiness checks to one SELECT each
Oct 9, 2026
8196390
Count only listed apps in the self-host readiness check
Oct 9, 2026
d36bc26
Mark the content pass written and reviewed in the plan
Oct 9, 2026
f5c93be
Merge remote-tracking branch 'origin/main' into content/page-rewrite
Oct 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test a config before you run it on a real system: file permissions, `.dockerignore` and Compose files, LXC ID mappings, and rsync filters. Paste your own rules and paths to see what each line does. The checks run in your browser and don't touch your files.
13 changes: 13 additions & 0 deletions app/(site)/(catalogs)/[slug]/content/dns-tools/article.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
## Which DNS tool do I need?

Pick the row that matches what you're seeing.

| What's happening | Tool to use |
| --- | --- |
| You want to see a record's current value, such as an A, MX, or TXT record | [DNS lookup](/dns-lookup) |
| You changed a record, and some people still get the old one | [DNS change checker](/dns-change-checker) |
| The domain doesn't resolve, or fails only some of the time | [Nameserver checker](/nameserver-checker), then [DNS trace](/dns-trace) to see where the lookup stops |
| Lookups fail with SERVFAIL after you turned on DNSSEC or moved DNS | [DNSSEC checker](/dnssec-checker) |
| Your nameservers give different answers for the same record | [SOA checker](/soa-checker) |
| A certificate authority won't issue a certificate for your domain | [CAA checker](/caa-checker) |
| The domain may be on hold or near expiry, or you want registration and DNS checked together | [Domain report](/domain-report) |
1 change: 1 addition & 0 deletions app/(site)/(catalogs)/[slug]/content/dns-tools/intro.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Look up a domain's DNS records, check whether a change has gone live, and find the setting that stops a website, email, or certificate from working. Not sure which tool you need? Start with [DNS lookup](/dns-lookup), or match your problem in the table below the tools.
33 changes: 33 additions & 0 deletions app/(site)/(catalogs)/[slug]/content/domain-tools/article.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
## Which domain tool do I need?

Find the question you're asking.

| Your question | Tool to use |
| --- | --- |
| What does the full registration record say? | [Domain lookup](/domain-lookup) |
| How old is this domain? | [Domain age checker](/domain-age) |
| When does it expire, and what happens then? | [Domain expiry checker](/domain-expiry) |
| Can I register this name? | [Domain availability](/domain-availability), or [multi-TLD availability](/multi-tld-availability) to try several endings |
| Who owns it, and how do I reach them? | [Registrant lookup](/domain-owner) |
| Which registrar is it with, and where do I report abuse? | [Registrar lookup](/domain-registrar) |
| Can I move it to another registrar? | [Transfer readiness](/transfer-readiness) |
| It's registered, so why isn't it working? | [Domain report](/domain-report) |
| What does a status such as `clientHold` mean? | [EPP status codes](/epp-status-codes) |
| How do I write a name with accents or non-Latin letters? | [Punycode converter](/punycode-converter) |
| What DNS records does it have? | [DNS lookup](/dns-lookup) |

## Is WHOIS still used?

Mostly not. ICANN stopped requiring WHOIS for most generic endings, such as `.org`, on 28 January 2025, and RDAP replaced it. People still call it a WHOIS lookup, but the lookup tools here read RDAP only. The [domain lookup](/domain-lookup) page explains how the two differ.

## Can every domain ending be looked up?

No. Some endings, mostly country endings, don't publish RDAP. For those, the tools say they can't check the name, which doesn't mean it's free. The [TLD directory](/tld-directory) shows which endings can be looked up and links each registry.

## Can I see who owned a domain before?

No. RDAP returns only the current record, with no past owners or old nameservers. Sites that show history use copies they saved over time.

## What happens to the names I look up?

The name goes from stack127 to the registry, and to the registrar that holds it. stack127 keeps saved answers by domain name, not linked to you. A result can be a saved answer up to 24 hours old, and it shows when it was fetched.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Check a domain's registration: who holds it and through which registrar, when it was created and when it expires, whether a name is free, and what could block a transfer. Answers come from the registry and registrar for the domain's ending. Not sure which tool you need? Find your question in the table below the tools.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Plan and check a self-hosted server: whether your apps fit its RAM and disk, which ports NFS needs open, what URL nginx passes to your app, and who an IP address is registered to. Have the values from your server or config ready.
26 changes: 26 additions & 0 deletions app/(site)/(catalogs)/[slug]/content/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import type { MDXContent } from "mdx/types";
import DeveloperToolsIntro from "./developer-tools/intro.mdx";
import DnsToolsArticle from "./dns-tools/article.mdx";
import DnsToolsIntro from "./dns-tools/intro.mdx";
import DomainToolsArticle from "./domain-tools/article.mdx";
import DomainToolsIntro from "./domain-tools/intro.mdx";
import HostingCloudToolsIntro from "./hosting-cloud-tools/intro.mdx";
import KdpToolsArticle from "./kdp-tools/article.mdx";
import KdpToolsIntro from "./kdp-tools/intro.mdx";
import ProductivityToolsIntro from "./productivity-tools/intro.mdx";
import SaasToolsArticle from "./saas-tools/article.mdx";
import SaasToolsIntro from "./saas-tools/intro.mdx";
import StorageToolsArticle from "./storage-tools/article.mdx";
import StorageToolsIntro from "./storage-tools/intro.mdx";

/** Each catalog's own words, keyed by its slug. Add an entry before a catalog is published. */
export const catalogContent: Record<string, { Intro: MDXContent; Article?: MDXContent }> = {
"developer-tools": { Intro: DeveloperToolsIntro },
"dns-tools": { Intro: DnsToolsIntro, Article: DnsToolsArticle },
"domain-tools": { Intro: DomainToolsIntro, Article: DomainToolsArticle },
"hosting-cloud-tools": { Intro: HostingCloudToolsIntro },
"kdp-tools": { Intro: KdpToolsIntro, Article: KdpToolsArticle },
"productivity-tools": { Intro: ProductivityToolsIntro },
"saas-tools": { Intro: SaasToolsIntro, Article: SaasToolsArticle },
"storage-tools": { Intro: StorageToolsIntro, Article: StorageToolsArticle },
};
17 changes: 17 additions & 0 deletions app/(site)/(catalogs)/[slug]/content/kdp-tools/article.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## Which KDP tool do I need?

Find the step you're on.

| What you're doing | Tools to use |
| --- | --- |
| Estimating how many pages your print book will have | [KDP page count estimator](/kdp-page-count-estimator) |
| Sizing the cover, spine, page, and margins | [KDP book setup calculator](/kdp-book-setup-calculator) |
| Checking that an image is sharp enough to print | [KDP image DPI checker](/kdp-image-dpi-checker), [pixels to print size](/pixels-to-print-size-calculator) |
| Checking an interior or cover PDF before upload | [KDP PDF preflight checker](/kdp-pdf-preflight-checker) |
| Writing the title, description, and keywords | [KDP book title analyzer](/kdp-book-title-analyzer), [KDP description formatter](/kdp-book-description-formatter), [KDP keywords builder](/kdp-backend-keywords-builder) |
| Checking the listing before you enter it in KDP | [KDP metadata checker](/kdp-metadata-checker) |
| Choosing a list price | [KDP minimum list price](/kdp-minimum-list-price-calculator), [KDP print price and profit](/kdp-price-profit-calculator) |
| Working out what you earn per sale | [KDP royalty calculator](/kdp-royalty-calculator) |
| Setting a bid for Amazon ads | [KDP book ads bid check](/kdp-break-even-acos-calculator) |
| Estimating Kindle Unlimited earnings | [Kindle Unlimited KENP earnings](/kindle-unlimited-kenp-earnings-calculator) |
| Finding out when KDP will pay you | [KDP payment date calculator](/kdp-payment-date-calculator) |
1 change: 1 addition & 0 deletions app/(site)/(catalogs)/[slug]/content/kdp-tools/intro.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Tools for Amazon KDP authors: size your pages and cover, check your files and listing, price the book, and see what you'll earn and when. Not sure which one you need? Find your step in the table below the tools.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Pick the apps you use and print one keyboard shortcut cheat sheet with only the actions you want. To browse every shortcut for one app, use the [keyboard shortcuts directory](/keyboard-shortcuts).
16 changes: 16 additions & 0 deletions app/(site)/(catalogs)/[slug]/content/saas-tools/article.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
## Which SaaS calculator do I need?

Find the question you're asking.

| Your question | Calculator to use |
| --- | --- |
| How did this month go overall? | [SaaS metrics calculator](/saas-metrics-calculator) |
| How much recurring revenue do I have? | [MRR calculator](/mrr-calculator), [ARR calculator](/arr-calculator) |
| What made MRR go up or down this month? | [MRR waterfall calculator](/mrr-waterfall-calculator) |
| How much does each customer pay on average? | [ARPU and ARPA calculator](/arpu-arpa-calculator) |
| How many customers did I lose? | [Customer churn calculator](/customer-churn-calculator) |
| How much revenue did I lose, or keep, from existing customers? | [Revenue churn calculator](/revenue-churn-calculator), [NRR calculator](/net-revenue-retention-calculator) |
| How much of my revenue is gross profit? | [SaaS gross margin](/saas-gross-margin-calculator) |
| How much MRR do I need to cover my costs? | [Break-even MRR](/break-even-mrr-calculator) |
| What does a new customer cost, and is it worth it? | [Customer acquisition cost](/customer-acquisition-cost-calculator), [customer lifetime value](/customer-lifetime-value-calculator), [LTV to CAC](/ltv-cac-calculator), [CAC payback](/cac-payback-calculator) |
| How much cash am I burning for each dollar of new ARR? | [Burn multiple calculator](/burn-multiple-calculator) |
1 change: 1 addition & 0 deletions app/(site)/(catalogs)/[slug]/content/saas-tools/intro.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Calculators for subscription businesses: recurring revenue, churn and retention, margins, and what it costs to win a customer. Enter your own figures. Not sure which metric answers your question? Find it in the table below the tools.
19 changes: 19 additions & 0 deletions app/(site)/(catalogs)/[slug]/content/storage-tools/article.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
## Which storage tool do I need?

Find the question you're asking.

| Your question | Tool to use |
| --- | --- |
| Which layout should I build with my drives? | [Storage layout advisor](/storage-layout-advisor) |
| How much space will this RAID level give me? | [RAID calculator](/raid-calculator) |
| How much space will my ZFS pool have? | [ZFS capacity calculator](/zfs-capacity-calculator) |
| Why does RAIDZ use more space than I expected? | [ZFS padding calculator](/zfs-padding-calculator) |
| What do I gain by adding a disk to a RAIDZ vdev? | [RAIDZ expansion planner](/raidz-expansion-planner) |
| How much space will my Synology, Unraid, or Ceph setup have? | [SHR calculator](/shr-calculator), [Unraid calculator](/unraid-calculator), [Ceph capacity calculator](/ceph-capacity-calculator) |
| How do I set up SnapRAID with mergerfs? | [SnapRAID and mergerfs planner](/snapraid-mergerfs-planner) |
| Which drive models fail least? | [Drive reliability explorer](/drive-reliability) |
| How long will a rebuild take, and how risky is it? | [RAID rebuild calculator](/rebuild-calculator) |
| When will I run out of space? | [Storage growth planner](/storage-growth-planner) |
| How much backup storage do I need? | [3-2-1 backup calculator](/backup-321-calculator) |
| Which snapshots will my restic policy keep? | [Restic retention simulator](/restic-retention-simulator) |
| Which ports does an NFS share need open? | [NFS firewall rules](/nfs-firewall-rules) |
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Plan a storage array or backup before you buy drives: usable space, how many drives can fail, rebuild risk, growth, and backup size. Enter the drives and layout you plan to run. Not sure where to start? Use the [storage layout advisor](/storage-layout-advisor), or find your question in the table below the tools.
87 changes: 0 additions & 87 deletions app/(site)/(catalogs)/[slug]/domain-catalog-reference.tsx

This file was deleted.

13 changes: 7 additions & 6 deletions app/(site)/(catalogs)/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,22 @@ import { PageCanvas } from "@/app/ui/site/page-canvas";
import { PageHeader } from "@/app/ui/site/page-header";
import { PageMeta } from "@/app/ui/site/page-meta";
import { PageTitleIcon } from "@/app/ui/site/page-title-icon";
import { ContentMarkdown } from "@/app/ui/content-markdown";
import { DirectoryPageTitle } from "@/app/ui/directories/directory-page-content";
import { proseClassName, proseFlowClassName } from "@/app/ui/site/prose";
import { ToolCatalog } from "@/app/ui/catalogs/tool-catalog";
import { ToolCatalogSidebar } from "@/app/ui/catalogs/tool-catalog-sidebar";
import { DomainCatalogReference } from "./domain-catalog-reference";
import { cardArt } from "@/lib/card-art";
import { cardIcon } from "@/lib/card-icons";
import { getPublishedToolCatalog } from "@/lib/tool-catalogs";
import { catalogContent } from "./content";

export default async function ToolCatalogPage({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const catalog = await getPublishedToolCatalog(slug);
if (!catalog) notFound();
const content = catalogContent[slug];
if (!content) throw new Error(`Published catalog has no content: ${slug}`);
const { Intro, Article } = content;
const Icon = cardIcon(catalog.card_icon_key);

return (
Expand All @@ -35,16 +37,15 @@ export default async function ToolCatalogPage({ params }: { params: Promise<{ sl
<DirectoryPageTitle title={catalog.title} />
</h1>
<PageMeta updatedAt={catalog.updated_at} />
<ContentMarkdown markdown={catalog.intro_markdown} />
<Intro />
</PageHeader>
</EntryHero>
<PageCanvas>
<ToolCatalog heading="Tools" tools={catalog.tools} />
{slug === "domain-tools" ? <DomainCatalogReference /> : null}
</PageCanvas>
{catalog.content_markdown ? (
{Article ? (
<PageCanvas as="article" reading className={`${proseClassName} ${proseFlowClassName}`}>
<ContentMarkdown markdown={catalog.content_markdown} />
<Article />
</PageCanvas>
) : null}
</AppShell>
Expand Down
5 changes: 5 additions & 0 deletions app/(site)/(directories)/cli-apps/content/checks.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
## How are apps chosen and checked?

Each app is checked against its official repository or website, and we write its summary ourselves. The verified date on an app is when we last did that. Lists such as [Terminal Trove](https://terminaltrove.com/list/) and [awesome-cli-apps](https://github.com/agarrharr/awesome-cli-apps) help us find apps we missed, but their descriptions aren't copied.

When a fact isn't published, such as a license or a release date, the app shows "unknown" instead of a guess.
15 changes: 15 additions & 0 deletions app/(site)/(directories)/cli-apps/content/health.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
## What do the health labels mean?

Health shows how recently the project's code changed when we reviewed it.

| Health | Meaning |
| --- | --- |
| Active | Code pushed in the 110 days before review |
| Slow | Last push 110 to 395 days before review |
| Stale | No push for more than 395 days before review |
| Archived | The repository is archived on GitHub |
| Unknown | Not set at review |

Health changes when we review an app again, except Archived, which shows as soon as our GitHub data marks the repository archived. Stars and the last commit date also come from that data and can be newer than the review, so the last commit date is the fresher sign of activity.

Most popular sorts by star count. Apps with no star count sort last.
1 change: 1 addition & 0 deletions app/(site)/(directories)/cli-apps/content/intro.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Command-line tools, TUI apps, shells, prompts, and AI agents that run in a terminal. Search for an app or a job, such as "git" or "disk usage", or filter by category, platform, and install method. Open an app to see its official links, license, and the date we last checked it.
11 changes: 11 additions & 0 deletions app/(site)/(directories)/cli-apps/content/source-model.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## What does the source model mean?

It says whether you can read and change the code.

| Source model | Meaning |
| --- | --- |
| Open source | Under a license that lets you use, change, and share the code |
| Source available | You can read the code, but the license limits use or sharing |
| Closed source | The code isn't public |

Free to use and open source aren't the same thing, so check Pricing too. For what common licenses allow, see [software licenses for self-hosting](/software-licenses-for-self-hosting).
3 changes: 3 additions & 0 deletions app/(site)/(directories)/cli-apps/content/types.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
## What is the difference between a CLI tool and a TUI app?

A CLI tool takes a command and prints a result, like `ripgrep` searching files. A TUI app draws a full-screen interface you move around with the keyboard, like `lazygit`. The App type filter also covers shells, prompts, multiplexers, terminal emulators, and AI agents, and an app can have more than one type.
Loading
Loading