diff --git a/app/(site)/(catalogs)/[slug]/content/developer-tools/intro.mdx b/app/(site)/(catalogs)/[slug]/content/developer-tools/intro.mdx new file mode 100644 index 00000000..e268ad1b --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/developer-tools/intro.mdx @@ -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. diff --git a/app/(site)/(catalogs)/[slug]/content/dns-tools/article.mdx b/app/(site)/(catalogs)/[slug]/content/dns-tools/article.mdx new file mode 100644 index 00000000..21dfc0fd --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/dns-tools/article.mdx @@ -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) | diff --git a/app/(site)/(catalogs)/[slug]/content/dns-tools/intro.mdx b/app/(site)/(catalogs)/[slug]/content/dns-tools/intro.mdx new file mode 100644 index 00000000..01b11c0e --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/dns-tools/intro.mdx @@ -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. diff --git a/app/(site)/(catalogs)/[slug]/content/domain-tools/article.mdx b/app/(site)/(catalogs)/[slug]/content/domain-tools/article.mdx new file mode 100644 index 00000000..a9d33d05 --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/domain-tools/article.mdx @@ -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. diff --git a/app/(site)/(catalogs)/[slug]/content/domain-tools/intro.mdx b/app/(site)/(catalogs)/[slug]/content/domain-tools/intro.mdx new file mode 100644 index 00000000..e29aebd6 --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/domain-tools/intro.mdx @@ -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. diff --git a/app/(site)/(catalogs)/[slug]/content/hosting-cloud-tools/intro.mdx b/app/(site)/(catalogs)/[slug]/content/hosting-cloud-tools/intro.mdx new file mode 100644 index 00000000..3ab4f793 --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/hosting-cloud-tools/intro.mdx @@ -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. diff --git a/app/(site)/(catalogs)/[slug]/content/index.ts b/app/(site)/(catalogs)/[slug]/content/index.ts new file mode 100644 index 00000000..3c37f306 --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/index.ts @@ -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 = { + "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 }, +}; diff --git a/app/(site)/(catalogs)/[slug]/content/kdp-tools/article.mdx b/app/(site)/(catalogs)/[slug]/content/kdp-tools/article.mdx new file mode 100644 index 00000000..7a557747 --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/kdp-tools/article.mdx @@ -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) | diff --git a/app/(site)/(catalogs)/[slug]/content/kdp-tools/intro.mdx b/app/(site)/(catalogs)/[slug]/content/kdp-tools/intro.mdx new file mode 100644 index 00000000..336f93f5 --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/kdp-tools/intro.mdx @@ -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. diff --git a/app/(site)/(catalogs)/[slug]/content/productivity-tools/intro.mdx b/app/(site)/(catalogs)/[slug]/content/productivity-tools/intro.mdx new file mode 100644 index 00000000..c8c6cee7 --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/productivity-tools/intro.mdx @@ -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). diff --git a/app/(site)/(catalogs)/[slug]/content/saas-tools/article.mdx b/app/(site)/(catalogs)/[slug]/content/saas-tools/article.mdx new file mode 100644 index 00000000..3bf6930e --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/saas-tools/article.mdx @@ -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) | diff --git a/app/(site)/(catalogs)/[slug]/content/saas-tools/intro.mdx b/app/(site)/(catalogs)/[slug]/content/saas-tools/intro.mdx new file mode 100644 index 00000000..1c446320 --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/saas-tools/intro.mdx @@ -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. diff --git a/app/(site)/(catalogs)/[slug]/content/storage-tools/article.mdx b/app/(site)/(catalogs)/[slug]/content/storage-tools/article.mdx new file mode 100644 index 00000000..0372da24 --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/storage-tools/article.mdx @@ -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) | diff --git a/app/(site)/(catalogs)/[slug]/content/storage-tools/intro.mdx b/app/(site)/(catalogs)/[slug]/content/storage-tools/intro.mdx new file mode 100644 index 00000000..813d5d3b --- /dev/null +++ b/app/(site)/(catalogs)/[slug]/content/storage-tools/intro.mdx @@ -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. diff --git a/app/(site)/(catalogs)/[slug]/domain-catalog-reference.tsx b/app/(site)/(catalogs)/[slug]/domain-catalog-reference.tsx deleted file mode 100644 index 1bf302be..00000000 --- a/app/(site)/(catalogs)/[slug]/domain-catalog-reference.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import Link from "next/link"; -import { coverageSummary } from "@/lib/domain/bootstrap.ts"; -import { proseSectionFlowClassName } from "@/app/ui/site/prose"; - -export function DomainCatalogReference() { - const coverage = coverageSummary(); - return ( - <> -
-

Domain references

-

- Use the domain status code reference to understand - registry and registrar locks. The TLD directory shows - which domain endings have RDAP and DNSSEC support. -

-
-
- -
-
-

Is WHOIS still a thing?

-

- Not really, and that is worth knowing before you trust an old tool. WHOIS - was a plain text service that answered on port 43, and ICANN stopped - requiring registries and registrars to run it on 28 January 2025. It has - been replaced by RDAP, which returns properly structured data over a secure - connection. -

-

- Most people still call it a WHOIS lookup, and that is fine. What matters is - that RDAP carries information the old format could not, including a - machine-readable list of exactly which contact fields a registrar withheld. - Every tool here reads RDAP. -

-

- One thing that trips everybody up: there are two servers holding two - different records, and they do not say the same things. The registry runs - the ending and is the authority on dates, status codes, nameservers and - DNSSEC. The registrar is the company the domain was bought through, and for - most endings it is the only party holding any contact details. -

-

- you - - registry - - registrar -

-
- -
-

Which domain extensions can be looked up?

-

- Not every ending publishes RDAP. Of the {coverage.rootZoneTlds.toLocaleString("en-US")} endings in - the root zone, {coverage.covered.toLocaleString("en-US")} are ones we can - look up, using the official IANA directory plus a small reviewed list of - registries that run RDAP without being listed there. The - remaining {coverage.uncovered.toLocaleString("en-US")} we cannot check at - all, and the tools say so rather than showing you a blank that looks like - an answer. The{" "} - TLD directory lists every one, - and it was last refreshed on {coverage.checkedAt}. -

-

- None of these tools can show you history. RDAP returns the current state of - a record and nothing else, so there is no previous owner, no past - nameserver, and no record of what changed last week. Anything claiming - otherwise is selling you an archive someone built by saving daily copies. -

-
- -
-

Are these domain lookups private?

-

- The name you enter is sent to the registry and registrar that operate that - ending. There is no way around that, since they are the ones holding the - answer. On our side we keep the registry's answer for a short while so - that repeated lookups do not hammer them, and that cached answer is stored - against the domain name only. Your address is used briefly to stop one - person overloading the tools, it is never written next to a lookup, and we - do not build any record of who searched for what. -

-
-
- - ); -} diff --git a/app/(site)/(catalogs)/[slug]/page.tsx b/app/(site)/(catalogs)/[slug]/page.tsx index d967b4e2..24e71586 100644 --- a/app/(site)/(catalogs)/[slug]/page.tsx +++ b/app/(site)/(catalogs)/[slug]/page.tsx @@ -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 ( @@ -35,16 +37,15 @@ export default async function ToolCatalogPage({ params }: { params: Promise<{ sl - + - {slug === "domain-tools" ? : null} - {catalog.content_markdown ? ( + {Article ? ( - +
) : null} diff --git a/app/(site)/(directories)/cli-apps/content/checks.mdx b/app/(site)/(directories)/cli-apps/content/checks.mdx new file mode 100644 index 00000000..e56a946b --- /dev/null +++ b/app/(site)/(directories)/cli-apps/content/checks.mdx @@ -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. diff --git a/app/(site)/(directories)/cli-apps/content/health.mdx b/app/(site)/(directories)/cli-apps/content/health.mdx new file mode 100644 index 00000000..0bc8c22d --- /dev/null +++ b/app/(site)/(directories)/cli-apps/content/health.mdx @@ -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. diff --git a/app/(site)/(directories)/cli-apps/content/intro.mdx b/app/(site)/(directories)/cli-apps/content/intro.mdx new file mode 100644 index 00000000..84043546 --- /dev/null +++ b/app/(site)/(directories)/cli-apps/content/intro.mdx @@ -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. diff --git a/app/(site)/(directories)/cli-apps/content/source-model.mdx b/app/(site)/(directories)/cli-apps/content/source-model.mdx new file mode 100644 index 00000000..f9aa620b --- /dev/null +++ b/app/(site)/(directories)/cli-apps/content/source-model.mdx @@ -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). diff --git a/app/(site)/(directories)/cli-apps/content/types.mdx b/app/(site)/(directories)/cli-apps/content/types.mdx new file mode 100644 index 00000000..e543c8f6 --- /dev/null +++ b/app/(site)/(directories)/cli-apps/content/types.mdx @@ -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. diff --git a/app/(site)/(directories)/cli-apps/page.tsx b/app/(site)/(directories)/cli-apps/page.tsx index f267cbc7..73e290c8 100644 --- a/app/(site)/(directories)/cli-apps/page.tsx +++ b/app/(site)/(directories)/cli-apps/page.tsx @@ -1,7 +1,6 @@ import { getRequiredDirectoryPage } from "@/lib/directory-pages"; -import { DirectoryPageTitle, DirectoryPageContent } from "@/app/ui/directories/directory-page-content"; +import { DirectoryPageTitle } from "@/app/ui/directories/directory-page-content"; import { PageMeta } from "@/app/ui/site/page-meta"; -import { ContentMarkdown } from "@/app/ui/content-markdown"; import { PageCanvas } from "@/app/ui/site/page-canvas"; import { getRequiredPublishedPage } from "@/lib/page-registry"; import { @@ -23,6 +22,12 @@ import { HiddenDetails } from "@/app/ui/directories/hidden-details"; import { cliAppPageSize, installLabels, labelForValue, platformOptions } from "./cli-app-options"; import { CliAppFilters, CliAppResults } from "./cli-app-view"; import { sortApps } from "./filters"; +import { proseClassName, proseSectionFlowClassName } from "@/app/ui/site/prose"; +import Checks from "./content/checks.mdx"; +import Health from "./content/health.mdx"; +import Intro from "./content/intro.mdx"; +import SourceModel from "./content/source-model.mdx"; +import Types from "./content/types.mdx"; const typeLabels = new Map(terminalAppTypeLabels); @@ -137,14 +142,27 @@ export default async function CliAppsPage() {

{" "}

- +
} /> ({ slug: app.slug, name: app.name, body: }))} /> - - +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ ); diff --git a/app/(site)/(directories)/epp-status-codes/content/bad-sign.mdx b/app/(site)/(directories)/epp-status-codes/content/bad-sign.mdx index 96c7ea97..a723bc23 100644 --- a/app/(site)/(directories)/epp-status-codes/content/bad-sign.mdx +++ b/app/(site)/(directories)/epp-status-codes/content/bad-sign.mdx @@ -1,5 +1,9 @@ ## Are status codes on my domain a bad sign? -Usually not. A healthy domain normally carries at least one, and `clientTransferProhibited` is the default lock most registrars apply precisely because it protects you from an unauthorised transfer. Seeing it is a good sign, not a problem to fix. +Usually not. Every domain carries at least one, and `clientTransferProhibited` is a lock most registrars turn on by default to stop unauthorized transfers. -The ones actually worth acting on are the two hold codes, anything starting with `server`, and the lifecycle codes that mean a domain is on its way out. Everything else is either informational or something that clears on its own. +Look into these: + +- `clientHold` or `serverHold`, because the site is offline. +- Any code starting with `server`, because only the registry can remove it, so find out why it's there. +- `autoRenewPeriod`, `redemptionPeriod`, or `pendingDelete`, because the domain is close to being lost. diff --git a/app/(site)/(directories)/epp-status-codes/content/client-and-server.mdx b/app/(site)/(directories)/epp-status-codes/content/client-and-server.mdx index 2e0e7698..2a6512e6 100644 --- a/app/(site)/(directories)/epp-status-codes/content/client-and-server.mdx +++ b/app/(site)/(directories)/epp-status-codes/content/client-and-server.mdx @@ -1,7 +1,7 @@ ## What is the difference between client and server status codes? -This is the useful split. Codes starting with `client` were set by your registrar, which means there is usually a switch in your account that turns them off. Codes starting with `server` were set by the registry that runs the ending, and no amount of clicking in your account will move them. If you are stuck, that prefix tells you whether to look in your own settings or pick up the phone. +The prefix tells you who set the code and who can remove it. -`client…` → your registrar, usually yours to change +`client…` → Your registrar. You can usually turn it off in your account. -`server…` → the registry, not yours to change +`server…` → The registry that runs the ending. Only your registrar can ask it to remove the code. diff --git a/app/(site)/(directories)/epp-status-codes/content/intro.mdx b/app/(site)/(directories)/epp-status-codes/content/intro.mdx index bfaa4867..a292516b 100644 --- a/app/(site)/(directories)/epp-status-codes/content/intro.mdx +++ b/app/(site)/(directories)/epp-status-codes/content/intro.mdx @@ -1 +1 @@ -Every domain carries status codes, and they are usually why a transfer is refused, a site suddenly goes dark, or a registrar dashboard shows something alarming. They are written for software rather than people. Here is what each one means in plain terms, who set it, whether you can remove it yourself, and what to do about it. +Find a domain status code to see what it means, who set it, and what to do about it. The tables cover the standard EPP codes, grouped by what you can do about them. If your site went offline, look for `clientHold` or `serverHold` first. diff --git a/app/(site)/(directories)/epp-status-codes/content/related-tools.mdx b/app/(site)/(directories)/epp-status-codes/content/related-tools.mdx deleted file mode 100644 index ef41084a..00000000 --- a/app/(site)/(directories)/epp-status-codes/content/related-tools.mdx +++ /dev/null @@ -1,5 +0,0 @@ -## Related tools - -The [registration lookup](/domain-lookup) shows every status on a domain alongside the rest of its record. If you are specifically trying to move a domain, the [transfer readiness check](/transfer-readiness) works out which of these are actually in your way, and for the life cycle codes the [expiry checker](/domain-expiry) lays out the stages in order. - -ICANN also publishes [its own reference for these codes](https://www.icann.org/resources/pages/epp-status-codes-2014-06-16-en) , which is worth reading if you want the formal definitions rather than the practical ones. diff --git a/app/(site)/(directories)/epp-status-codes/content/see-your-codes.mdx b/app/(site)/(directories)/epp-status-codes/content/see-your-codes.mdx new file mode 100644 index 00000000..33268fb7 --- /dev/null +++ b/app/(site)/(directories)/epp-status-codes/content/see-your-codes.mdx @@ -0,0 +1,5 @@ +## How do I see the status codes on my domain? + +Enter the domain in [domain lookup](/domain-lookup). It lists each code on the domain with what it means. To move a domain, [transfer readiness](/transfer-readiness) shows which public codes could block it. For the expiry stages, use the [domain expiry checker](/domain-expiry). + +For the formal definitions, see [ICANN's EPP status codes page](https://www.icann.org/resources/pages/epp-status-codes-2014-06-16-en). diff --git a/app/(site)/(directories)/epp-status-codes/content/site-down.mdx b/app/(site)/(directories)/epp-status-codes/content/site-down.mdx index afccdf45..17b2b14e 100644 --- a/app/(site)/(directories)/epp-status-codes/content/site-down.mdx +++ b/app/(site)/(directories)/epp-status-codes/content/site-down.mdx @@ -1,5 +1,5 @@ -## My domain is registered but the site is down. Why? +## Why is my domain registered but my site down? -Check for `client hold` or `server hold` first. Those two tell the registry to stop publishing the domain, so nothing under it resolves at all, while the registration itself remains perfectly valid. People lose hours in DNS tools before finding it, because DNS is not the problem. `client hold` is nearly always unpaid invoices or an unverified contact address. +Check for a hold code first. `clientHold` and `serverHold` tell the registry to stop publishing the domain in DNS, so the site and email stop working while the registration stays valid. -The other one worth knowing: `inactive` means no nameservers are on record. It looks alarming and usually is not, it just means nothing has been pointed anywhere yet. +DNS tools will show that the domain doesn't resolve, but changing DNS records won't fix it. The hold has to come off at the registrar or registry. diff --git a/app/(site)/(directories)/epp-status-codes/content/two-spellings.mdx b/app/(site)/(directories)/epp-status-codes/content/two-spellings.mdx index 2d81dd22..18eec54f 100644 --- a/app/(site)/(directories)/epp-status-codes/content/two-spellings.mdx +++ b/app/(site)/(directories)/epp-status-codes/content/two-spellings.mdx @@ -1,5 +1,5 @@ -## Why is the same code written two different ways? +## Why is the same code written two ways? -You will see these in two spellings and they are the same thing. Your registrar and older tools show `clientTransferProhibited`. The modern registry data shows `client transfer prohibited`. Nothing has changed except the formatting, so both are listed below. +They're the same code in two formats. Registrars and WHOIS show the EPP spelling, such as `clientTransferProhibited`. RDAP, the newer lookup protocol, writes `client transfer prohibited`. The tables show both. -One that trips people up: `ok` and `active` are also the same status, not two different ones. +One pair doesn't match by spelling: EPP's `ok` is RDAP's `active`. diff --git a/app/(site)/(directories)/epp-status-codes/content/why-it-was-set.mdx b/app/(site)/(directories)/epp-status-codes/content/why-it-was-set.mdx index e01eb2d8..a86e1366 100644 --- a/app/(site)/(directories)/epp-status-codes/content/why-it-was-set.mdx +++ b/app/(site)/(directories)/epp-status-codes/content/why-it-was-set.mdx @@ -1,5 +1,5 @@ ## Why was this status code set on my domain? -Why it was set. `server transfer prohibited` could be a trademark dispute, a court order, a registry security action, or a lock you asked for yourself and forgot about. The code carries no reason and the reason is not published anywhere public. Your registrar can usually find out. +The code doesn't say, and the reason isn't public. `serverTransferProhibited`, for example, can come from a dispute, a court order, a registry security action, or a lock you asked for and forgot. Your registrar can usually find out. -Registries occasionally publish codes that are entirely their own invention and appear in no standard. Those are shown exactly as the registry returned them, marked as having no explanation available, rather than being matched to something plausible-looking. If you hit one, the registry that runs the ending is the only place it is documented. +Some registries return codes outside the standard set. [Domain lookup](/domain-lookup) shows them as returned, with no explanation, because only that registry's own documentation defines them. diff --git a/app/(site)/(directories)/epp-status-codes/page.tsx b/app/(site)/(directories)/epp-status-codes/page.tsx index 6764c694..f5955f62 100644 --- a/app/(site)/(directories)/epp-status-codes/page.tsx +++ b/app/(site)/(directories)/epp-status-codes/page.tsx @@ -14,7 +14,7 @@ import { proseSectionFlowClassName } from "../../../ui/site/prose"; import BadSign from "./content/bad-sign.mdx"; import ClientAndServer from "./content/client-and-server.mdx"; import Intro from "./content/intro.mdx"; -import RelatedTools from "./content/related-tools.mdx"; +import SeeYourCodes from "./content/see-your-codes.mdx"; import SiteDown from "./content/site-down.mdx"; import TwoSpellings from "./content/two-spellings.mdx"; import WhyItWasSet from "./content/why-it-was-set.mdx"; @@ -38,16 +38,6 @@ const GROUP_PILL: Record = { const GROUP_ORDER: StatusGroup[] = ["normal", "registrar_lock", "registry_lock", "in_progress", "lifecycle"]; -const GROUP_INTRO: Record = { - normal: "Nothing to do. These are what a healthy domain looks like.", - registrar_lock: - "Your registrar put these on. That matters, because it usually means you can take them off yourself from your account.", - registry_lock: - "The registry that runs the ending put these on. You cannot remove them yourself, and the route is through your registrar.", - in_progress: "Something is part way through. These clear on their own once the registry finishes.", - lifecycle: "Where the domain sits between being registered and being released.", -}; - /** A paragraph written as `client…` → meaning renders as one source-path row. */ function SourcePathParagraph({ children, ...props }: ComponentPropsWithoutRef<"p">) { const [code, description] = Array.isArray(children) ? children : []; @@ -78,25 +68,12 @@ export default async function EppStatusCodesPage() {
-
- -
- -
- -
- -
- -
- {GROUP_ORDER.map((group) => (

{STATUS_GROUP_TITLES[group]}

{GROUP_PILL[group]}
-

{GROUP_INTRO[group]}

@@ -137,7 +114,7 @@ export default async function EppStatusCodesPage() { ))}
- +
@@ -145,7 +122,19 @@ export default async function EppStatusCodesPage() {
- + +
+ +
+ +
+ +
+ +
+ +
+
diff --git a/app/(site)/(directories)/keyboard-shortcuts/(index)/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/(index)/content/intro.mdx new file mode 100644 index 00000000..79c30f08 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/(index)/content/intro.mdx @@ -0,0 +1 @@ +Pick an app to see its default keyboard shortcuts, grouped by the task they help with. Each row shows the keys for every platform the app runs on, so Mac, Windows, and Linux users can read the same page. diff --git a/app/(site)/(directories)/keyboard-shortcuts/(index)/content/shortcut-not-working.mdx b/app/(site)/(directories)/keyboard-shortcuts/(index)/content/shortcut-not-working.mdx new file mode 100644 index 00000000..c4bea512 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/(index)/content/shortcut-not-working.mdx @@ -0,0 +1,8 @@ +## Why doesn't a shortcut work for me? + +Usually something else has claimed the keys first. Check these in order: + +- You or an extension changed it. Apps such as VS Code and 1Password let you remap shortcuts, and your keys replace the defaults listed here. +- Your keyboard isn't a US layout. Many references, including Microsoft's for Excel and VS Code, assume one, so keys such as `/` and `[` can sit elsewhere. +- The operating system took it. Your system can reserve a combination before the app sees it. On a Mac, the top row may control brightness and volume until you hold Fn. +- Your app version differs. The lists follow current desktop releases. diff --git a/app/(site)/(directories)/keyboard-shortcuts/(index)/content/where-shortcuts-come-from.mdx b/app/(site)/(directories)/keyboard-shortcuts/(index)/content/where-shortcuts-come-from.mdx new file mode 100644 index 00000000..155ed3f6 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/(index)/content/where-shortcuts-come-from.mdx @@ -0,0 +1,5 @@ +## Where do these shortcuts come from? + +Each app's list follows a published shortcut reference, usually the maker's own help pages, and shows the default keys. When the source gives no key for a platform, the row says "Not documented" instead of guessing. + +Mac keys get their own line because many apps swap Ctrl for Cmd and Alt for Option, but not all of them do. The printable sheet names each app's source and the date it was checked. diff --git a/app/(site)/(directories)/keyboard-shortcuts/1password/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/1password/content/intro.mdx new file mode 100644 index 00000000..3cf5e55b --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/1password/content/intro.mdx @@ -0,0 +1 @@ +1Password stores your passwords, passkeys, and other secrets, then fills them in for you. Its shortcuts are split by where they work: anywhere on your computer, in the desktop app, in Quick Access, and in the browser extension. diff --git a/app/(site)/(directories)/keyboard-shortcuts/1password/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/1password/page.tsx index 62b3cc6e..43b9c1b2 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/1password/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/1password/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/1password"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/7-zip/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/7-zip/content/intro.mdx new file mode 100644 index 00000000..33cdb66c --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/7-zip/content/intro.mdx @@ -0,0 +1 @@ +7-Zip is a free archiver for Windows that packs and unpacks ZIP, 7z, and other archive files. In its File Manager, the function keys rename, copy, and move files, the number pad builds a selection, and other keys switch panels and views. diff --git a/app/(site)/(directories)/keyboard-shortcuts/7-zip/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/7-zip/page.tsx index 8fc67f44..1cee6286 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/7-zip/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/7-zip/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/7-zip"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/ableton-live/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/ableton-live/content/intro.mdx new file mode 100644 index 00000000..924ff6d3 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/ableton-live/content/intro.mdx @@ -0,0 +1 @@ +Ableton Live is music software for writing tracks in the studio and playing them on stage, built around Session View and Arrangement View. Its keys switch views, edit clips and devices, draw automation, set the grid and loop, and run tracks, transport, and the browser. diff --git a/app/(site)/(directories)/keyboard-shortcuts/ableton-live/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/ableton-live/page.tsx index 5f52bf05..533181f8 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/ableton-live/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/ableton-live/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/ableton-live"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-pro/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-pro/content/intro.mdx new file mode 100644 index 00000000..d1fa6a0f --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-pro/content/intro.mdx @@ -0,0 +1 @@ +Acrobat Pro is the paid edition of Acrobat, for when you need to edit PDFs, build forms, and prepare files for others. These keys pick tools, add comments, author forms and portfolios, move through pages, and reach bookmarks, search, and Read Out Loud. diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-pro/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-pro/page.tsx index ce8d2aed..6f96e745 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-pro/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-pro/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/adobe-acrobat-pro"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-reader/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-reader/content/intro.mdx new file mode 100644 index 00000000..e0903d90 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-reader/content/intro.mdx @@ -0,0 +1 @@ +Acrobat Reader is Adobe's free app for opening PDFs, filling in forms, and leaving comments. Use these keys to page through and zoom a document, search it, jump with bookmarks, mark it up, and have it read aloud. diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-reader/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-reader/page.tsx index 76c03e85..d19af6f0 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-reader/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-acrobat-reader/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/adobe-acrobat-reader"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-after-effects/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/adobe-after-effects/content/intro.mdx new file mode 100644 index 00000000..c7f4c8bc --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-after-effects/content/intro.mdx @@ -0,0 +1 @@ +After Effects is where video editors and motion designers build animated titles, effects, and composites. The keys cover tools and panels, compositions and previews, layers and their properties, keyframes, text, masks and shapes, and rendering. diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-after-effects/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/adobe-after-effects/page.tsx index 66be8361..3f27dc2f 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/adobe-after-effects/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-after-effects/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/adobe-after-effects"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-audition/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/adobe-audition/content/intro.mdx new file mode 100644 index 00000000..20419aed --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-audition/content/intro.mdx @@ -0,0 +1 @@ +Adobe Audition is an audio editor with two workspaces: the Waveform Editor for fixing a single file and the Multitrack Editor for mixing many. Its shortcuts follow that split, after a shared set for playback, zoom, and markers. diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-audition/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/adobe-audition/page.tsx index 906c516d..d23f919d 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/adobe-audition/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-audition/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/adobe-audition"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-illustrator/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/adobe-illustrator/content/intro.mdx new file mode 100644 index 00000000..9a66c9d0 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-illustrator/content/intro.mdx @@ -0,0 +1 @@ +Illustrator is the vector drawing app designers reach for when making logos, icons, and print artwork that scales to any size. Its shortcuts pick tools, manage artboards and the view, select and arrange objects, and handle color, type, and effects. diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-illustrator/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/adobe-illustrator/page.tsx index 5b2cf5b5..5e78af45 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/adobe-illustrator/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-illustrator/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/adobe-illustrator"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-indesign/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/adobe-indesign/content/intro.mdx new file mode 100644 index 00000000..ec3a0709 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-indesign/content/intro.mdx @@ -0,0 +1 @@ +InDesign lays out books, magazines, and brochures for print or screen, with frames that hold text and images. You can switch selection and drawing tools, transform objects, set and move type, edit tables, change the view, and open production panels from the keyboard. diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-indesign/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/adobe-indesign/page.tsx index e8a640dd..45bf1474 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/adobe-indesign/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-indesign/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/adobe-indesign"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-lightroom-classic/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/adobe-lightroom-classic/content/intro.mdx new file mode 100644 index 00000000..6e7a782e --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-lightroom-classic/content/intro.mdx @@ -0,0 +1 @@ +Lightroom Classic keeps your photo library in a catalog on your computer and edits images without touching the originals. Its keys switch modules, sort the Library with ratings, flags, and filters, manage collections and metadata, and apply Develop and local adjustments. diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-lightroom-classic/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/adobe-lightroom-classic/page.tsx index 47771266..126d0409 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/adobe-lightroom-classic/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-lightroom-classic/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/adobe-lightroom-classic"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-pro/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-pro/content/intro.mdx new file mode 100644 index 00000000..1e38012e --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-pro/content/intro.mdx @@ -0,0 +1 @@ +Premiere Pro is Adobe's timeline editor for cutting footage, sound, and graphics into a finished video. Some keys work anywhere, such as for clips, trimming, and markers, while others only work in the Project, Program, or Timeline panel. diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-pro/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-pro/page.tsx index 1e431cfc..e01fa60a 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-pro/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-pro/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/adobe-premiere-pro"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-rush/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-rush/content/intro.mdx new file mode 100644 index 00000000..10806b81 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-rush/content/intro.mdx @@ -0,0 +1 @@ +Premiere Rush is a simple video editor for quick clips, and Adobe stopped offering it for download in 2025. If you still have it installed, these keys edit projects and clips, play the timeline, and work in Large Preview and the Media Browser. diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-rush/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-rush/page.tsx index 3702ea07..7058d0af 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-rush/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-premiere-rush/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/adobe-premiere-rush"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-substance-3d-painter/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/adobe-substance-3d-painter/content/intro.mdx new file mode 100644 index 00000000..2c5f3620 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-substance-3d-painter/content/intro.mdx @@ -0,0 +1 @@ +Substance 3D Painter lets artists paint textures straight onto 3D models for games, film, and product renders. The keys cover projects, tools and the manipulator, painting with stencils, the camera and viewport, and masks, layers, and animation. diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-substance-3d-painter/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/adobe-substance-3d-painter/page.tsx index 4cd0c2bc..59d8e473 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/adobe-substance-3d-painter/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-substance-3d-painter/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/adobe-substance-3d-painter"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-xd/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/adobe-xd/content/intro.mdx new file mode 100644 index 00000000..3cf5d50f --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-xd/content/intro.mdx @@ -0,0 +1 @@ +Adobe XD is for designing app and website screens and linking them into clickable prototypes, though Adobe no longer adds features to it. Its shortcuts cover drawing tools and paths, layers and components, alignment and text, preview, specs, and prototype links. diff --git a/app/(site)/(directories)/keyboard-shortcuts/adobe-xd/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/adobe-xd/page.tsx index 85992a82..9e2c2325 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/adobe-xd/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/adobe-xd/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/adobe-xd"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/affinity-designer/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/affinity-designer/content/intro.mdx new file mode 100644 index 00000000..f854fe67 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/affinity-designer/content/intro.mdx @@ -0,0 +1 @@ +Affinity Designer 2 lets you draw vector shapes and paint pixels in the same document by switching Personas. Tool keys change between the Designer and Pixel Personas, while other keys handle documents, the view, color and brushes, and drawing modifiers. diff --git a/app/(site)/(directories)/keyboard-shortcuts/affinity-designer/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/affinity-designer/page.tsx index 6d1e35ed..ee34d0aa 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/affinity-designer/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/affinity-designer/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/affinity-designer"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/affinity-photo/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/affinity-photo/content/intro.mdx new file mode 100644 index 00000000..5da367bb --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/affinity-photo/content/intro.mdx @@ -0,0 +1 @@ +Affinity Photo 2 is a photo editor for retouching, compositing, and developing RAW files, split into Personas for each job. Its keys cover documents and layers, Photo Persona tools, the Liquify and Develop Personas, brush and color controls, and painting modifiers. diff --git a/app/(site)/(directories)/keyboard-shortcuts/affinity-photo/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/affinity-photo/page.tsx index 3479cd6b..cf6e1124 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/affinity-photo/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/affinity-photo/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/affinity-photo"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/aider/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/aider/content/intro.mdx new file mode 100644 index 00000000..8dbd3a5f --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/aider/content/intro.mdx @@ -0,0 +1 @@ +Aider is an AI pair programmer that runs in your terminal and edits the code in your git repo. Its prompt keys stop a reply and add multiline input, with Emacs-style editing by default and a vi mode if you start Aider with --vim. diff --git a/app/(site)/(directories)/keyboard-shortcuts/aider/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/aider/page.tsx index 1cf05325..af9fd290 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/aider/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/aider/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/aider"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/airtable/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/airtable/content/intro.mdx new file mode 100644 index 00000000..41b9513c --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/airtable/content/intro.mdx @@ -0,0 +1 @@ +Airtable looks like a spreadsheet but works like a database, so teams track projects, inventory, or content in linked tables. These keys move around bases and views, select and edit grid cells, work in Gallery, Kanban, and Gantt views, and open expanded records. diff --git a/app/(site)/(directories)/keyboard-shortcuts/airtable/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/airtable/page.tsx index 99ca6e4c..1d9d941a 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/airtable/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/airtable/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/airtable"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/alfred/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/alfred/content/intro.mdx new file mode 100644 index 00000000..07689e44 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/alfred/content/intro.mdx @@ -0,0 +1 @@ +Alfred is a Mac launcher you open with a hotkey to start apps, find files, and run workflows. Its default keys run the search window and results, browse files and the File Buffer, open Clipboard History and snippets, and control the Music Mini Player. diff --git a/app/(site)/(directories)/keyboard-shortcuts/alfred/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/alfred/page.tsx index 82511abc..dce1e960 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/alfred/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/alfred/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/alfred"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/amplitude/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/amplitude/content/intro.mdx new file mode 100644 index 00000000..57b4dac0 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/amplitude/content/intro.mdx @@ -0,0 +1 @@ +Amplitude is product analytics software that charts how people use your app or website. Its shortcuts work while you build a chart: open the event and property pickers, then refresh, save, copy, or file the result. diff --git a/app/(site)/(directories)/keyboard-shortcuts/amplitude/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/amplitude/page.tsx index a2498014..0693575b 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/amplitude/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/amplitude/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/amplitude"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/android-studio/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/android-studio/content/intro.mdx new file mode 100644 index 00000000..5837891b --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/android-studio/content/intro.mdx @@ -0,0 +1 @@ +Android Studio is Google's IDE for building Android apps, based on IntelliJ IDEA. The keys open tool windows, find and navigate code, generate and refactor it, build, run, and debug, and work with version control and the layout editors. diff --git a/app/(site)/(directories)/keyboard-shortcuts/android-studio/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/android-studio/page.tsx index a95f3f88..dbc3fd40 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/android-studio/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/android-studio/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/android-studio"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/anydesk/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/anydesk/content/intro.mdx new file mode 100644 index 00000000..37d89392 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/anydesk/content/intro.mdx @@ -0,0 +1 @@ +AnyDesk lets you see and control another computer over the internet, whether you're helping someone or reaching your own machine. While a session is open, these keys move between remote displays and tabs, control the session, and change how the screen fits. diff --git a/app/(site)/(directories)/keyboard-shortcuts/anydesk/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/anydesk/page.tsx index ee1f2a8c..7a22c870 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/anydesk/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/anydesk/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/anydesk"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/apple-music/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/apple-music/content/intro.mdx new file mode 100644 index 00000000..9b2303c5 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/apple-music/content/intro.mdx @@ -0,0 +1 @@ +Apple Music is Apple's app for streaming music and playing your own library, on a Mac or a Windows PC. Shortcuts handle playback, playlists and the library, and windows and views, and on Windows you also get Alt access keys for moving around the app. diff --git a/app/(site)/(directories)/keyboard-shortcuts/apple-music/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/apple-music/page.tsx index 1d6ecff6..436d2b64 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/apple-music/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/apple-music/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/apple-music"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/apple-notes/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/apple-notes/content/intro.mdx new file mode 100644 index 00000000..bb0770b8 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/apple-notes/content/intro.mdx @@ -0,0 +1 @@ +Notes is the note app that comes with every Mac and syncs with your iPhone through iCloud. Its keys create notes and folders, add attachments and formatting, manage lists and checklists, and move around tables. diff --git a/app/(site)/(directories)/keyboard-shortcuts/apple-notes/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/apple-notes/page.tsx index b4749fa8..032c3ce8 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/apple-notes/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/apple-notes/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/apple-notes"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/arc-browser/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/arc-browser/content/intro.mdx new file mode 100644 index 00000000..e2089009 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/arc-browser/content/intro.mdx @@ -0,0 +1 @@ +Arc is a web browser from The Browser Company that keeps your tabs in a sidebar and groups them into Spaces. These keys open and close tabs and windows, jump between tabs and Spaces, set up Split View, and handle page zoom and history. diff --git a/app/(site)/(directories)/keyboard-shortcuts/arc-browser/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/arc-browser/page.tsx index b20efdbc..21989867 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/arc-browser/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/arc-browser/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/arc-browser"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/asana/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/asana/content/intro.mdx new file mode 100644 index 00000000..9dd4f05e --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/asana/content/intro.mdx @@ -0,0 +1 @@ +Asana is a work management app where teams plan projects and assign tasks. From the keyboard you can triage your Inbox, edit task details, add tasks and sections to lists, move around the app, select tasks, and manage windows and tabs in the desktop app. diff --git a/app/(site)/(directories)/keyboard-shortcuts/asana/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/asana/page.tsx index 0d073503..8966c3f6 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/asana/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/asana/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/asana"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/audacity/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/audacity/content/intro.mdx new file mode 100644 index 00000000..6708a994 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/audacity/content/intro.mdx @@ -0,0 +1 @@ +Audacity is a free, open source audio editor and recorder used for podcasts, voiceovers, and music. Its default keys open and save projects, edit audio and clips, set selections and labels, zoom the timeline, and control playback, recording, and looping. diff --git a/app/(site)/(directories)/keyboard-shortcuts/audacity/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/audacity/page.tsx index 8abe4bab..4bf73838 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/audacity/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/audacity/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/audacity"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/autocad/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/autocad/content/intro.mdx new file mode 100644 index 00000000..8c772476 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/autocad/content/intro.mdx @@ -0,0 +1 @@ +AutoCAD is Autodesk's drafting software for 2D drawings and 3D models in architecture, engineering, and manufacturing. These Windows keys open drawings and palettes, select and edit objects, toggle drafting aids like Snap and OSNAP, and switch layouts and viewports. diff --git a/app/(site)/(directories)/keyboard-shortcuts/autocad/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/autocad/page.tsx index 1fbe21f7..a87e6f8d 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/autocad/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/autocad/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/autocad"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/autodesk-maya/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/autodesk-maya/content/intro.mdx new file mode 100644 index 00000000..88c47f22 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/autodesk-maya/content/intro.mdx @@ -0,0 +1 @@ +Maya is 3D software for modeling, animating, and rendering characters and scenes for film and games. Its hotkeys pick transform tools, manage scene files and display, play and key animation, snap and select components, and switch panel views for polygon modeling. diff --git a/app/(site)/(directories)/keyboard-shortcuts/autodesk-maya/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/autodesk-maya/page.tsx index b6864ead..e748467d 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/autodesk-maya/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/autodesk-maya/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/autodesk-maya"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/autodesk-revit/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/autodesk-revit/content/intro.mdx new file mode 100644 index 00000000..d965c97b --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/autodesk-revit/content/intro.mdx @@ -0,0 +1 @@ +Revit is building design software where walls, doors, and ducts are real objects in one shared model. You type short letter sequences to place architecture, structure, and MEP elements, modify geometry, add annotations, and control views and windows. diff --git a/app/(site)/(directories)/keyboard-shortcuts/autodesk-revit/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/autodesk-revit/page.tsx index 23f5111e..354ddcf0 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/autodesk-revit/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/autodesk-revit/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/autodesk-revit"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/axure-rp/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/axure-rp/content/intro.mdx new file mode 100644 index 00000000..0138eb0c --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/axure-rp/content/intro.mdx @@ -0,0 +1 @@ +Axure RP builds wireframes and prototypes that behave like the real product, with logic, conditions, and live data. Its keys handle files and text, canvas movement and guides, inserting and arranging widgets, vector operations, the sitemap, preview, and publishing. diff --git a/app/(site)/(directories)/keyboard-shortcuts/axure-rp/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/axure-rp/page.tsx index 23d97f9d..4cd8e8c6 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/axure-rp/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/axure-rp/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/axure-rp"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/azure-devops/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/azure-devops/content/intro.mdx new file mode 100644 index 00000000..a2bc8875 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/azure-devops/content/intro.mdx @@ -0,0 +1 @@ +Azure DevOps is Microsoft's web platform for code, boards, pipelines, and test plans. Its shortcuts change with the part you're in: global navigation, Repos, work items and the rich-text editor, Boards and backlogs, queries, Test Plans, and Wiki. diff --git a/app/(site)/(directories)/keyboard-shortcuts/azure-devops/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/azure-devops/page.tsx index 9aa73c5a..f5ee3e92 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/azure-devops/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/azure-devops/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/azure-devops"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/balsamiq-wireframes/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/balsamiq-wireframes/content/intro.mdx new file mode 100644 index 00000000..11fe0dd5 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/balsamiq-wireframes/content/intro.mdx @@ -0,0 +1 @@ +Balsamiq Wireframes sketches screens in a deliberately rough, hand-drawn style so feedback stays on layout, not looks. These keys select, move, and resize controls, arrange and group them, edit text and icons, manage projects and boards, and run presentation mode. diff --git a/app/(site)/(directories)/keyboard-shortcuts/balsamiq-wireframes/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/balsamiq-wireframes/page.tsx index 544c3353..a4a1de7f 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/balsamiq-wireframes/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/balsamiq-wireframes/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/balsamiq-wireframes"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/basecamp/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/basecamp/content/intro.mdx new file mode 100644 index 00000000..f8086ff8 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/basecamp/content/intro.mdx @@ -0,0 +1 @@ +Basecamp keeps a team's projects, to-dos, messages, and chat in one place. Hold Shift to see its keys, which jump around the app through the Jump menu, act on the current project or page, and search one project or all of them. diff --git a/app/(site)/(directories)/keyboard-shortcuts/basecamp/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/basecamp/page.tsx index a92a2df3..efe497ca 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/basecamp/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/basecamp/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/basecamp"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/bear/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/bear/content/intro.mdx new file mode 100644 index 00000000..2849a9e0 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/bear/content/intro.mdx @@ -0,0 +1 @@ +Bear is a Markdown notes app for Mac that sorts your notes with tags instead of folders. Its keys format text, add tables and to-dos, move lines and lists, insert dates, switch notes, and manage files and windows. diff --git a/app/(site)/(directories)/keyboard-shortcuts/bear/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/bear/page.tsx index 102780c9..901115a2 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/bear/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/bear/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/bear"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/bitbucket/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/bitbucket/content/intro.mdx new file mode 100644 index 00000000..e0bb30a3 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/bitbucket/content/intro.mdx @@ -0,0 +1 @@ +Bitbucket is Atlassian's git hosting service, where teams store code and review pull requests. Its web keys search the site and open the navigation, filter files and search code in a repository, and approve or move through a pull request. diff --git a/app/(site)/(directories)/keyboard-shortcuts/bitbucket/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/bitbucket/page.tsx index bb25f059..2c4f3113 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/bitbucket/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/bitbucket/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/bitbucket"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/blender/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/blender/content/intro.mdx new file mode 100644 index 00000000..b10ba90f --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/blender/content/intro.mdx @@ -0,0 +1 @@ +Blender is free, open source 3D software for modeling, animation, rendering, and video. Its common keys copy and reset values under the pointer, handle files and undo, select and hide objects, switch 3D Viewport modes, insert keyframes and drivers, and copy Python paths. diff --git a/app/(site)/(directories)/keyboard-shortcuts/blender/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/blender/page.tsx index 22e68d58..88814938 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/blender/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/blender/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/blender"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/bluebeam-revu/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/bluebeam-revu/content/intro.mdx new file mode 100644 index 00000000..35a10052 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/bluebeam-revu/content/intro.mdx @@ -0,0 +1 @@ +Bluebeam Revu is a PDF app for construction and engineering teams who mark up and measure drawings. On Windows, its keys pick markup and measurement tools, change PDF view and layout, edit and select, work with pages, and open panels. diff --git a/app/(site)/(directories)/keyboard-shortcuts/bluebeam-revu/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/bluebeam-revu/page.tsx index d5f60e69..1accd7a5 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/bluebeam-revu/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/bluebeam-revu/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/bluebeam-revu"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/brave/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/brave/content/intro.mdx new file mode 100644 index 00000000..d23e0903 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/brave/content/intro.mdx @@ -0,0 +1 @@ +Brave is a web browser built on Chromium that blocks ads and trackers by default. Its shortcuts reopen a closed tab, search from the address bar, open the Brave menu, bookmarks, and history, and go back or reload a page. diff --git a/app/(site)/(directories)/keyboard-shortcuts/brave/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/brave/page.tsx index a740de5e..ae9acd28 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/brave/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/brave/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/brave"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/buffer/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/buffer/content/intro.mdx new file mode 100644 index 00000000..369c2923 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/buffer/content/intro.mdx @@ -0,0 +1 @@ +Buffer schedules posts across your social accounts and gathers replies in one inbox. In the web app, its keys open the command bar, jump between Publishing, Insights, and Community, start posts and ideas, schedule from the composer, and move through comments. diff --git a/app/(site)/(directories)/keyboard-shortcuts/buffer/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/buffer/page.tsx index 59bf04bd..8fff66e3 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/buffer/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/buffer/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/buffer"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/canva/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/canva/content/intro.mdx new file mode 100644 index 00000000..4809ba49 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/canva/content/intro.mdx @@ -0,0 +1 @@ +Canva is an online design tool for social posts, slides, videos, and print, built on drag and drop templates. The keys edit and arrange elements, format text, play video and zoom, add comments, and run windows and tabs in the Mac desktop app. diff --git a/app/(site)/(directories)/keyboard-shortcuts/canva/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/canva/page.tsx index 5dc4ed79..754d0ccb 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/canva/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/canva/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/canva"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/chrome/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/chrome/content/intro.mdx new file mode 100644 index 00000000..da9d9785 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/chrome/content/intro.mdx @@ -0,0 +1 @@ +Chrome is Google's web browser, which syncs your bookmarks and passwords through your Google account. Its shortcuts manage tabs and windows, go back and forward, work in the address bar, find text and open browser tools, and reach the menu and accessibility options. diff --git a/app/(site)/(directories)/keyboard-shortcuts/chrome/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/chrome/page.tsx index 1aecedd8..27565be8 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/chrome/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/chrome/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/chrome"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/cinema-4d/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/cinema-4d/content/intro.mdx new file mode 100644 index 00000000..51bc4445 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/cinema-4d/content/intro.mdx @@ -0,0 +1 @@ +Cinema 4D is Maxon's 3D app for motion graphics, product shots, and animated scenes. Its shortcuts run the Timeline and animation, open managers and editors, move the viewport camera, model meshes, select and render, and modify sculpt brushes. diff --git a/app/(site)/(directories)/keyboard-shortcuts/cinema-4d/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/cinema-4d/page.tsx index 69d2b533..66713895 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/cinema-4d/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/cinema-4d/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/cinema-4d"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/claude-code/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/claude-code/content/intro.mdx new file mode 100644 index 00000000..b41c8484 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/claude-code/content/intro.mdx @@ -0,0 +1 @@ +Claude Code is Anthropic's coding agent that reads your project, edits files, and runs commands from the terminal. These keys interrupt or rewind a turn, switch permission modes and models, edit and recall prompts, add new lines, and open the transcript. diff --git a/app/(site)/(directories)/keyboard-shortcuts/claude-code/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/claude-code/page.tsx index 00b05d85..6f21757c 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/claude-code/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/claude-code/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/claude-code"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/clickup/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/clickup/content/intro.mdx new file mode 100644 index 00000000..8a980da9 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/clickup/content/intro.mdx @@ -0,0 +1 @@ +ClickUp combines tasks, docs, chat, and goals in one workspace for teams. Its keys create tasks from anywhere, format text in the editor, fill task fields, handle Chat and Inbox, switch views, and run SyncUps, once you turn shortcuts on. diff --git a/app/(site)/(directories)/keyboard-shortcuts/clickup/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/clickup/page.tsx index d771fdcb..331674ea 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/clickup/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/clickup/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/clickup"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/clip-studio-paint/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/clip-studio-paint/content/intro.mdx new file mode 100644 index 00000000..42568a6e --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/clip-studio-paint/content/intro.mdx @@ -0,0 +1 @@ +Clip Studio Paint is a drawing and painting app built for comics, manga, and illustration. Its default keys handle files, edits and transforms, layers, selections, rotating and zooming the canvas, rulers, and showing or hiding palettes. diff --git a/app/(site)/(directories)/keyboard-shortcuts/clip-studio-paint/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/clip-studio-paint/page.tsx index 733bd20b..67dbda73 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/clip-studio-paint/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/clip-studio-paint/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/clip-studio-paint"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/clockify/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/clockify/content/intro.mdx new file mode 100644 index 00000000..7e0c675e --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/clockify/content/intro.mdx @@ -0,0 +1 @@ +Clockify is a time tracker for logging hours against projects, clients, and tasks. The web Time Tracker uses single keys to start, stop, and continue timers, and the Mac app has its own Command shortcuts for timers and entries. diff --git a/app/(site)/(directories)/keyboard-shortcuts/clockify/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/clockify/page.tsx index 672e3bb7..57a11b03 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/clockify/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/clockify/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/clockify"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/coda/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/coda/content/intro.mdx new file mode 100644 index 00000000..5b141569 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/coda/content/intro.mdx @@ -0,0 +1 @@ +Coda mixes documents, tables, and formulas so a team's doc can work like an app. The keys move around pages, format text, set headings and lists, insert references and formulas, and select and move through table rows. diff --git a/app/(site)/(directories)/keyboard-shortcuts/coda/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/coda/page.tsx index 22048895..40ede5da 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/coda/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/coda/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/coda"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/codex/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/codex/content/intro.mdx new file mode 100644 index 00000000..e8cc79f9 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/codex/content/intro.mdx @@ -0,0 +1 @@ +Codex CLI is OpenAI's coding agent for the terminal, and it can work while you keep typing. Its keys queue or interrupt messages during a task, edit your prompt, change reasoning effort and modes, and scroll the transcript and pickers. diff --git a/app/(site)/(directories)/keyboard-shortcuts/codex/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/codex/page.tsx index be94f4a0..076c84c7 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/codex/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/codex/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/codex"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/confluence/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/confluence/content/intro.mdx new file mode 100644 index 00000000..8128f135 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/confluence/content/intro.mdx @@ -0,0 +1 @@ +Confluence is Atlassian's team wiki for pages, live docs, and whiteboards. Its shortcuts cover site actions, creating and editing pages, formatting in the editor, working with tables, Markdown and autocomplete triggers, and whiteboard tools. diff --git a/app/(site)/(directories)/keyboard-shortcuts/confluence/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/confluence/page.tsx index 2f07bc2b..c789bc79 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/confluence/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/confluence/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/confluence"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/craft/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/craft/content/intro.mdx new file mode 100644 index 00000000..fd1ba627 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/craft/content/intro.mdx @@ -0,0 +1 @@ +Craft is a notes and documents app where every paragraph is a block you can move, nest, or turn into a page. The keys search and navigate, create documents and tasks, insert and format blocks, reorder blocks and pages, and switch tabs and windows. diff --git a/app/(site)/(directories)/keyboard-shortcuts/craft/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/craft/page.tsx index dd69439b..a93bcbff 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/craft/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/craft/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/craft"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/cubase/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/cubase/content/intro.mdx new file mode 100644 index 00000000..623f614d --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/cubase/content/intro.mdx @@ -0,0 +1 @@ +Cubase is Steinberg's music production app for recording, editing, and mixing songs and scores. Its key commands open and save projects, edit events, run the transport and locators, and reach tracks and devices. diff --git a/app/(site)/(directories)/keyboard-shortcuts/cubase/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/cubase/page.tsx index 9cff935e..a217e8d0 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/cubase/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/cubase/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/cubase"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/cursor/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/cursor/content/intro.mdx new file mode 100644 index 00000000..c84f4fc0 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/cursor/content/intro.mdx @@ -0,0 +1 @@ +Cursor is a code editor built around AI chat and agents, forked from VS Code. Its shortcuts toggle panels, send and queue chat messages, open inline edit, add code to context, accept suggestions, and turn plain words into terminal commands. diff --git a/app/(site)/(directories)/keyboard-shortcuts/cursor/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/cursor/page.tsx index 0269ca3a..c92a8c68 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/cursor/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/cursor/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/cursor"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve-fusion-page/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve-fusion-page/content/intro.mdx new file mode 100644 index 00000000..abccb9a7 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve-fusion-page/content/intro.mdx @@ -0,0 +1 @@ +The Fusion page is DaVinci Resolve's node-based workspace for visual effects and motion graphics. Its keys play your composition forward or back, step a frame at a time, and jump to the render range In and Out points. diff --git a/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve-fusion-page/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve-fusion-page/page.tsx index a4f29d70..c422faa5 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve-fusion-page/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve-fusion-page/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/davinci-resolve-fusion-page"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve/content/intro.mdx new file mode 100644 index 00000000..e2fd7336 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve/content/intro.mdx @@ -0,0 +1 @@ +DaVinci Resolve is Blackmagic Design's video editor, with color grading, effects, and audio built in. The keys play, stop, and step through frames, then zoom the timeline, cut at the playhead, and turn clips on or off. diff --git a/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve/page.tsx index 8465acc3..8362d028 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/davinci-resolve/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/davinci-resolve"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/dbeaver/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/dbeaver/content/intro.mdx new file mode 100644 index 00000000..59ae6cdf --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/dbeaver/content/intro.mdx @@ -0,0 +1 @@ +DBeaver is a free database client that connects to PostgreSQL, MySQL, SQLite, and many other databases. Its keys open connections and SQL scripts, edit result sets, work in data and text editors, search and move between windows, and run or debug. diff --git a/app/(site)/(directories)/keyboard-shortcuts/dbeaver/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/dbeaver/page.tsx index c70af45b..211e04a7 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/dbeaver/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/dbeaver/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/dbeaver"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/deepl/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/deepl/content/intro.mdx new file mode 100644 index 00000000..eb10282e --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/deepl/content/intro.mdx @@ -0,0 +1 @@ +DeepL is a translation and writing app, and its desktop version works with text you select in any other app. The shortcuts translate or improve that selection, plus a key to quit DeepL on a Mac. diff --git a/app/(site)/(directories)/keyboard-shortcuts/deepl/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/deepl/page.tsx index b5618293..1d9152cb 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/deepl/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/deepl/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/deepl"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/descript/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/descript/content/intro.mdx new file mode 100644 index 00000000..a366cd72 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/descript/content/intro.mdx @@ -0,0 +1 @@ +Descript edits audio and video through a transcript, so cutting words in the text cuts them from the recording. Its keys switch editing tools, open the action bar, correct the script and split scenes, and show or hide the timeline. diff --git a/app/(site)/(directories)/keyboard-shortcuts/descript/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/descript/page.tsx index 62c5bdd8..96c16ece 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/descript/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/descript/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/descript"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/discord/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/discord/content/intro.mdx new file mode 100644 index 00000000..df4d1860 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/discord/content/intro.mdx @@ -0,0 +1 @@ +Discord is a chat app for communities, with text channels, voice calls, and servers. Its shortcuts open settings, search channels and pick emoji or GIFs, edit messages, mute or deafen in voice, switch servers, and move around by keyboard. diff --git a/app/(site)/(directories)/keyboard-shortcuts/discord/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/discord/page.tsx index f912aa65..386efaaf 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/discord/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/discord/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/discord"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/draw-io-diagrams-net/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/draw-io-diagrams-net/content/intro.mdx new file mode 100644 index 00000000..6bf019c4 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/draw-io-diagrams-net/content/intro.mdx @@ -0,0 +1 @@ +draw.io, also called diagrams.net, is a free diagram editor for flowcharts, network maps, and org charts. These keys save and undo, move the canvas, select and arrange shapes, edit labels and styles, connect library shapes, and change table shapes. diff --git a/app/(site)/(directories)/keyboard-shortcuts/draw-io-diagrams-net/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/draw-io-diagrams-net/page.tsx index 99cfa301..d5f3f218 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/draw-io-diagrams-net/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/draw-io-diagrams-net/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/draw-io-diagrams-net"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/eclipse/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/eclipse/content/intro.mdx new file mode 100644 index 00000000..66ce2344 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/eclipse/content/intro.mdx @@ -0,0 +1 @@ +Eclipse is an open source IDE best known for Java, extended with plug-ins for other languages. Its keys open Quick Access, find and replace, edit lines, build, run, and debug, and move between editors, views, files, and projects. diff --git a/app/(site)/(directories)/keyboard-shortcuts/eclipse/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/eclipse/page.tsx index 1369b340..144401d7 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/eclipse/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/eclipse/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/eclipse"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/emacs/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/emacs/content/intro.mdx new file mode 100644 index 00000000..07cdcc5e --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/emacs/content/intro.mdx @@ -0,0 +1 @@ +Emacs is a programmable text editor that's been around since the 1970s, driven by Control and Meta keys. These commands move the cursor, cut and paste text (kill and yank), visit files, switch buffers and windows, search and replace, get help, and record keyboard macros. diff --git a/app/(site)/(directories)/keyboard-shortcuts/emacs/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/emacs/page.tsx index 00f4d14b..d2f4fbfd 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/emacs/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/emacs/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/emacs"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/evernote/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/evernote/content/intro.mdx new file mode 100644 index 00000000..4f7e1381 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/evernote/content/intro.mdx @@ -0,0 +1 @@ +Evernote stores notes, web clips, tasks, and files in notebooks you can search later. Its keys capture notes from anywhere, create and move notes, navigate and change the view, edit and format text, and open the AI assistant. diff --git a/app/(site)/(directories)/keyboard-shortcuts/evernote/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/evernote/page.tsx index c94ddb05..e7c12d40 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/evernote/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/evernote/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/evernote"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/excalidraw/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/excalidraw/content/intro.mdx new file mode 100644 index 00000000..d623cf3a --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/excalidraw/content/intro.mdx @@ -0,0 +1 @@ +Excalidraw is a free, open source whiteboard in your browser for quick diagrams and sketches you can share. Its keys save and export drawings, copy and paste shapes and styles, arrange layers and groups, change canvas modes and zoom, and pick tools. diff --git a/app/(site)/(directories)/keyboard-shortcuts/excalidraw/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/excalidraw/page.tsx index be7cddee..5269fdd2 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/excalidraw/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/excalidraw/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/excalidraw"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/excel/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/excel/content/intro.mdx new file mode 100644 index 00000000..694a0f27 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/excel/content/intro.mdx @@ -0,0 +1 @@ +Excel is Microsoft's spreadsheet app for budgets, lists, data, and reports. Use these keys to move around a worksheet, select and fill ranges, format cells, enter formulas, and reach ribbon commands without the mouse. diff --git a/app/(site)/(directories)/keyboard-shortcuts/excel/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/excel/page.tsx index 476e8769..25f6cb6c 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/excel/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/excel/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/excel"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/fantastical/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/fantastical/content/intro.mdx new file mode 100644 index 00000000..bbd97111 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/fantastical/content/intro.mdx @@ -0,0 +1 @@ +Fantastical is a calendar and task app that creates events from plain sentences like "lunch with Sam Friday at noon". Its keys search, add events and tasks, jump between dates, and nudge an item earlier or later by a day or fifteen minutes. diff --git a/app/(site)/(directories)/keyboard-shortcuts/fantastical/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/fantastical/page.tsx index 7db62629..3bc4f8bc 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/fantastical/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/fantastical/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/fantastical"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/figjam/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/figjam/content/intro.mdx new file mode 100644 index 00000000..6c5d8e0b --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/figjam/content/intro.mdx @@ -0,0 +1 @@ +FigJam is Figma's online whiteboard for brainstorms, retros, and diagrams with your team. Its keys select and order objects, format text, add sticky notes, sections, and connectors, and create and copy tables. diff --git a/app/(site)/(directories)/keyboard-shortcuts/figjam/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/figjam/page.tsx index 46f2fea4..b0decb77 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/figjam/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/figjam/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/figjam"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/figma/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/figma/content/intro.mdx new file mode 100644 index 00000000..1d2d1892 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/figma/content/intro.mdx @@ -0,0 +1 @@ +Figma is a design tool, in the browser or as a desktop app, where teams build interfaces, prototypes, and graphics together. These keys switch tools, pan and zoom the canvas, select layers without a mouse, and speed up shape and text edits. diff --git a/app/(site)/(directories)/keyboard-shortcuts/figma/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/figma/page.tsx index 8eb4fbaf..ed049c24 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/figma/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/figma/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/figma"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/filezilla/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/filezilla/content/intro.mdx new file mode 100644 index 00000000..0dc98d51 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/filezilla/content/intro.mdx @@ -0,0 +1 @@ +FileZilla is a free FTP and SFTP client for moving files between your computer and a server. Its keys rename and refresh files, switch panes, transfer items and disconnect, and manage bookmarks, tabs, and directory comparison. diff --git a/app/(site)/(directories)/keyboard-shortcuts/filezilla/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/filezilla/page.tsx index dd2d466f..7319729a 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/filezilla/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/filezilla/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/filezilla"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/final-cut-pro/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/final-cut-pro/content/intro.mdx new file mode 100644 index 00000000..d7143fee --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/final-cut-pro/content/intro.mdx @@ -0,0 +1 @@ +Final Cut Pro is Apple's video editor for the Mac, used by YouTubers, filmmakers, and editors who cut on its magnetic timeline. These keys run app commands, cut, connect, and audition clips, and select clips or switch multicam angles in the timeline. diff --git a/app/(site)/(directories)/keyboard-shortcuts/final-cut-pro/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/final-cut-pro/page.tsx index 57ba81c8..8fe1c88b 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/final-cut-pro/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/final-cut-pro/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/final-cut-pro"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/firefox/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/firefox/content/intro.mdx new file mode 100644 index 00000000..54d43623 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/firefox/content/intro.mdx @@ -0,0 +1 @@ +Firefox is Mozilla's open source web browser, and you can shape it with add-ons. Its shortcuts move through pages and history, find text, manage tabs and windows, open bookmarks, downloads, and developer tools, and control the built-in PDF viewer and video playback. diff --git a/app/(site)/(directories)/keyboard-shortcuts/firefox/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/firefox/page.tsx index 35997c3f..be460214 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/firefox/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/firefox/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/firefox"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/fl-studio/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/fl-studio/content/intro.mdx new file mode 100644 index 00000000..e1960353 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/fl-studio/content/intro.mdx @@ -0,0 +1 @@ +FL Studio is Image-Line's music production app, where beat makers and producers build songs from patterns. Its keys work the Channel Rack and step sequencer, the Playlist, the Piano roll, and the Mixer, plus transport, window focus, and saving or exporting projects. diff --git a/app/(site)/(directories)/keyboard-shortcuts/fl-studio/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/fl-studio/page.tsx index ea91df39..8eaafd4c 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/fl-studio/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/fl-studio/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/fl-studio"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/framer/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/framer/content/intro.mdx new file mode 100644 index 00000000..deea0eaf --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/framer/content/intro.mdx @@ -0,0 +1 @@ +Framer lets you design and publish websites on a visual canvas, with a CMS and an AI agent built in. The shortcuts pick drawing and type tools, align layers, add frames and stacks, preview your site, zoom the canvas, and drive the Agent. diff --git a/app/(site)/(directories)/keyboard-shortcuts/framer/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/framer/page.tsx index 85b99f79..1f98d0cd 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/framer/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/framer/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/framer"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/freshdesk/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/freshdesk/content/intro.mdx new file mode 100644 index 00000000..083c9be4 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/freshdesk/content/intro.mdx @@ -0,0 +1 @@ +Freshdesk is a help desk where support teams track and answer customer tickets. Its shortcuts jump between areas with two-key routes, move through the ticket list, and let you reply, forward, add a note, or change a ticket's status. diff --git a/app/(site)/(directories)/keyboard-shortcuts/freshdesk/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/freshdesk/page.tsx index 1312b4fc..7d80e1cf 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/freshdesk/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/freshdesk/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/freshdesk"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/front/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/front/content/intro.mdx new file mode 100644 index 00000000..db9e93ea --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/front/content/intro.mdx @@ -0,0 +1 @@ +Front is a shared inbox: your team works customer email and messages together, with assignments and internal comments. Its keys move through conversations, start and send replies, and archive, assign, tag, or snooze the conversation you have selected. diff --git a/app/(site)/(directories)/keyboard-shortcuts/front/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/front/page.tsx index 8e481bfb..141488b0 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/front/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/front/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/front"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/fusion-360/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/fusion-360/content/intro.mdx new file mode 100644 index 00000000..f8756873 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/fusion-360/content/intro.mdx @@ -0,0 +1 @@ +Fusion 360 is Autodesk's cloud-connected CAD software for designing parts and products in 3D. Use these keys to start sketch lines, shapes, and constraints, pick common modeling commands, change selection modes, and open, save, or switch documents. diff --git a/app/(site)/(directories)/keyboard-shortcuts/fusion-360/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/fusion-360/page.tsx index 82cf990e..b1d11e5f 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/fusion-360/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/fusion-360/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/fusion-360"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/ghostty/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/ghostty/content/intro.mdx new file mode 100644 index 00000000..5ff9f965 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/ghostty/content/intro.mdx @@ -0,0 +1 @@ +Ghostty is a GPU-accelerated terminal emulator with native app windows, set up through a plain text config file. Its default keybinds split panes and move between them, manage tabs and windows, copy and search scrollback, jump between prompts, and reload your config. diff --git a/app/(site)/(directories)/keyboard-shortcuts/ghostty/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/ghostty/page.tsx index ca242c02..41f964f1 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/ghostty/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/ghostty/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/ghostty"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/gimp/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/gimp/content/intro.mdx new file mode 100644 index 00000000..708d34b7 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/gimp/content/intro.mdx @@ -0,0 +1 @@ +GIMP is a free, open source image editor for retouching photos and making graphics. Most of its keys pick a tool, so you can go from selection to brush to text without the toolbox; others create, save, and export images and open docks. diff --git a/app/(site)/(directories)/keyboard-shortcuts/gimp/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/gimp/page.tsx index 433ce933..d5e21cb4 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/gimp/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/gimp/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/gimp"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/github-copilot/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/github-copilot/content/intro.mdx new file mode 100644 index 00000000..12236f9a --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/github-copilot/content/intro.mdx @@ -0,0 +1 @@ +GitHub Copilot is an AI coding assistant that suggests code as you type in your editor. These VS Code defaults accept, dismiss, cycle, or request inline suggestions, take a long suggestion one word or line at a time, and open the suggestions pane. diff --git a/app/(site)/(directories)/keyboard-shortcuts/github-copilot/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/github-copilot/page.tsx index bfb24154..b86d8c49 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/github-copilot/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/github-copilot/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/github-copilot"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/github-desktop/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/github-desktop/content/intro.mdx new file mode 100644 index 00000000..dd707504 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/github-desktop/content/intro.mdx @@ -0,0 +1 @@ +GitHub Desktop gives you Git without the command line: you clone, branch, and commit from an app window. Its keys add and switch repositories, create branches, step through changed files and history, commit your work, and open settings. diff --git a/app/(site)/(directories)/keyboard-shortcuts/github-desktop/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/github-desktop/page.tsx index 5c4e282d..08df8dd6 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/github-desktop/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/github-desktop/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/github-desktop"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/github/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/github/content/intro.mdx new file mode 100644 index 00000000..6c419a18 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/github/content/intro.mdx @@ -0,0 +1 @@ +GitHub is where developers host code and work on it together through issues, pull requests, and Actions. Its keys jump between site areas and repository tabs, triage issues and pull requests, format comments, and browse code, diffs, and blame. diff --git a/app/(site)/(directories)/keyboard-shortcuts/github/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/github/page.tsx index 593196eb..e1a0ee96 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/github/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/github/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/github"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/gitkraken/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/gitkraken/content/intro.mdx new file mode 100644 index 00000000..94057c4c --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/gitkraken/content/intro.mdx @@ -0,0 +1 @@ +GitKraken Desktop is a visual Git client that draws your branches and commits as a graph. Use these keys to fetch, stage, and commit, move through the commit graph, and show, hide, or switch panels and repository tabs. diff --git a/app/(site)/(directories)/keyboard-shortcuts/gitkraken/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/gitkraken/page.tsx index 5cb77415..da8d0c1c 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/gitkraken/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/gitkraken/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/gitkraken"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/gitlab/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/gitlab/content/intro.mdx new file mode 100644 index 00000000..d5f6a575 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/gitlab/content/intro.mdx @@ -0,0 +1 @@ +GitLab keeps your code, issues, merge requests, and CI/CD pipelines in one DevOps platform. Its shortcuts open common areas from any page, use g routes to reach a project's files, commits, and pipelines, and edit or format text in issues and merge requests. diff --git a/app/(site)/(directories)/keyboard-shortcuts/gitlab/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/gitlab/page.tsx index 7df58e67..523c6e38 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/gitlab/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/gitlab/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/gitlab"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/gmail/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/gmail/content/intro.mdx new file mode 100644 index 00000000..e153acae --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/gmail/content/intro.mdx @@ -0,0 +1 @@ +Gmail is Google's email service, used in the browser for personal and work mail. Turn on keyboard shortcuts in Settings to use the single-key inbox actions; the rest jump between views, move through threads, and help you write and format a message. diff --git a/app/(site)/(directories)/keyboard-shortcuts/gmail/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/gmail/page.tsx index d2493542..2fe76e02 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/gmail/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/gmail/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/gmail"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/gnome/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/gnome/content/intro.mdx new file mode 100644 index 00000000..a818bbef --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/gnome/content/intro.mdx @@ -0,0 +1 @@ +GNOME is the desktop on Ubuntu, Fedora, and other Linux systems, and much of it runs from the Super key. These keys open Activities and apps, switch windows and workspaces, move windows between monitors, take screenshots and screencasts, and lock the screen. diff --git a/app/(site)/(directories)/keyboard-shortcuts/gnome/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/gnome/page.tsx index 34ae405d..1437d247 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/gnome/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/gnome/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/gnome"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/godot-engine/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/godot-engine/content/intro.mdx new file mode 100644 index 00000000..19a01a70 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/godot-engine/content/intro.mdx @@ -0,0 +1 @@ +Godot is a game engine you can use for free, with no royalties, to make 2D and 3D games in its own editor. Its default keys switch workspaces, run the project or a scene, and pan, zoom, select, and snap objects on the 2D canvas. diff --git a/app/(site)/(directories)/keyboard-shortcuts/godot-engine/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/godot-engine/page.tsx index 17437ac4..660cdc2d 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/godot-engine/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/godot-engine/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/godot-engine"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/goodnotes/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/goodnotes/content/intro.mdx new file mode 100644 index 00000000..82fd3153 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/goodnotes/content/intro.mdx @@ -0,0 +1 @@ +Goodnotes is a digital notebook for handwritten notes, typed text, and marked-up PDFs. With a keyboard you can create notebooks and tabs, pick pen and selection tools, jump to a page, search a document, and format typed text. diff --git a/app/(site)/(directories)/keyboard-shortcuts/goodnotes/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/goodnotes/page.tsx index 66da7fd5..ab005b45 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/goodnotes/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/goodnotes/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/goodnotes"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-docs/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/google-docs/content/intro.mdx new file mode 100644 index 00000000..1d644a7f --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/google-docs/content/intro.mdx @@ -0,0 +1 @@ +Google Docs is a word processor in your browser, where several people can write and comment on the same file. Its shortcuts open, find, and print, move text through the clipboard, format characters and paragraphs, and add or step through comments. diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-docs/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/google-docs/page.tsx index 2783a5c2..f1a85f69 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/google-docs/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/google-docs/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/google-docs"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-drive/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/google-drive/content/intro.mdx new file mode 100644 index 00000000..2daf9fb2 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/google-drive/content/intro.mdx @@ -0,0 +1 @@ +Google Drive stores your files online and holds everything you make in Docs, Sheets, and Slides. In the Drive web app, these keys select, open, rename, share, or move files, upload and create new ones, search, and control a file preview. diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-drive/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/google-drive/page.tsx index aaf65d2e..f0c4893b 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/google-drive/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/google-drive/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/google-drive"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-forms/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/google-forms/content/intro.mdx new file mode 100644 index 00000000..3963885a --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/google-forms/content/intro.mdx @@ -0,0 +1 @@ +Google Forms builds surveys, quizzes, and sign-up forms, then collects the answers for you. Its keys move through a form, insert and reorder questions and sections, format titles and descriptions, and speed up grading when a form is a quiz. diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-forms/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/google-forms/page.tsx index 4a63f90d..4cb9d247 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/google-forms/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/google-forms/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/google-forms"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-gemini/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/google-gemini/content/intro.mdx new file mode 100644 index 00000000..197f59f9 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/google-gemini/content/intro.mdx @@ -0,0 +1 @@ +Gemini is Google's AI assistant, which you can chat with on the web and inside the Chrome browser. The shortcuts Google documents are for Gemini in Chrome: open or close it, switch focus between the tab and Gemini, and start selection mode. diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-gemini/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/google-gemini/page.tsx index 166fc26f..069e1dad 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/google-gemini/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/google-gemini/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/google-gemini"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-meet/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/google-meet/content/intro.mdx new file mode 100644 index 00000000..72b4ff38 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/google-meet/content/intro.mdx @@ -0,0 +1 @@ +Google Meet is a video calling app you join from the browser, often straight from a Calendar invite. During a call, these keys turn your camera and mic on or off, raise your hand, show captions or chat, present, and change the tile layout. diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-meet/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/google-meet/page.tsx index e9d39bf3..0b7c1ab8 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/google-meet/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/google-meet/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/google-meet"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-sheets/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/google-sheets/content/intro.mdx new file mode 100644 index 00000000..a845daef --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/google-sheets/content/intro.mdx @@ -0,0 +1 @@ +Google Sheets works much like Excel, but your spreadsheets live in Google Drive and open in any browser. Its keys select and format cells, jump around the sheet, insert or hide rows and columns, add notes and comments, and show formulas. diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-sheets/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/google-sheets/page.tsx index 2d27c0d5..9e383d1f 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/google-sheets/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/google-sheets/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/google-sheets"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-slides/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/google-slides/content/intro.mdx new file mode 100644 index 00000000..4c63e5c7 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/google-slides/content/intro.mdx @@ -0,0 +1 @@ +Google Slides is for building a slide deck you can share by link and present from any browser. Its shortcuts add, duplicate, and reorder slides, move through the filmstrip, start presenting or open speaker notes, style text, and add alt text to images. diff --git a/app/(site)/(directories)/keyboard-shortcuts/google-slides/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/google-slides/page.tsx index 6af42575..e4487002 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/google-slides/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/google-slides/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/google-slides"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/grammarly/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/grammarly/content/intro.mdx new file mode 100644 index 00000000..2278bfae --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/grammarly/content/intro.mdx @@ -0,0 +1 @@ +Grammarly checks your spelling, grammar, and tone and suggests rewrites while you type in other apps. Its documented shortcuts are for the desktop app: open the Grammarly Assistant or sidebar, close it, and move between its controls. diff --git a/app/(site)/(directories)/keyboard-shortcuts/grammarly/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/grammarly/page.tsx index c99c5e24..3846b729 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/grammarly/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/grammarly/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/grammarly"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/harvest/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/harvest/content/intro.mdx new file mode 100644 index 00000000..a4d43eec --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/harvest/content/intro.mdx @@ -0,0 +1 @@ +Harvest tracks the time you spend on projects, so freelancers and teams can bill clients and see where the hours go. These keys are for the Windows app: start a timer, show the timesheet, move between days, and edit, stop, or delete a selected entry. diff --git a/app/(site)/(directories)/keyboard-shortcuts/harvest/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/harvest/page.tsx index eec21f8f..a5a5270c 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/harvest/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/harvest/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/harvest"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/httpie/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/httpie/content/intro.mdx new file mode 100644 index 00000000..ff7ab0a4 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/httpie/content/intro.mdx @@ -0,0 +1 @@ +HTTPie started as a friendly command-line HTTP client and now has a desktop app for testing APIs. Its desktop shortcuts open and switch request tabs, focus the URL and send a request, search inside the editor, and open the library, settings, and AI prompt. diff --git a/app/(site)/(directories)/keyboard-shortcuts/httpie/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/httpie/page.tsx index e55728cb..1a9013d8 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/httpie/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/httpie/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/httpie"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/ia-writer/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/ia-writer/content/intro.mdx new file mode 100644 index 00000000..eb97c10e --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/ia-writer/content/intro.mdx @@ -0,0 +1 @@ +iA Writer is a plain text editor for writers who work in Markdown and want few distractions. The keys open and search your library, add headings, lists, links, and other Markdown, switch focus mode and preview, and export or print. diff --git a/app/(site)/(directories)/keyboard-shortcuts/ia-writer/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/ia-writer/page.tsx index 9883cd10..d1f89102 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/ia-writer/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/ia-writer/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/ia-writer"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/imessage/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/imessage/content/intro.mdx new file mode 100644 index 00000000..9da02bc9 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/imessage/content/intro.mdx @@ -0,0 +1 @@ +Messages is the Mac app for iMessage and texts, synced with the conversations on your iPhone. Its keys start and search conversations, send and edit messages, add a Tapback, mark chats as read, and open contact and conversation details. diff --git a/app/(site)/(directories)/keyboard-shortcuts/imessage/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/imessage/page.tsx index ccfde209..553a5bac 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/imessage/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/imessage/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/imessage"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/inkscape/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/inkscape/content/intro.mdx new file mode 100644 index 00000000..e09f638a --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/inkscape/content/intro.mdx @@ -0,0 +1 @@ +Inkscape draws in vectors and saves to SVG, so logos, icons, and diagrams stay sharp at any size. Its keys switch drawing, shape, and text tools, open, import, and export files, group and convert objects, and change stacking order and zoom. diff --git a/app/(site)/(directories)/keyboard-shortcuts/inkscape/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/inkscape/page.tsx index 473c3e8d..4a578430 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/inkscape/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/inkscape/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/inkscape"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/insomnia/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/insomnia/content/intro.mdx new file mode 100644 index 00000000..840efe3e --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/insomnia/content/intro.mdx @@ -0,0 +1 @@ +Insomnia is Kong's open source app for designing, testing, and debugging APIs. Its keys edit a request's method and URL, pick an environment, send the request, filter the sidebar, and create, duplicate, or pin requests and folders. diff --git a/app/(site)/(directories)/keyboard-shortcuts/insomnia/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/insomnia/page.tsx index 43871324..24c0a3e2 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/insomnia/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/insomnia/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/insomnia"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/intellij-idea/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/intellij-idea/content/intro.mdx new file mode 100644 index 00000000..b386c3c7 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/intellij-idea/content/intro.mdx @@ -0,0 +1 @@ +IntelliJ IDEA is JetBrains' IDE for Java and Kotlin, known for its code analysis and refactoring. The keys start with its top commands, like Search Everywhere, then cover editing, code completion and documentation, and jumping between files, symbols, and debugger steps. diff --git a/app/(site)/(directories)/keyboard-shortcuts/intellij-idea/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/intellij-idea/page.tsx index b8309551..baebcd61 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/intellij-idea/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/intellij-idea/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/intellij-idea"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/intercom/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/intercom/content/intro.mdx new file mode 100644 index 00000000..8cf2bfa4 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/intercom/content/intro.mdx @@ -0,0 +1 @@ +Intercom brings customer chats, emails, and tickets into one Inbox for your support team. Many of its keys run through the Command K menu to assign, snooze, or close conversations, and others switch inboxes or move between reply and note. diff --git a/app/(site)/(directories)/keyboard-shortcuts/intercom/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/intercom/page.tsx index be675aa2..0cc5cedf 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/intercom/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/intercom/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/intercom"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/iterm2/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/iterm2/content/intro.mdx new file mode 100644 index 00000000..d1801342 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/iterm2/content/intro.mdx @@ -0,0 +1 @@ +iTerm2 replaces the Mac's built-in Terminal with split panes, searchable scrollback, and Instant Replay. Its keys split and move between panes, manage tabs and windows, search output, open paste history, broadcast input, and set marks you can jump back to. diff --git a/app/(site)/(directories)/keyboard-shortcuts/iterm2/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/iterm2/page.tsx index 3bafb709..ec4924d1 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/iterm2/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/iterm2/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/iterm2"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/jira/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/jira/content/intro.mdx new file mode 100644 index 00000000..9fe75f54 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/jira/content/intro.mdx @@ -0,0 +1 @@ +Jira tracks a team's work items on boards and backlogs, from single bugs to whole projects. These Jira Cloud keys create, open, and assign work items, add comments, and move between items without reaching for the mouse. diff --git a/app/(site)/(directories)/keyboard-shortcuts/jira/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/jira/page.tsx index 6d2eea08..60d2b225 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/jira/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/jira/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/jira"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/joplin/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/joplin/content/intro.mdx new file mode 100644 index 00000000..49218149 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/joplin/content/intro.mdx @@ -0,0 +1 @@ +Joplin is an open source note app with end-to-end encrypted sync, and it also comes as a terminal app. The keys here are for that terminal version: move between notebooks and notes, select and delete items, and type commands and searches. diff --git a/app/(site)/(directories)/keyboard-shortcuts/joplin/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/joplin/page.tsx index 10cef280..09fdc0d2 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/joplin/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/joplin/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/joplin"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/jupyter-notebook/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/jupyter-notebook/content/intro.mdx new file mode 100644 index 00000000..e0bf6c44 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/jupyter-notebook/content/intro.mdx @@ -0,0 +1 @@ +Jupyter Notebook lets you run code one cell at a time and keep the output and your notes beside it. The keys here run a cell, switch between edit and command mode, search the page, and interrupt or restart the kernel. diff --git a/app/(site)/(directories)/keyboard-shortcuts/jupyter-notebook/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/jupyter-notebook/page.tsx index 44db0076..ebeaeda9 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/jupyter-notebook/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/jupyter-notebook/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/jupyter-notebook"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/keyboard-shortcuts-app-page.tsx b/app/(site)/(directories)/keyboard-shortcuts/keyboard-shortcuts-app-page.tsx index 27434cb2..39818ecc 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/keyboard-shortcuts-app-page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/keyboard-shortcuts-app-page.tsx @@ -1,10 +1,11 @@ import { getPublishedDirectoryPage, getRequiredDirectoryPage } from "@/lib/directory-pages"; import { AppShell } from "@/app/ui/site/app-shell"; +import type { ReactNode } from "react"; import type { AppShortcuts } from "@/lib/shortcuts/types"; import { KeyboardShortcutsSidebar } from "@/app/ui/directories/keyboard-shortcuts-sidebar"; import { KeyboardShortcutsReference } from "./keyboard-shortcuts-reference"; -export async function KeyboardShortcutsAppPage({ app }: { app: AppShortcuts }) { +export async function KeyboardShortcutsAppPage({ app, intro }: { app: AppShortcuts; intro: ReactNode }) { const [directoryPage, parentPage] = await Promise.all([ getRequiredDirectoryPage(`keyboard-shortcuts/${app.slug}`), getPublishedDirectoryPage("keyboard-shortcuts"), @@ -17,7 +18,7 @@ export async function KeyboardShortcutsAppPage({ app }: { app: AppShortcuts }) { sidebar={} sidebarLabel="Shortcut pages" > - + ); } diff --git a/app/(site)/(directories)/keyboard-shortcuts/keyboard-shortcuts-directory.tsx b/app/(site)/(directories)/keyboard-shortcuts/keyboard-shortcuts-directory.tsx index a88d56f9..7f6a038d 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/keyboard-shortcuts-directory.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/keyboard-shortcuts-directory.tsx @@ -1,7 +1,6 @@ import { getRequiredDirectoryPage } from "@/lib/directory-pages"; -import { DirectoryPageTitle, DirectoryPageContent } from "@/app/ui/directories/directory-page-content"; +import { DirectoryPageTitle } from "@/app/ui/directories/directory-page-content"; import { PageMeta } from "@/app/ui/site/page-meta"; -import { ContentMarkdown } from "@/app/ui/content-markdown"; import { PageCanvas } from "@/app/ui/site/page-canvas"; import Link from "next/link"; import { appsInCategory, shortcutAppCatalog, shortcutCategories } from "@/lib/shortcuts"; @@ -10,7 +9,11 @@ import { DirectoryTitleIcon } from "@/app/ui/directories/directory-title-icon"; import { PageHeader } from "@/app/ui/site/page-header"; import { EntryHero } from "@/app/ui/site/entry-hero"; import { siteSpotKeyboardShortcutsArt } from "../../art/site--spot-keyboard-shortcuts"; +import { proseClassName, proseSectionFlowClassName } from "@/app/ui/site/prose"; import styles from "./keyboard-shortcuts.module.css"; +import Intro from "./(index)/content/intro.mdx"; +import ShortcutNotWorking from "./(index)/content/shortcut-not-working.mdx"; +import WhereShortcutsComeFrom from "./(index)/content/where-shortcuts-come-from.mdx"; function categoryId(category: string) { return "category-" + category.toLowerCase().replace(/[^a-z0-9]+/g, "-"); @@ -26,7 +29,7 @@ export async function KeyboardShortcutsDirectory() {

{" "}

- + {shortcutAppCatalog.length} apps · {totalShortcuts} shortcuts · Windows, macOS, and Linux
@@ -67,8 +70,18 @@ export async function KeyboardShortcutsDirectory() { ); })} -
- +
+
+ +
+
+ +
+
+ +
+ +

Make a printable sheet from one or more apps

diff --git a/app/(site)/(directories)/keyboard-shortcuts/keyboard-shortcuts-reference.tsx b/app/(site)/(directories)/keyboard-shortcuts/keyboard-shortcuts-reference.tsx index 3e54b1e4..9db828ab 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/keyboard-shortcuts-reference.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/keyboard-shortcuts-reference.tsx @@ -1,9 +1,8 @@ import type { Stack127DirectoryPage } from "@/lib/directory-pages"; -import { DirectoryPageTitle, DirectoryPageContent } from "@/app/ui/directories/directory-page-content"; +import { DirectoryPageTitle } from "@/app/ui/directories/directory-page-content"; import { PageMeta } from "@/app/ui/site/page-meta"; -import { ContentMarkdown } from "@/app/ui/content-markdown"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { Fragment } from "react"; +import { Fragment, type ReactNode } from "react"; import { groupedBindings, keycapParts } from "@/lib/shortcuts/presentation"; import Link from "next/link"; import { PageHeader } from "@/app/ui/site/page-header"; @@ -55,8 +54,11 @@ function ShortcutRow({ shortcut, platforms }: { shortcut: Shortcut; platforms: A ); } -/** `iconKey` is the page's own card icon key, or the keyboard shortcuts directory's when it has none. */ -export function KeyboardShortcutsReference({ app, directoryPage, iconKey }: { app: AppShortcuts; directoryPage: Stack127DirectoryPage; iconKey: string | null }) { +/** + * `intro` is the app page's own `content/intro.mdx`. `iconKey` is the page's own card icon key, + * or the keyboard shortcuts directory's when it has none. + */ +export function KeyboardShortcutsReference({ app, directoryPage, iconKey, intro }: { app: AppShortcuts; directoryPage: Stack127DirectoryPage; iconKey: string | null; intro: ReactNode }) { return ( @@ -65,7 +67,7 @@ export function KeyboardShortcutsReference({ app, directoryPage, iconKey }: { ap - + {intro} {app.platforms.map((platform) => platformLabels[platform]).join(", ")} · {shortcutCount(app)} shortcuts @@ -99,7 +101,8 @@ export function KeyboardShortcutsReference({ app, directoryPage, iconKey }: { ap ))}
- }} /> + +

Make a printable {app.name} sheet

); diff --git a/app/(site)/(directories)/keyboard-shortcuts/keynote/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/keynote/content/intro.mdx new file mode 100644 index 00000000..f8bdaa6b --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/keynote/content/intro.mdx @@ -0,0 +1 @@ +Keynote is Apple's presentation app, free on every Mac, iPad, and iPhone. These keys create and save decks, move between slides, format text, find and comment, arrange objects, add table rows, and control video and slides while you present. diff --git a/app/(site)/(directories)/keyboard-shortcuts/keynote/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/keynote/page.tsx index b7238d5f..af4af7ec 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/keynote/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/keynote/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/keynote"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/krita/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/krita/content/intro.mdx new file mode 100644 index 00000000..c0dbae5b --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/krita/content/intro.mdx @@ -0,0 +1 @@ +Digital painters use Krita to sketch and paint illustrations, concept art, and comics, and it's free and open source. Its default keys handle files, selections, layers, zooming and mirroring the canvas, brush opacity and colors, and the vector text editor. diff --git a/app/(site)/(directories)/keyboard-shortcuts/krita/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/krita/page.tsx index 81bac208..ae64c87d 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/krita/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/krita/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/krita"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/libreoffice-writer/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/libreoffice-writer/content/intro.mdx new file mode 100644 index 00000000..c2077e30 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/libreoffice-writer/content/intro.mdx @@ -0,0 +1 @@ +LibreOffice Writer is the word processor in LibreOffice, a free office suite that also opens and saves Word files. It puts fields, styles, and spelling on the function keys, and other shortcuts select text, insert breaks, apply headings, and work in tables. diff --git a/app/(site)/(directories)/keyboard-shortcuts/libreoffice-writer/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/libreoffice-writer/page.tsx index 6d7c90fd..5a249ee2 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/libreoffice-writer/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/libreoffice-writer/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/libreoffice-writer"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/linear/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/linear/content/intro.mdx new file mode 100644 index 00000000..b44b5ea6 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/linear/content/intro.mdx @@ -0,0 +1 @@ +Linear is an issue tracker for software teams, designed to be driven from the keyboard. Its keys search and switch views, select one or many issues and set priority, and format text in the editor. diff --git a/app/(site)/(directories)/keyboard-shortcuts/linear/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/linear/page.tsx index bccbe09a..6e26dcbf 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/linear/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/linear/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/linear"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/linkedin/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/linkedin/content/intro.mdx new file mode 100644 index 00000000..ccb37464 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/linkedin/content/intro.mdx @@ -0,0 +1 @@ +LinkedIn is the professional network where people share work news, hire, and look for jobs. On the desktop site, these keys move through the feed, act on a post or notification, open search with a slash, and use g sequences to reach the main pages. diff --git a/app/(site)/(directories)/keyboard-shortcuts/linkedin/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/linkedin/page.tsx index 9bd4183e..8b017caf 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/linkedin/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/linkedin/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/linkedin"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/linux-kde-plasma/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/linux-kde-plasma/content/intro.mdx new file mode 100644 index 00000000..633855ef --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/linux-kde-plasma/content/intro.mdx @@ -0,0 +1 @@ +KDE Plasma is a Linux desktop you can reshape almost any way you like, from panels to window rules. Its default keys switch, move, and resize windows, move across virtual desktops and activities, manage widgets, and run common file and document actions. diff --git a/app/(site)/(directories)/keyboard-shortcuts/linux-kde-plasma/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/linux-kde-plasma/page.tsx index 451b374c..1b77908c 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/linux-kde-plasma/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/linux-kde-plasma/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/linux-kde-plasma"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/logic-pro/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/logic-pro/content/intro.mdx new file mode 100644 index 00000000..5614f0a3 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/logic-pro/content/intro.mdx @@ -0,0 +1 @@ +Logic Pro takes a song from first recording to final mix on a Mac, with software instruments, Drummer, and Live Loops built in. Apple calls its shortcuts key commands; they run the transport, switch tools, create tracks, edit regions, and open the Mixer. diff --git a/app/(site)/(directories)/keyboard-shortcuts/logic-pro/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/logic-pro/page.tsx index aed5680a..b9c7fbb8 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/logic-pro/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/logic-pro/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/logic-pro"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/logseq/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/logseq/content/intro.mdx new file mode 100644 index 00000000..147e54e3 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/logseq/content/intro.mdx @@ -0,0 +1 @@ +Logseq is an open source outliner for notes, where every line is a block you can link and nest. Its keys create, indent, and move blocks, format text, search and run commands, jump between journals and pages, and open the sidebars. diff --git a/app/(site)/(directories)/keyboard-shortcuts/logseq/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/logseq/page.tsx index 8fb0e2cb..3f205a96 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/logseq/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/logseq/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/logseq"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/looker/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/looker/content/intro.mdx new file mode 100644 index 00000000..b3d3bb2d --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/looker/content/intro.mdx @@ -0,0 +1 @@ +Looker is Google Cloud's business intelligence tool for exploring data and sharing dashboards. Its shortcuts change with where you are: dashboards, Looks, Explores, and the LookML IDE each have keys to run, save, download, share, or schedule. diff --git a/app/(site)/(directories)/keyboard-shortcuts/looker/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/looker/page.tsx index 92c9bd52..32845bb0 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/looker/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/looker/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/looker"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/loom/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/loom/content/intro.mdx new file mode 100644 index 00000000..bbc3865f --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/loom/content/intro.mdx @@ -0,0 +1 @@ +Loom records your screen and camera so you can send a short video instead of booking a meeting. Its keys are split three ways: the desktop recorder, the Chrome extension, and the video player for seeking, pausing, and full screen. diff --git a/app/(site)/(directories)/keyboard-shortcuts/loom/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/loom/page.tsx index 569c2313..cbdac85d 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/loom/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/loom/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/loom"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/macos-finder/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/macos-finder/content/intro.mdx new file mode 100644 index 00000000..0773ce60 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/macos-finder/content/intro.mdx @@ -0,0 +1 @@ +Finder is the Mac's file manager, open from the moment you log in. Its keys duplicate, eject, and get info on items, manage Finder windows and tabs, and jump straight to common folders or the Go to Folder box. diff --git a/app/(site)/(directories)/keyboard-shortcuts/macos-finder/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/macos-finder/page.tsx index 287e056d..67161e6d 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/macos-finder/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/macos-finder/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/macos-finder"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/macos-spotlight/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/macos-spotlight/content/intro.mdx new file mode 100644 index 00000000..c0f3e735 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/macos-spotlight/content/intro.mdx @@ -0,0 +1 @@ +Spotlight opens when you press Command and Space, ready to find apps, files, and quick answers on your Mac. These keys preview or reveal the selected result, move through matches, and filter results by category. diff --git a/app/(site)/(directories)/keyboard-shortcuts/macos-spotlight/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/macos-spotlight/page.tsx index 30db61b2..fb6762f3 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/macos-spotlight/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/macos-spotlight/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/macos-spotlight"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/macos/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/macos/content/intro.mdx new file mode 100644 index 00000000..69bb4807 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/macos/content/intro.mdx @@ -0,0 +1 @@ +macOS runs every Mac, so these keys work on the desktop and in most apps you open. They cover copy and undo, switching apps and windows, Mission Control, screenshots, Finder, text editing, and system controls such as locking the screen. diff --git a/app/(site)/(directories)/keyboard-shortcuts/macos/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/macos/page.tsx index 52287b0e..999d7142 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/macos/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/macos/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/macos"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/mastodon/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/mastodon/content/intro.mdx new file mode 100644 index 00000000..55eeda1e --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/mastodon/content/intro.mdx @@ -0,0 +1 @@ +Mastodon is a decentralized social network: you join one server and follow people across many. In the web app, these keys move through the timeline, reply to, boost, or quote the focused post, and use g sequences to open your main columns. diff --git a/app/(site)/(directories)/keyboard-shortcuts/mastodon/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/mastodon/page.tsx index a274c75b..647578e3 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/mastodon/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/mastodon/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/mastodon"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/matlab/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/matlab/content/intro.mdx new file mode 100644 index 00000000..21cc5000 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/matlab/content/intro.mdx @@ -0,0 +1 @@ +MATLAB is MathWorks' language and desktop for numeric computing, used by engineers and scientists. These Editor keys open and save files, jump through code and bookmarks, comment and indent, run sections, fold code, and move focus around the desktop. diff --git a/app/(site)/(directories)/keyboard-shortcuts/matlab/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/matlab/page.tsx index 78e83e06..99896196 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/matlab/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/matlab/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/matlab"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/mattermost/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/mattermost/content/intro.mdx new file mode 100644 index 00000000..b7645544 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/mattermost/content/intro.mdx @@ -0,0 +1 @@ +Mattermost is an open source team chat that organizations can host on their own servers. Its keys switch channels and search, reply to, edit, and format messages, control Calls, and manage tabs in the desktop app. diff --git a/app/(site)/(directories)/keyboard-shortcuts/mattermost/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/mattermost/page.tsx index b13a935c..cad94803 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/mattermost/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/mattermost/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/mattermost"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-edge/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-edge/content/intro.mdx new file mode 100644 index 00000000..a7cb87cd --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-edge/content/intro.mdx @@ -0,0 +1 @@ +Microsoft Edge is the browser built into Windows, running on the same Chromium engine as Chrome. Its keys open and switch tabs, focus the address bar and search, open page and developer tools, change zoom, and move through PDFs. diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-edge/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-edge/page.tsx index 6fbfa3b8..ea57708a 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/microsoft-edge/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-edge/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/microsoft-edge"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-onedrive/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-onedrive/content/intro.mdx new file mode 100644 index 00000000..d9d713b3 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-onedrive/content/intro.mdx @@ -0,0 +1 @@ +OneDrive is Microsoft's cloud storage, and on work or school accounts it's where your Office files sync and get shared. These keys work in the OneDrive file list: rename, open, delete, select, and share files, change the view, and move focus around the browser. diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-onedrive/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-onedrive/page.tsx index 5f1d4884..159330c9 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/microsoft-onedrive/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-onedrive/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/microsoft-onedrive"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-onenote/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-onenote/content/intro.mdx new file mode 100644 index 00000000..94f1327b --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-onenote/content/intro.mdx @@ -0,0 +1 @@ +OneNote sorts your notes into notebooks, sections, and pages, and you can type, draw, or clip content anywhere on a page. A shared set of keys handles the clipboard, search, and links; the rest are split between OneNote for Windows and OneNote for Mac. diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-onenote/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-onenote/page.tsx index 2c2be47f..adc88d22 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/microsoft-onenote/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-onenote/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/microsoft-onenote"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-outlook/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-outlook/content/intro.mdx new file mode 100644 index 00000000..c770cd95 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-outlook/content/intro.mdx @@ -0,0 +1 @@ +Outlook handles work email and calendars in Microsoft 365, and on Windows a new version is replacing the classic one. The keys are split the same way: new Outlook, classic Outlook mail, and calendar and navigation keys from classic Outlook. diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-outlook/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-outlook/page.tsx index dcb720b7..c79547db 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/microsoft-outlook/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-outlook/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/microsoft-outlook"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-powerpoint/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-powerpoint/content/intro.mdx new file mode 100644 index 00000000..361ab0b2 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-powerpoint/content/intro.mdx @@ -0,0 +1 @@ +PowerPoint builds the slide decks people present at work and school, next to Word and Excel in Microsoft 365. The authoring keys for Windows add slides, search the ribbon, and insert objects; the presenting keys move between slides and start a show or Presenter view. diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-powerpoint/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-powerpoint/page.tsx index 9298bd54..13960723 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/microsoft-powerpoint/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-powerpoint/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/microsoft-powerpoint"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-powertoys/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-powertoys/content/intro.mdx new file mode 100644 index 00000000..29d09535 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-powertoys/content/intro.mdx @@ -0,0 +1 @@ +PowerToys is a free set of Microsoft utilities that adds extra tools to Windows. Its keys open the Shortcut Guide, launch PowerToys Run, pin a window on top, pick a color from the screen, snap windows into FancyZones, and open Workspaces. diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-powertoys/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-powertoys/page.tsx index b9e2a493..31953ae2 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/microsoft-powertoys/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-powertoys/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/microsoft-powertoys"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-teams/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-teams/content/intro.mdx new file mode 100644 index 00000000..858a53dc --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-teams/content/intro.mdx @@ -0,0 +1 @@ +Microsoft Teams puts work chat, channels, meetings, and calls in one app. Its keys search and open chats or channels, write and send messages, and let you mute, turn on your camera, share your screen, or raise your hand in a meeting. diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-teams/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-teams/page.tsx index e3e129e2..f5e4bdd9 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/microsoft-teams/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-teams/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/microsoft-teams"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-word/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-word/content/intro.mdx new file mode 100644 index 00000000..b5f88df4 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-word/content/intro.mdx @@ -0,0 +1 @@ +Word is Microsoft's word processor for letters, reports, and long documents. Its keys save and print, move and select by word, line, or page, apply formatting and styles, add comments and track changes, and, on a Mac, run commands from the function keys. diff --git a/app/(site)/(directories)/keyboard-shortcuts/microsoft-word/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/microsoft-word/page.tsx index 5b7f3e76..515ef147 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/microsoft-word/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/microsoft-word/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/microsoft-word"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/milanote/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/milanote/content/intro.mdx new file mode 100644 index 00000000..424d455a --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/milanote/content/intro.mdx @@ -0,0 +1 @@ +Milanote is a visual board for organizing ideas, where designers and writers plan projects with notes, images, and links. Its keys edit cards and move around a board, format text, work in tables and drawings, and switch boards or the app's appearance. diff --git a/app/(site)/(directories)/keyboard-shortcuts/milanote/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/milanote/page.tsx index 7111c278..d9697b7b 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/milanote/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/milanote/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/milanote"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/miro/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/miro/content/intro.mdx new file mode 100644 index 00000000..253ba70f --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/miro/content/intro.mdx @@ -0,0 +1 @@ +Miro is an online whiteboard where teams sketch, plan, and run workshops together. Single keys switch board tools, and others edit objects, move and zoom the canvas, step through toolbars, and control tabs in the desktop app. diff --git a/app/(site)/(directories)/keyboard-shortcuts/miro/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/miro/page.tsx index 33b69948..5693aadf 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/miro/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/miro/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/miro"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/monday-com/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/monday-com/content/intro.mdx new file mode 100644 index 00000000..f9b4e730 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/monday-com/content/intro.mdx @@ -0,0 +1 @@ +monday.com lays out a team's projects as tables of items, with a column for each status, owner, or date. Its keys open Quick Search, step through board cells, select items, add groups and columns, open the activity log, and export a board to Excel. diff --git a/app/(site)/(directories)/keyboard-shortcuts/monday-com/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/monday-com/page.tsx index 61049b3e..2f819e90 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/monday-com/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/monday-com/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/monday-com"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/mozilla-thunderbird/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/mozilla-thunderbird/content/intro.mdx new file mode 100644 index 00000000..a229df0c --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/mozilla-thunderbird/content/intro.mdx @@ -0,0 +1 @@ +Thunderbird is Mozilla's desktop email app, keeping mail from several accounts, your calendar, and contacts in one window. Its keys compose, reply to, and file messages, find unread mail, help while you write, and get around the calendar and address book. diff --git a/app/(site)/(directories)/keyboard-shortcuts/mozilla-thunderbird/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/mozilla-thunderbird/page.tsx index 000c77b2..2c0529c3 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/mozilla-thunderbird/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/mozilla-thunderbird/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/mozilla-thunderbird"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/neovim/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/neovim/content/intro.mdx new file mode 100644 index 00000000..b61f3af7 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/neovim/content/intro.mdx @@ -0,0 +1 @@ +Neovim is a modern fork of Vim, scriptable in Lua and shipped with a built-in language server client. Beyond Vim's movement and editing commands, its defaults cover LSP actions like rename and hover, commenting, diagnostics, Treesitter selection, windows, and terminal mode. diff --git a/app/(site)/(directories)/keyboard-shortcuts/neovim/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/neovim/page.tsx index 415e7116..cb172fc5 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/neovim/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/neovim/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/neovim"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/netflix/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/netflix/content/intro.mdx new file mode 100644 index 00000000..410b2072 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/netflix/content/intro.mdx @@ -0,0 +1 @@ +Netflix streams films and series, and when you watch in a web browser you can run the player from the keyboard. These keys play and pause, skip back or forward, change the volume or mute, go full screen, and skip the intro. diff --git a/app/(site)/(directories)/keyboard-shortcuts/netflix/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/netflix/page.tsx index e4f51706..53cd0f8c 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/netflix/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/netflix/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/netflix"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/notability/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/notability/content/intro.mdx new file mode 100644 index 00000000..ed80b323 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/notability/content/intro.mdx @@ -0,0 +1 @@ +Notability records audio while you write or type, then plays it back in step with your notes. On a Mac, its keys create notes and turn pages, format text and search, pick toolbox tools, colors, and sizes by their position, and manage copied content. diff --git a/app/(site)/(directories)/keyboard-shortcuts/notability/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/notability/page.tsx index a4768671..b246d6a3 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/notability/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/notability/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/notability"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/notepad-plus-plus/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/notepad-plus-plus/content/intro.mdx new file mode 100644 index 00000000..691cdb19 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/notepad-plus-plus/content/intro.mdx @@ -0,0 +1 @@ +Notepad++ is a free text and code editor for Windows that opens quickly and handles many files in tabs. Its keys open, save, and switch tabs, duplicate, move, and delete lines, find and replace, zoom, and show or hide tool windows. diff --git a/app/(site)/(directories)/keyboard-shortcuts/notepad-plus-plus/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/notepad-plus-plus/page.tsx index 88948457..ff77892a 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/notepad-plus-plus/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/notepad-plus-plus/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/notepad-plus-plus"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/notion/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/notion/content/intro.mdx new file mode 100644 index 00000000..24d5caf4 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/notion/content/intro.mdx @@ -0,0 +1 @@ +Notion builds notes, wikis, and databases out of blocks you can move and reshape. Its keys search and open pages, format text with Markdown, change block types, move blocks around, and use the slash, at sign, and plus menus to add content. diff --git a/app/(site)/(directories)/keyboard-shortcuts/notion/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/notion/page.tsx index 68449815..f2bebab1 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/notion/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/notion/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/notion"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/numbers/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/numbers/content/intro.mdx new file mode 100644 index 00000000..a8922351 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/numbers/content/intro.mdx @@ -0,0 +1 @@ +Numbers is Apple's spreadsheet app, where tables and charts sit on a free canvas instead of one big grid. The keys here handle files and sheets, moving through cells, typing text and formulas, and arranging objects and comments. diff --git a/app/(site)/(directories)/keyboard-shortcuts/numbers/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/numbers/page.tsx index 9621a6a4..1f34f7a8 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/numbers/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/numbers/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/numbers"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/obs-studio/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/obs-studio/content/intro.mdx new file mode 100644 index 00000000..96f9ca42 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/obs-studio/content/intro.mdx @@ -0,0 +1 @@ +OBS Studio is free, open source software for recording your screen and streaming live. Its default keys let you arrange sources in the list, then nudge, crop, and fit them in the preview window, plus undo and redo. diff --git a/app/(site)/(directories)/keyboard-shortcuts/obs-studio/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/obs-studio/page.tsx index 7e1c2bd7..c92d8522 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/obs-studio/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/obs-studio/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/obs-studio"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/obsidian/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/obsidian/content/intro.mdx new file mode 100644 index 00000000..6184578b --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/obsidian/content/intro.mdx @@ -0,0 +1 @@ +Obsidian is a note-taking app that keeps your notes as plain Markdown files on your own computer. These default keys cover everyday editing, moving the cursor by word and line, and selecting text as you write. diff --git a/app/(site)/(directories)/keyboard-shortcuts/obsidian/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/obsidian/page.tsx index b501a743..b542ff93 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/obsidian/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/obsidian/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/obsidian"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/omnifocus/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/omnifocus/content/intro.mdx new file mode 100644 index 00000000..59132b25 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/omnifocus/content/intro.mdx @@ -0,0 +1 @@ +OmniFocus is a task manager for Mac built around projects, tags, and a weekly review. Its shortcuts add actions with Quick Entry, jump between perspectives, edit the outline, and manage windows and sync. diff --git a/app/(site)/(directories)/keyboard-shortcuts/omnifocus/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/omnifocus/page.tsx index 260ca658..04fdc002 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/omnifocus/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/omnifocus/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/omnifocus"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/opencode/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/opencode/content/intro.mdx new file mode 100644 index 00000000..9eab548f --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/opencode/content/intro.mdx @@ -0,0 +1 @@ +OpenCode is an open source AI coding agent that runs in your terminal. Most of its keys start with a leader key, and they cover sessions, switching models and agents, scrolling through replies, editing the prompt, and dialogs. diff --git a/app/(site)/(directories)/keyboard-shortcuts/opencode/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/opencode/page.tsx index c694f51e..b069ea02 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/opencode/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/opencode/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/opencode"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/opera/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/opera/content/intro.mdx new file mode 100644 index 00000000..f0549e2a --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/opera/content/intro.mdx @@ -0,0 +1 @@ +Opera is a Chromium-based web browser with a sidebar and built-in extras like a free VPN. These keys open browser pages such as History and Downloads, find text on a page, and move back, forward, and through page elements. diff --git a/app/(site)/(directories)/keyboard-shortcuts/opera/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/opera/page.tsx index 0678db9c..c9e79a3d 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/opera/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/opera/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/opera"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/oracle-virtualbox/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/oracle-virtualbox/content/intro.mdx new file mode 100644 index 00000000..96734cf0 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/oracle-virtualbox/content/intro.mdx @@ -0,0 +1 @@ +VirtualBox runs other operating systems as virtual machines on your computer. Its host key frees your keyboard and mouse from a guest, sends combinations like Ctrl+Alt+Delete into it, and decides which side gets keys like Alt+Tab. diff --git a/app/(site)/(directories)/keyboard-shortcuts/oracle-virtualbox/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/oracle-virtualbox/page.tsx index c04d5615..3242ac79 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/oracle-virtualbox/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/oracle-virtualbox/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/oracle-virtualbox"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/otter-ai/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/otter-ai/content/intro.mdx new file mode 100644 index 00000000..b8855ecd --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/otter-ai/content/intro.mdx @@ -0,0 +1 @@ +Otter.ai records meetings and turns speech into a searchable transcript. A handful of keys help you check that transcript: search, play and skip the audio, change speed, split or join paragraphs, and open the shortcut panel. diff --git a/app/(site)/(directories)/keyboard-shortcuts/otter-ai/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/otter-ai/page.tsx index 2fe3bd13..1cf3627a 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/otter-ai/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/otter-ai/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/otter-ai"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/pages/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/pages/content/intro.mdx new file mode 100644 index 00000000..cc126431 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/pages/content/intro.mdx @@ -0,0 +1 @@ +Pages comes free with your Mac and handles both plain documents and page layouts like flyers and newsletters. Use these keys for files and windows, text formatting and find, placing and grouping objects, and adding or removing table rows and columns. diff --git a/app/(site)/(directories)/keyboard-shortcuts/pages/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/pages/page.tsx index 7ecdbeec..c9e32499 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/pages/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/pages/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/pages"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/paint-net/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/paint-net/content/intro.mdx new file mode 100644 index 00000000..5f6865bb --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/paint-net/content/intro.mdx @@ -0,0 +1 @@ +Paint.NET is a free image editor for Windows, simpler than Photoshop but with layers and effects. These keys pan and zoom the image, show or hide its tool windows, and handle selections, copy, paste, and undo. diff --git a/app/(site)/(directories)/keyboard-shortcuts/paint-net/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/paint-net/page.tsx index 8188c7d4..a7c10b72 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/paint-net/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/paint-net/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/paint-net"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/penpot/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/penpot/content/intro.mdx new file mode 100644 index 00000000..6039c79c --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/penpot/content/intro.mdx @@ -0,0 +1 @@ +Penpot is an open source design and prototyping tool that runs in your browser. Its shortcuts align objects, copy and duplicate them, group and layer them, and zoom or pick tools in the workspace. diff --git a/app/(site)/(directories)/keyboard-shortcuts/penpot/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/penpot/page.tsx index a066ca6e..60394a3b 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/penpot/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/penpot/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/penpot"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/pi-coding-agent/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/pi-coding-agent/content/intro.mdx new file mode 100644 index 00000000..ac6977a8 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/pi-coding-agent/content/intro.mdx @@ -0,0 +1 @@ +Pi keeps a coding agent in your terminal and lets you send new instructions while a run is still going. Its keys control the app, switch models and thinking levels, edit and queue prompts, and browse the transcript and session tree. diff --git a/app/(site)/(directories)/keyboard-shortcuts/pi-coding-agent/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/pi-coding-agent/page.tsx index d6a97be2..73669b9a 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/pi-coding-agent/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/pi-coding-agent/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/pi-coding-agent"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/power-bi/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/power-bi/content/intro.mdx new file mode 100644 index 00000000..0cbbc108 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/power-bi/content/intro.mdx @@ -0,0 +1 @@ +Power BI Desktop is Microsoft's Windows app for building data reports and dashboards. Its shortcuts help with report commands, moving between visuals on the canvas, reading tables and matrices, and editing formulas and the data model. diff --git a/app/(site)/(directories)/keyboard-shortcuts/power-bi/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/power-bi/page.tsx index 704565fc..2baa136a 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/power-bi/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/power-bi/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/power-bi"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/powershell/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/powershell/content/intro.mdx new file mode 100644 index 00000000..3ee11be6 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/powershell/content/intro.mdx @@ -0,0 +1 @@ +PowerShell is Microsoft's command shell and scripting language, and its line editing comes from a module called PSReadLine. These keys move the cursor, edit the line, search history, complete commands, and select text, including Vi mode. diff --git a/app/(site)/(directories)/keyboard-shortcuts/powershell/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/powershell/page.tsx index 7a05932d..6a82f222 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/powershell/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/powershell/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/powershell"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/presonus-studio-one/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/presonus-studio-one/content/intro.mdx new file mode 100644 index 00000000..76ab0120 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/presonus-studio-one/content/intro.mdx @@ -0,0 +1 @@ +Studio One is PreSonus' music app for taking a song from the first recording to a finished master. The key commands here run the transport, edit events and audio, manage tracks and markers, and open the browser, console, and other views. diff --git a/app/(site)/(directories)/keyboard-shortcuts/presonus-studio-one/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/presonus-studio-one/page.tsx index daf0a4d4..bc638f69 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/presonus-studio-one/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/presonus-studio-one/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/presonus-studio-one"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/prezi/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/prezi/content/intro.mdx new file mode 100644 index 00000000..c570381d --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/prezi/content/intro.mdx @@ -0,0 +1 @@ +Prezi Present builds presentations on one big canvas you zoom around, instead of a stack of slides. Its keys handle copying and grouping, panning and zooming the canvas, and resizing or snapping objects as you drag them. diff --git a/app/(site)/(directories)/keyboard-shortcuts/prezi/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/prezi/page.tsx index fac56853..d8b56ff1 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/prezi/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/prezi/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/prezi"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/pro-tools/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/pro-tools/content/intro.mdx new file mode 100644 index 00000000..9e25961c --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/pro-tools/content/intro.mdx @@ -0,0 +1 @@ +Pro Tools is Avid's audio workstation for recording, editing, and mixing in music and post-production. Its shortcuts cover playback and recording, the edit modes and tools, selecting and nudging clips, MIDI and clip gain, and the menus. diff --git a/app/(site)/(directories)/keyboard-shortcuts/pro-tools/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/pro-tools/page.tsx index 10b43f90..5f45f255 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/pro-tools/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/pro-tools/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/pro-tools"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/protopie/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/protopie/content/intro.mdx new file mode 100644 index 00000000..110f1bde --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/protopie/content/intro.mdx @@ -0,0 +1 @@ +ProtoPie turns designs into interactive prototypes that behave like real apps, without writing code. Its shortcuts open and save pies, pick drawing tools, arrange layers, adjust interaction timing, and show or hide panels. diff --git a/app/(site)/(directories)/keyboard-shortcuts/protopie/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/protopie/page.tsx index 671e68c6..60f4e01f 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/protopie/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/protopie/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/protopie"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/pycharm/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/pycharm/content/intro.mdx new file mode 100644 index 00000000..db45a478 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/pycharm/content/intro.mdx @@ -0,0 +1 @@ +PyCharm is JetBrains' editor for Python, with code checks, a debugger, and project tools built in. Its default keymap covers Search Everywhere and Find Usages, basic editing, running and debugging, and moving around the editor. diff --git a/app/(site)/(directories)/keyboard-shortcuts/pycharm/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/pycharm/page.tsx index 5f719b55..5e69f91f 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/pycharm/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/pycharm/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/pycharm"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/quickbooks-online/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/quickbooks-online/content/intro.mdx new file mode 100644 index 00000000..9598b490 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/quickbooks-online/content/intro.mdx @@ -0,0 +1 @@ +QuickBooks Online is Intuit's accounting software for small businesses, used in a web browser. Its shortcuts move through forms and dropdowns, jump dates in date fields, save transactions, and work in registers and payroll. diff --git a/app/(site)/(directories)/keyboard-shortcuts/quickbooks-online/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/quickbooks-online/page.tsx index cbd810f4..5d209a67 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/quickbooks-online/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/quickbooks-online/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/quickbooks-online"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/raycast/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/raycast/content/intro.mdx new file mode 100644 index 00000000..e7c93009 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/raycast/content/intro.mdx @@ -0,0 +1 @@ +Raycast is a launcher you open with one hotkey to search files, run commands, and use extensions. These keys open Raycast, move through results and the Action Panel, act on items, and drive AI Chat. diff --git a/app/(site)/(directories)/keyboard-shortcuts/raycast/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/raycast/page.tsx index acd0811c..cc84e278 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/raycast/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/raycast/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/raycast"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/reddit/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/reddit/content/intro.mdx new file mode 100644 index 00000000..1a1e39e9 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/reddit/content/intro.mdx @@ -0,0 +1 @@ +Reddit is where people talk in topic communities through posts and comment threads. On the desktop site, single-letter keys move between posts and comments, vote, reply, and save, and other keys control video playback. diff --git a/app/(site)/(directories)/keyboard-shortcuts/reddit/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/reddit/page.tsx index 2a3205dd..207a6bc3 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/reddit/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/reddit/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/reddit"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/riverside-fm/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/riverside-fm/content/intro.mdx new file mode 100644 index 00000000..2b399333 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/riverside-fm/content/intro.mdx @@ -0,0 +1 @@ +Riverside is a remote studio for recording podcasts and video interviews, with an editor that works from the transcript. Its editor keys play and scroll, select and search transcript text, split and correct recordings, and add scenes or comments. diff --git a/app/(site)/(directories)/keyboard-shortcuts/riverside-fm/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/riverside-fm/page.tsx index c7e06a07..f07d2bc1 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/riverside-fm/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/riverside-fm/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/riverside-fm"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/rocket-chat/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/rocket-chat/content/intro.mdx new file mode 100644 index 00000000..72839182 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/rocket-chat/content/intro.mdx @@ -0,0 +1 @@ +Rocket.Chat is open source team chat that companies can host on their own servers. Its few documented keys search channels and people and mark messages read, and the rest move around and edit in the message composer. diff --git a/app/(site)/(directories)/keyboard-shortcuts/rocket-chat/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/rocket-chat/page.tsx index da88ca2a..bf615b29 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/rocket-chat/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/rocket-chat/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/rocket-chat"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/rstudio/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/rstudio/content/intro.mdx new file mode 100644 index 00000000..91761ecd --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/rstudio/content/intro.mdx @@ -0,0 +1 @@ +RStudio is Posit's editor for the R language, with the console, plots, and help in panes beside your code. Its shortcuts run the command palette and console, move through source files, fold code, find and edit, and handle plots, Git, and builds. diff --git a/app/(site)/(directories)/keyboard-shortcuts/rstudio/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/rstudio/page.tsx index 726eaf47..57c1bab9 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/rstudio/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/rstudio/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/rstudio"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/safari/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/safari/content/intro.mdx new file mode 100644 index 00000000..ccceb608 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/safari/content/intro.mdx @@ -0,0 +1 @@ +Safari is Apple's web browser, and on a Mac it's the one that comes built in. These keys scroll pages, switch and pick tabs, go back and forward, zoom, and open the Reading List, Reader, and bookmarks. diff --git a/app/(site)/(directories)/keyboard-shortcuts/safari/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/safari/page.tsx index 5824d657..27f9b9e7 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/safari/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/safari/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/safari"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/salesforce/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/salesforce/content/intro.mdx new file mode 100644 index 00000000..ad0c473a --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/salesforce/content/intro.mdx @@ -0,0 +1 @@ +Salesforce is a customer relationship platform where sales and service teams track accounts, deals, and cases. Its Lightning Experience keys edit records and move around the app, and console apps add keys for workspace tabs, History, and Omni-Channel. diff --git a/app/(site)/(directories)/keyboard-shortcuts/salesforce/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/salesforce/page.tsx index ec2e522b..c44f6548 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/salesforce/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/salesforce/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/salesforce"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/scrivener/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/scrivener/content/intro.mdx new file mode 100644 index 00000000..d11afd00 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/scrivener/content/intro.mdx @@ -0,0 +1 @@ +Scrivener is a writing app for long projects like novels and theses, where you write in small pieces and arrange them in a binder. The keys below handle projects, editing and formatting text, moving documents around the binder, and zoom. diff --git a/app/(site)/(directories)/keyboard-shortcuts/scrivener/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/scrivener/page.tsx index a750ed97..9cb904c4 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/scrivener/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/scrivener/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/scrivener"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/signal/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/signal/content/intro.mdx new file mode 100644 index 00000000..5bfaec7e --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/signal/content/intro.mdx @@ -0,0 +1 @@ +Signal is a private messaging app with end-to-end encryption, and these keys are for Signal Desktop. They move between chats, act on selected messages and the composer, and mute, answer, or start calls. diff --git a/app/(site)/(directories)/keyboard-shortcuts/signal/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/signal/page.tsx index 6c5a412e..8c9747f9 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/signal/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/signal/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/signal"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/simplenote/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/simplenote/content/intro.mdx new file mode 100644 index 00000000..bca8f71f --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/simplenote/content/intro.mdx @@ -0,0 +1 @@ +Simplenote is a free, plain-text notes app that syncs across your devices. Its desktop keys are few: make, find, print, and delete notes, add checklist items, switch on focus mode or Markdown preview, and change font size. diff --git a/app/(site)/(directories)/keyboard-shortcuts/simplenote/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/simplenote/page.tsx index 72f531fd..71437afa 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/simplenote/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/simplenote/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/simplenote"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/sketch/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/sketch/content/intro.mdx new file mode 100644 index 00000000..8971548a --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/sketch/content/intro.mdx @@ -0,0 +1 @@ +Sketch is a Mac design app for interfaces and icons, with a web app for sharing and handoff. These Mac keys run the Command Bar and documents, switch views and zoom the canvas, add comments, find layers, and style and arrange text. diff --git a/app/(site)/(directories)/keyboard-shortcuts/sketch/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/sketch/page.tsx index f7f2961b..a876e962 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/sketch/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/sketch/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/sketch"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/sketchup/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/sketchup/content/intro.mdx new file mode 100644 index 00000000..f2b64c51 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/sketchup/content/intro.mdx @@ -0,0 +1 @@ +SketchUp is a 3D modeling app that architects, woodworkers, and hobbyists use to draw buildings and objects. Single-letter keys pick its tools: select, line, and rectangle, then push/pull, move, and rotate, plus orbit, pan, and zoom. diff --git a/app/(site)/(directories)/keyboard-shortcuts/sketchup/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/sketchup/page.tsx index 9c156fd5..5741d666 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/sketchup/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/sketchup/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/sketchup"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/slack/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/slack/content/intro.mdx new file mode 100644 index 00000000..a57f16e1 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/slack/content/intro.mdx @@ -0,0 +1 @@ +Slack is chat for work, organized into channels, direct messages, and threads. Its shortcuts jump between unread conversations, switch workspaces and tabs, edit and format messages, and work inside canvases. diff --git a/app/(site)/(directories)/keyboard-shortcuts/slack/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/slack/page.tsx index 48af7777..a9a37fd5 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/slack/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/slack/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/slack"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/smartsheet/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/smartsheet/content/intro.mdx new file mode 100644 index 00000000..0a06d380 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/smartsheet/content/intro.mdx @@ -0,0 +1 @@ +Smartsheet is a work management app that looks like a spreadsheet but tracks projects, tasks, and owners. You can edit cells, find rows, indent tasks into a hierarchy, apply formatting, and select rows, columns, and cards. diff --git a/app/(site)/(directories)/keyboard-shortcuts/smartsheet/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/smartsheet/page.tsx index 3eebe7df..ffd6d76a 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/smartsheet/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/smartsheet/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/smartsheet"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/solidworks/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/solidworks/content/intro.mdx new file mode 100644 index 00000000..f6c98baf --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/solidworks/content/intro.mdx @@ -0,0 +1 @@ +SOLIDWORKS is Dassault's CAD software for designing parts and assemblies in 3D on Windows. Its shortcuts rebuild and copy, rotate and zoom the view, control selection and sketch relations, and help while mating parts. diff --git a/app/(site)/(directories)/keyboard-shortcuts/solidworks/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/solidworks/page.tsx index 491550f2..ae901989 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/solidworks/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/solidworks/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/solidworks"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/spark-mail/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/spark-mail/content/intro.mdx new file mode 100644 index 00000000..9dbd685f --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/spark-mail/content/intro.mdx @@ -0,0 +1 @@ +Spark is an email app from Readdle that sorts your inbox and lets teams share messages. Its keys move through mail and reply, archive, or mark it, open folders like Done and Pinned, and write and format new messages. diff --git a/app/(site)/(directories)/keyboard-shortcuts/spark-mail/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/spark-mail/page.tsx index d0a18262..7dc4767e 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/spark-mail/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/spark-mail/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/spark-mail"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/spotify/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/spotify/content/intro.mdx new file mode 100644 index 00000000..53e5ad12 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/spotify/content/intro.mdx @@ -0,0 +1 @@ +Spotify streams music and podcasts, and its desktop app has keys so you can control it without hunting for buttons. They open search and your Library, filter lists, and play, pause, skip, shuffle, repeat, or change volume. diff --git a/app/(site)/(directories)/keyboard-shortcuts/spotify/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/spotify/page.tsx index 49b791a5..ef138337 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/spotify/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/spotify/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/spotify"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/squarespace/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/squarespace/content/intro.mdx new file mode 100644 index 00000000..c0215013 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/squarespace/content/intro.mdx @@ -0,0 +1 @@ +Squarespace is a website builder where you edit pages visually from templates. Its editor keys move around your site, arrange and resize blocks in Fluid Engine, and set headings, links, and text styles. diff --git a/app/(site)/(directories)/keyboard-shortcuts/squarespace/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/squarespace/page.tsx index e09a125a..5eeaafa1 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/squarespace/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/squarespace/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/squarespace"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/sublime-text/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/sublime-text/content/intro.mdx new file mode 100644 index 00000000..fe53ba68 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/sublime-text/content/intro.mdx @@ -0,0 +1 @@ +Sublime Text is a fast, lightweight code editor known for multiple selections and its Goto Anything search. These keys edit and move lines, quick-open files, jump to symbols and lines, run builds, and switch tabs or fold code. diff --git a/app/(site)/(directories)/keyboard-shortcuts/sublime-text/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/sublime-text/page.tsx index 6e8d1063..eb7dbf24 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/sublime-text/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/sublime-text/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/sublime-text"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/superhuman/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/superhuman/content/intro.mdx new file mode 100644 index 00000000..f6ce6b46 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/superhuman/content/intro.mdx @@ -0,0 +1 @@ +Superhuman is an email client built for working through your inbox at speed, mostly from the keyboard. Its single keys triage conversations, compose and format replies, and jump between Inbox, Sent, Drafts, and your other tabs. diff --git a/app/(site)/(directories)/keyboard-shortcuts/superhuman/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/superhuman/page.tsx index a852fedf..df3dddd9 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/superhuman/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/superhuman/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/superhuman"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/tableau/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/tableau/content/intro.mdx new file mode 100644 index 00000000..ac36984e --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/tableau/content/intro.mdx @@ -0,0 +1 @@ +Tableau lets you drag data fields onto a sheet to build charts, then combine them into dashboards. These Tableau Desktop keys open and save workbooks, describe fields and refresh data, and select marks, labels, and pages. diff --git a/app/(site)/(directories)/keyboard-shortcuts/tableau/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/tableau/page.tsx index 4e970ed2..06d32996 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/tableau/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/tableau/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/tableau"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/tableplus/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/tableplus/content/intro.mdx new file mode 100644 index 00000000..6bb421cc --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/tableplus/content/intro.mdx @@ -0,0 +1 @@ +TablePlus is a native app for working with databases like PostgreSQL, MySQL, and SQLite. Use its keys to open connections and tabs, run and format SQL, and copy, insert, filter, or duplicate rows in a table. diff --git a/app/(site)/(directories)/keyboard-shortcuts/tableplus/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/tableplus/page.tsx index ed0b1582..7cab7bcf 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/tableplus/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/tableplus/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/tableplus"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/tally-forms/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/tally-forms/content/intro.mdx new file mode 100644 index 00000000..a08caffc --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/tally-forms/content/intro.mdx @@ -0,0 +1 @@ +Tally is a form builder that works like a document: you type questions as blocks on a page. From the keyboard you can select and move blocks, format text, open the block and command menus, and toggle required, hidden, or logic settings. diff --git a/app/(site)/(directories)/keyboard-shortcuts/tally-forms/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/tally-forms/page.tsx index b6bbfec0..ecc75f85 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/tally-forms/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/tally-forms/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/tally-forms"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/telegram/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/telegram/content/intro.mdx new file mode 100644 index 00000000..655fc751 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/telegram/content/intro.mdx @@ -0,0 +1 @@ +Telegram keeps your chats, groups, and channels in its cloud, so the desktop app picks up where your phone left off. Its keys lock or quit the app, jump between chats and folders, and send, schedule, or mark messages read. diff --git a/app/(site)/(directories)/keyboard-shortcuts/telegram/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/telegram/page.tsx index 90208224..39a303c2 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/telegram/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/telegram/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/telegram"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/things-3/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/things-3/content/intro.mdx new file mode 100644 index 00000000..e96c8442 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/things-3/content/intro.mdx @@ -0,0 +1 @@ +Things 3 is a to-do app for Mac that sorts tasks into Today, Upcoming, Anytime, and Someday. Its shortcuts create and edit to-dos and projects, jump between lists, and format notes with Markdown and checklists. diff --git a/app/(site)/(directories)/keyboard-shortcuts/things-3/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/things-3/page.tsx index a1a8f153..60d70c77 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/things-3/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/things-3/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/things-3"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/tmux/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/tmux/content/intro.mdx new file mode 100644 index 00000000..41594e2c --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/tmux/content/intro.mdx @@ -0,0 +1 @@ +tmux keeps terminal sessions running after you disconnect and splits one window into many panes. Press Ctrl+B first, then the key. The keys here manage sessions and windows, split and resize panes, open copy mode, and paste copied text. diff --git a/app/(site)/(directories)/keyboard-shortcuts/tmux/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/tmux/page.tsx index 3c9cc635..579181ec 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/tmux/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/tmux/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/tmux"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/todoist/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/todoist/content/intro.mdx new file mode 100644 index 00000000..2bbc325b --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/todoist/content/intro.mdx @@ -0,0 +1 @@ +Todoist is a to-do list app that turns typed phrases like "every Monday" into due dates. Its keys open Quick Add, even from outside the app on desktop, then add and complete tasks, sort projects, and switch between list, board, and calendar layouts. diff --git a/app/(site)/(directories)/keyboard-shortcuts/todoist/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/todoist/page.tsx index 07a8d80b..dbbdb2e8 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/todoist/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/todoist/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/todoist"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/typora/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/typora/content/intro.mdx new file mode 100644 index 00000000..1118f3e9 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/typora/content/intro.mdx @@ -0,0 +1 @@ +Typora is a Markdown editor that shows formatting as you type, with no separate preview pane. From the keyboard you open files and tabs, edit and search text, set headings and insert tables or code blocks, and toggle the sidebar, source mode, and focus mode. diff --git a/app/(site)/(directories)/keyboard-shortcuts/typora/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/typora/page.tsx index d7efc682..70f4a938 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/typora/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/typora/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/typora"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/ulysses/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/ulysses/content/intro.mdx new file mode 100644 index 00000000..3a6cd7a4 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/ulysses/content/intro.mdx @@ -0,0 +1 @@ +Ulysses is a Markdown writing app for Mac where every text lives as a sheet in one library. Keys here create and split sheets and groups, search the library, toggle editor views and markup, and edit tables and export. diff --git a/app/(site)/(directories)/keyboard-shortcuts/ulysses/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/ulysses/page.tsx index bc37397d..7588b0e8 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/ulysses/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/ulysses/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/ulysses"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/vim/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/vim/content/intro.mdx new file mode 100644 index 00000000..fca1ee9c --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/vim/content/intro.mdx @@ -0,0 +1 @@ +Vim is a keyboard-driven text editor: you switch between modes to move, type, and change text. The commands here move the cursor, edit with operators and registers, search and replace, and handle windows, buffers, and files. diff --git a/app/(site)/(directories)/keyboard-shortcuts/vim/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/vim/page.tsx index 2e60a652..8dd267eb 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/vim/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/vim/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/vim"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/visual-studio/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/visual-studio/content/intro.mdx new file mode 100644 index 00000000..0cee3315 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/visual-studio/content/intro.mdx @@ -0,0 +1 @@ +Visual Studio is Microsoft's full IDE for .NET and C++ work on Windows, separate from the lighter VS Code. Its default General profile keys build and debug, edit and navigate code, manage files and projects, and refactor. diff --git a/app/(site)/(directories)/keyboard-shortcuts/visual-studio/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/visual-studio/page.tsx index 70fc1503..0dbd784d 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/visual-studio/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/visual-studio/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/visual-studio"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/vmware-workstation/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/vmware-workstation/content/intro.mdx new file mode 100644 index 00000000..f61cd43e --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/vmware-workstation/content/intro.mdx @@ -0,0 +1 @@ +With VMware Workstation, a Windows or Linux PC can run other operating systems in a window or full screen. Its hot keys grab and release your keyboard and mouse, send Ctrl+Alt+Delete to a guest, switch machines in full screen, and toggle Unity mode. diff --git a/app/(site)/(directories)/keyboard-shortcuts/vmware-workstation/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/vmware-workstation/page.tsx index 5b2d9359..30f931fc 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/vmware-workstation/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/vmware-workstation/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/vmware-workstation"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/vscode/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/vscode/content/intro.mdx new file mode 100644 index 00000000..faa50408 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/vscode/content/intro.mdx @@ -0,0 +1 @@ +Visual Studio Code is Microsoft's free code editor, which you extend for the languages you write. Its default keys here cover multi-cursor editing, jumping to files and symbols, workspace search, split editors, the terminal, and the debugger. diff --git a/app/(site)/(directories)/keyboard-shortcuts/vscode/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/vscode/page.tsx index 6bbb6c3c..046708b6 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/vscode/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/vscode/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/vscode"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/warp/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/warp/content/intro.mdx new file mode 100644 index 00000000..031e5e1f --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/warp/content/intro.mdx @@ -0,0 +1 @@ +Warp is a modern terminal that groups each command and its output into a block you can select and copy. Keys here open command search and Workflows, act on blocks, split panes and tabs, and edit the input line. diff --git a/app/(site)/(directories)/keyboard-shortcuts/warp/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/warp/page.tsx index 949df68c..472dbf24 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/warp/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/warp/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/warp"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/webflow/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/webflow/content/intro.mdx new file mode 100644 index 00000000..08da4aeb --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/webflow/content/intro.mdx @@ -0,0 +1 @@ +Webflow is a visual website builder for designers who want control over HTML and CSS without writing it. Its Designer keys open panels, select and edit elements, switch breakpoints, move around the canvas, and work the interactions timeline. diff --git a/app/(site)/(directories)/keyboard-shortcuts/webflow/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/webflow/page.tsx index ca2177be..c05b6ffb 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/webflow/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/webflow/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/webflow"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/webstorm/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/webstorm/content/intro.mdx new file mode 100644 index 00000000..d71ceb6b --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/webstorm/content/intro.mdx @@ -0,0 +1 @@ +WebStorm is built for JavaScript and TypeScript work, with testing and debugging in the same window. Out of the box, its keys handle search and navigation, code completion, refactoring and generating code, files and tabs, and running, debugging, and version control. diff --git a/app/(site)/(directories)/keyboard-shortcuts/webstorm/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/webstorm/page.tsx index 992a8525..be14bd3a 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/webstorm/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/webstorm/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/webstorm"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/whimsical/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/whimsical/content/intro.mdx new file mode 100644 index 00000000..b4a111e9 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/whimsical/content/intro.mdx @@ -0,0 +1 @@ +Whimsical is a visual workspace for flowcharts, wireframes, mind maps, and sticky notes. With the keyboard you can search files, zoom and fit boards, add diagram shapes, grow mind map nodes, and size and format sticky notes. diff --git a/app/(site)/(directories)/keyboard-shortcuts/whimsical/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/whimsical/page.tsx index 34fe091f..d8aae547 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/whimsical/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/whimsical/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/whimsical"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/windows-file-explorer/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/windows-file-explorer/content/intro.mdx new file mode 100644 index 00000000..4e756471 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/windows-file-explorer/content/intro.mdx @@ -0,0 +1 @@ +File Explorer is where you browse, open, and manage files and folders on Windows. Its keys focus the address bar and search, open windows and tabs, move between tabs, and rename items. diff --git a/app/(site)/(directories)/keyboard-shortcuts/windows-file-explorer/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/windows-file-explorer/page.tsx index af187678..392dad02 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/windows-file-explorer/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/windows-file-explorer/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/windows-file-explorer"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/windows-snipping-tool/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/windows-snipping-tool/content/intro.mdx new file mode 100644 index 00000000..9514b908 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/windows-snipping-tool/content/intro.mdx @@ -0,0 +1 @@ +Snipping Tool is the screenshot and screen recording app built into Windows. Its keys open the capture overlay from anywhere, grab the full screen, and then pick a mode, set a delay, copy, or save in the editor. diff --git a/app/(site)/(directories)/keyboard-shortcuts/windows-snipping-tool/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/windows-snipping-tool/page.tsx index 9762c9ff..3129da35 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/windows-snipping-tool/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/windows-snipping-tool/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/windows-snipping-tool"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/windows-terminal/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/windows-terminal/content/intro.mdx new file mode 100644 index 00000000..99901ae8 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/windows-terminal/content/intro.mdx @@ -0,0 +1 @@ +Windows Terminal holds Command Prompt, PowerShell, and WSL shells in tabs and split panes. Its keys open and switch tabs, split and resize panes, copy and paste, change text size, search scrollback, and open the command palette. diff --git a/app/(site)/(directories)/keyboard-shortcuts/windows-terminal/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/windows-terminal/page.tsx index f8c468ee..3d01477e 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/windows-terminal/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/windows-terminal/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/windows-terminal"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/windows/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/windows/content/intro.mdx new file mode 100644 index 00000000..8c46aeea --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/windows/content/intro.mdx @@ -0,0 +1 @@ +Windows shortcuts work across the whole PC, from the desktop to most apps you open. They cover text editing, switching apps and windows, Windows key combinations like snapping, File Explorer, Command Prompt, and virtual desktops and the taskbar. diff --git a/app/(site)/(directories)/keyboard-shortcuts/windows/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/windows/page.tsx index 3d751347..769bf351 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/windows/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/windows/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/windows"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/winmerge/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/winmerge/content/intro.mdx new file mode 100644 index 00000000..1411e8d3 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/winmerge/content/intro.mdx @@ -0,0 +1 @@ +WinMerge is a free Windows tool that compares two files or folders and shows what changed. Use the keys to step through differences, rescan and open items in a folder comparison, copy changes left or right, and resolve merge conflicts. diff --git a/app/(site)/(directories)/keyboard-shortcuts/winmerge/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/winmerge/page.tsx index ba954d52..8a0f5e08 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/winmerge/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/winmerge/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/winmerge"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/wireshark/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/wireshark/content/intro.mdx new file mode 100644 index 00000000..4549c16d --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/wireshark/content/intro.mdx @@ -0,0 +1 @@ +Wireshark captures network traffic and lets you inspect every packet in detail. Its keys move between packets and panes, open and save capture files, mark and comment packets, and start or stop captures. diff --git a/app/(site)/(directories)/keyboard-shortcuts/wireshark/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/wireshark/page.tsx index eb672cbb..66b1fd4d 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/wireshark/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/wireshark/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/wireshark"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/wix/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/wix/content/intro.mdx new file mode 100644 index 00000000..5a485dcd --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/wix/content/intro.mdx @@ -0,0 +1 @@ +Wix lets you build a website by dragging text, images, and buttons anywhere on the page. In the editor, keys copy, duplicate, and layer elements, save and preview the site, switch to the mobile view, and format text. diff --git a/app/(site)/(directories)/keyboard-shortcuts/wix/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/wix/page.tsx index f36a00d3..4134f6b2 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/wix/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/wix/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/wix"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/wondershare-filmora/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/wondershare-filmora/content/intro.mdx new file mode 100644 index 00000000..bd4c23e1 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/wondershare-filmora/content/intro.mdx @@ -0,0 +1 @@ +Filmora is a beginner-friendly video editor from Wondershare for YouTube clips, vlogs, and social videos. Its keys handle projects and imports, trim and move clips on the timeline, step through playback by frame, and set markers before export. diff --git a/app/(site)/(directories)/keyboard-shortcuts/wondershare-filmora/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/wondershare-filmora/page.tsx index 0214072f..a180044c 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/wondershare-filmora/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/wondershare-filmora/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/wondershare-filmora"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/wordpress-admin/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/wordpress-admin/content/intro.mdx new file mode 100644 index 00000000..a23ad651 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/wordpress-admin/content/intro.mdx @@ -0,0 +1 @@ +WordPress is open source software for building websites and blogs, which you write and manage from its admin dashboard. These keys work in the Block Editor and its text formatting, the older Classic Editor, the comments screen, and the Site Editor. diff --git a/app/(site)/(directories)/keyboard-shortcuts/wordpress-admin/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/wordpress-admin/page.tsx index d66ab8bd..dddd2efe 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/wordpress-admin/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/wordpress-admin/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/wordpress-admin"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/wps-office/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/wps-office/content/intro.mdx new file mode 100644 index 00000000..66101a9f --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/wps-office/content/intro.mdx @@ -0,0 +1 @@ +WPS Office is a free office suite with a word processor, spreadsheets, and slides that open Microsoft Office files. The keys are split by app: Writer, Spreadsheets, and Presentation on Windows, and a separate set for the Mac app. diff --git a/app/(site)/(directories)/keyboard-shortcuts/wps-office/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/wps-office/page.tsx index e79f0624..e174ddb9 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/wps-office/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/wps-office/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/wps-office"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/wrike/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/wrike/content/intro.mdx new file mode 100644 index 00000000..c06872f4 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/wrike/content/intro.mdx @@ -0,0 +1 @@ +Wrike is project management software that teams use to plan work, assign tasks, and track deadlines. Keys here create tasks and open search from anywhere, edit in Table view, and fill dates and move tasks in Gantt charts. diff --git a/app/(site)/(directories)/keyboard-shortcuts/wrike/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/wrike/page.tsx index ad13d3e1..7ff2f195 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/wrike/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/wrike/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/wrike"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/x-twitter/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/x-twitter/content/intro.mdx new file mode 100644 index 00000000..90385f74 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/x-twitter/content/intro.mdx @@ -0,0 +1 @@ +X, formerly Twitter, is the social network for short posts and replies. On x.com, single keys like, reply to, and repost the post in focus, move up and down your timeline, and jump to Home, Notifications, or your profile. diff --git a/app/(site)/(directories)/keyboard-shortcuts/x-twitter/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/x-twitter/page.tsx index 01e029c0..d77f1b19 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/x-twitter/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/x-twitter/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/x-twitter"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/youtrack/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/youtrack/content/intro.mdx new file mode 100644 index 00000000..4f928092 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/youtrack/content/intro.mdx @@ -0,0 +1 @@ +YouTrack is where software teams file bugs, plan their work on boards, and sketch ideas on whiteboards. Its keys move through and act on issue lists, edit and comment on a single issue, and add cards and text on whiteboards. diff --git a/app/(site)/(directories)/keyboard-shortcuts/youtrack/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/youtrack/page.tsx index e89acb36..a5da1ac9 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/youtrack/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/youtrack/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/youtrack"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/youtube/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/youtube/content/intro.mdx new file mode 100644 index 00000000..d897257b --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/youtube/content/intro.mdx @@ -0,0 +1 @@ +YouTube's player answers to the keyboard on any computer, so you can watch without reaching for the mouse. These keys play and pause, jump to a set point in the video, change volume and speed, turn on captions, and go full screen. diff --git a/app/(site)/(directories)/keyboard-shortcuts/youtube/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/youtube/page.tsx index 38e4007a..fa286a06 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/youtube/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/youtube/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/youtube"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/zbrush/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/zbrush/content/intro.mdx new file mode 100644 index 00000000..5e40efc5 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/zbrush/content/intro.mdx @@ -0,0 +1 @@ +ZBrush is Maxon's digital sculpting app, used for game characters, film creatures, and 3D printing. Its shortcuts open projects and palettes, pick colors and toggle canvas views, divide and sculpt meshes, and render or grab textures. diff --git a/app/(site)/(directories)/keyboard-shortcuts/zbrush/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/zbrush/page.tsx index fd7d3807..d7518eb4 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/zbrush/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/zbrush/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/zbrush"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/zed/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/zed/content/intro.mdx new file mode 100644 index 00000000..52e2b9e1 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/zed/content/intro.mdx @@ -0,0 +1 @@ +Zed is a fast code editor built for working with teammates and AI agents in the same window. Its default keys open files and pickers, edit and search code, run the agent panel, and drive the terminal and Git. diff --git a/app/(site)/(directories)/keyboard-shortcuts/zed/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/zed/page.tsx index fc87bc0d..9ae5304c 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/zed/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/zed/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/zed"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/zen-browser/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/zen-browser/content/intro.mdx new file mode 100644 index 00000000..ab9b68e4 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/zen-browser/content/intro.mdx @@ -0,0 +1 @@ +Zen Browser is a Firefox-based browser with vertical tabs, workspaces, and split views. Its own keys toggle compact mode, switch workspaces, and split the view, and the rest handle tabs, navigation, and page and developer tools. diff --git a/app/(site)/(directories)/keyboard-shortcuts/zen-browser/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/zen-browser/page.tsx index dc6ad9ac..2b2f210c 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/zen-browser/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/zen-browser/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/zen-browser"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/zendesk/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/zendesk/content/intro.mdx new file mode 100644 index 00000000..d0f6545b --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/zendesk/content/intro.mdx @@ -0,0 +1 @@ +Zendesk is customer support software where agents answer tickets from email, chat, and other channels. Its Agent Workspace keys jump between views and search, reply or add internal notes, set ticket status, and format replies. diff --git a/app/(site)/(directories)/keyboard-shortcuts/zendesk/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/zendesk/page.tsx index 58cf9663..775dbb52 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/zendesk/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/zendesk/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/zendesk"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/zeplin/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/zeplin/content/intro.mdx new file mode 100644 index 00000000..7e9f6011 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/zeplin/content/intro.mdx @@ -0,0 +1 @@ +Zeplin is where designers hand off finished screens so developers can read sizes, colors, and assets. Its desktop keys open search, the dashboard, and styleguides, select and rename screens and layers, and zoom or fit the view. diff --git a/app/(site)/(directories)/keyboard-shortcuts/zeplin/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/zeplin/page.tsx index 9233fdb4..c75a0654 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/zeplin/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/zeplin/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/zeplin"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/zoom/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/zoom/content/intro.mdx new file mode 100644 index 00000000..7f70dba8 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/zoom/content/intro.mdx @@ -0,0 +1 @@ +Zoom is a video meeting app for work calls, webinars, and team chat. Its desktop keys mute, share, and switch views in meetings, move between chats and calls, and jump between the app's tabs. diff --git a/app/(site)/(directories)/keyboard-shortcuts/zoom/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/zoom/page.tsx index d3b15619..a78ca4e9 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/zoom/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/zoom/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/zoom"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/keyboard-shortcuts/zulip/content/intro.mdx b/app/(site)/(directories)/keyboard-shortcuts/zulip/content/intro.mdx new file mode 100644 index 00000000..a9a69886 --- /dev/null +++ b/app/(site)/(directories)/keyboard-shortcuts/zulip/content/intro.mdx @@ -0,0 +1 @@ +Zulip sorts team chat by topic, so each conversation in a channel keeps its own named thread. Its keys reply and start topics, move between views and through messages, write and send messages, and edit or act on existing ones. diff --git a/app/(site)/(directories)/keyboard-shortcuts/zulip/page.tsx b/app/(site)/(directories)/keyboard-shortcuts/zulip/page.tsx index 6fdbd15f..f7832388 100644 --- a/app/(site)/(directories)/keyboard-shortcuts/zulip/page.tsx +++ b/app/(site)/(directories)/keyboard-shortcuts/zulip/page.tsx @@ -1,6 +1,7 @@ import app from "@/lib/shortcuts/apps/zulip"; import { KeyboardShortcutsAppPage } from "../keyboard-shortcuts-app-page"; +import Intro from "./content/intro.mdx"; export default function KeyboardShortcutsPage() { - return ; + return } />; } diff --git a/app/(site)/(directories)/launch-directories/content/corrections.mdx b/app/(site)/(directories)/launch-directories/content/corrections.mdx new file mode 100644 index 00000000..b263538a --- /dev/null +++ b/app/(site)/(directories)/launch-directories/content/corrections.mdx @@ -0,0 +1,3 @@ +## Found something wrong? + +Email [stack127@proton.me](mailto:stack127@proton.me) with the site's name and the page that shows the right answer. Each place's details also have a correction link. diff --git a/app/(site)/(directories)/launch-directories/content/free-listings.mdx b/app/(site)/(directories)/launch-directories/content/free-listings.mdx new file mode 100644 index 00000000..87b8a7bb --- /dev/null +++ b/app/(site)/(directories)/launch-directories/content/free-listings.mdx @@ -0,0 +1,5 @@ +## What does a free listing ask for? + +Some free plans ask for something in return, such as a backlink to the directory, proof that you own the domain, or votes and comments on other launches. Where we checked the free flow, the card lists these under Free plan. + +The Free without required backlink filter shows only places where we checked the free flow and found no required backlink. Free places we haven't checked yet are left out. diff --git a/app/(site)/(directories)/launch-directories/content/how-we-check.mdx b/app/(site)/(directories)/launch-directories/content/how-we-check.mdx new file mode 100644 index 00000000..774ba87f --- /dev/null +++ b/app/(site)/(directories)/launch-directories/content/how-we-check.mdx @@ -0,0 +1,17 @@ +## How do we check each place? + +We read each site's own submission page, pricing, and rules, then open one of its published listings to see what link it gives the maker. The details link each page we used, with the date we checked it. Some sources are older than the record date, which is our latest check of anything on that place. + +Card prices show the lowest price we found, and "From" means higher plans exist. Prices, review times, and link rules change, so check the site's own page before you pay. + +### What do "Not stated on their site" and "Couldn't verify" mean? + +We don't have a checked answer for that detail, and we don't guess one. + + +The site's own pages don't publish it. +A page blocked us, needed a login, or didn't load. It doesn't mean the site has closed. +Two of the site's own pages disagree. The details link both. +We found a submission page, but it didn't load when we checked. +We couldn't find where submissions start. Look on the site itself before you give up on it. + diff --git a/app/(site)/(directories)/launch-directories/content/intro.mdx b/app/(site)/(directories)/launch-directories/content/intro.mdx new file mode 100644 index 00000000..dbe05be6 --- /dev/null +++ b/app/(site)/(directories)/launch-directories/content/intro.mdx @@ -0,0 +1 @@ +Places to submit a new product, from launch boards like Product Hunt to AI tool lists and software review sites. Filter by category, cost, or link type, then open a card to see who can submit, how long review takes, and every page we checked, with its date. diff --git a/app/(site)/(directories)/launch-directories/content/launch-timing.mdx b/app/(site)/(directories)/launch-directories/content/launch-timing.mdx new file mode 100644 index 00000000..82ff55ad --- /dev/null +++ b/app/(site)/(directories)/launch-directories/content/launch-timing.mdx @@ -0,0 +1,5 @@ +## How long until my product launches? + +It depends on two waits: approval, then a launch slot. Some sites review within a day, while others publish free queues of several months. Where we checked both, the details list them separately. + +A date marked "Our submission" is the date we got for our own product. Yours may differ. diff --git a/app/(site)/(directories)/launch-directories/content/link-types.mdx b/app/(site)/(directories)/launch-directories/content/link-types.mdx new file mode 100644 index 00000000..00fe33f9 --- /dev/null +++ b/app/(site)/(directories)/launch-directories/content/link-types.mdx @@ -0,0 +1,22 @@ +## Which launch directories give a dofollow link? + +Choose Dofollow under Link type to see them. Each result comes from one published listing we opened, or from the plan the site's terms describe, so free and paid listings on the same site can differ. + +[Google says](https://developers.google.com/search/docs/crawling-indexing/qualify-outbound-links) links marked nofollow, ugc, or sponsored will generally not be followed. A dofollow link still doesn't promise indexing, rankings, or traffic. + + +The sampled link had no nofollow, ugc, or sponsored value, or the site's terms promise that. +The link asks search engines not to follow it. +The link is marked as user-generated content. +The link is marked as paid. +The link carried more than one value, such as ugc and nofollow. +Free, paid, or top-ranked listings get different links. The details say which. +The sampled listing doesn't link to the maker's own site. + + +These two labels mean we have no checked result: + + +We couldn't read a sampled link, but other evidence points to nofollow. +We couldn't open a published listing or read its link. + diff --git a/app/(site)/(directories)/launch-directories/content/recommended-order.mdx b/app/(site)/(directories)/launch-directories/content/recommended-order.mdx new file mode 100644 index 00000000..8d12973b --- /dev/null +++ b/app/(site)/(directories)/launch-directories/content/recommended-order.mdx @@ -0,0 +1,7 @@ +## Which launch sites come first? + +Six well-known launch sites come first: Product Hunt, BetaList, DevHunt, Peerlist Launchpad, AlternativeTo, and SaaSHub. That's our pick of where most makers start, not a ranking by traffic. After them: + +1. Places with a checked submission page come before places without one. +2. Launch boards and beta sites come next, then startup and software listings, then AI, developer, design, and regional directories. +3. Within each group, free options come first, then dofollow links. diff --git a/app/(site)/(directories)/launch-directories/launch-directory-guide.tsx b/app/(site)/(directories)/launch-directories/launch-directory-guide.tsx index 7bf458fe..b89b50d1 100644 --- a/app/(site)/(directories)/launch-directories/launch-directory-guide.tsx +++ b/app/(site)/(directories)/launch-directories/launch-directory-guide.tsx @@ -1,63 +1,31 @@ -import { DirectoryPageContent } from "@/app/ui/directories/directory-page-content"; -import type { Stack127DirectoryPage } from "@/lib/directory-pages"; -import type { ReactNode } from "react"; -import type { Components } from "react-markdown"; -import { UiDataTable } from "@/app/ui/display"; +import type { ComponentPropsWithoutRef } from "react"; +import { NewTabContentLink } from "@/app/ui/content-elements"; import { proseClassName, proseFlowClassName } from "@/app/ui/site/prose"; +import Corrections from "./content/corrections.mdx"; +import FreeListings from "./content/free-listings.mdx"; +import HowWeCheck from "./content/how-we-check.mdx"; +import LaunchTiming from "./content/launch-timing.mdx"; +import LinkTypes from "./content/link-types.mdx"; +import RecommendedOrder from "./content/recommended-order.mdx"; import styles from "./launch-directories.module.css"; -type MeaningRow = { id: string; label: string; meaning: ReactNode }; - -const googleLinkGuide = "https://developers.google.com/search/docs/crawling-indexing/qualify-outbound-links"; - -// Results from a sampled listing's HTML or from the site's own terms. -const linkTypes: MeaningRow[] = [ - { id: "dofollow", label: "Dofollow", meaning: "The sampled link had no nofollow, ugc, or sponsored value, or the site's terms promise that. There's no dofollow HTML attribute, and it doesn't promise indexing, ranking, or traffic." }, - { id: "nofollow", label: "Nofollow", meaning: <>The link asks search engines not to follow it. It doesn't stop them finding your site through other links. See Google's definition. }, - { id: "ugc", label: "UGC", meaning: "The link is marked as user-generated content." }, - { id: "sponsored", label: "Sponsored", meaning: "The link is marked as paid." }, - { id: "multiple", label: "Mixed", meaning: "The sampled link carried more than one value, such as ugc and nofollow together. The details name them." }, - { id: "varies", label: "Varies", meaning: "Free, paid, or top-ranked listings get different links. The details say which." }, - { id: "none", label: "No link", meaning: "The sampled listing doesn't link to the maker's own site." }, -]; - -// No confirmed result. Keep these apart from the sampled findings above. -const unconfirmedLinkTypes: MeaningRow[] = [ - { id: "estimated-nofollow", label: "Likely nofollow", meaning: "An estimate, not a checked result. We couldn't read a sampled link, but other evidence points to nofollow. Treat it as unconfirmed." }, - { id: "unknown", label: "Couldn't verify", meaning: "We couldn't open a published listing or read its link. The link type is unknown." }, -]; - -const missingLabels: MeaningRow[] = [ - { id: "not-stated", label: "Not stated on their site", meaning: "The site's own pages don't publish this detail." }, - { id: "unverified", label: "Couldn't verify", meaning: "A page was blocked, needed a login, or didn't load. It doesn't mean the site has closed." }, - { id: "conflicting", label: "Conflicting info", meaning: "Two of the site's own pages disagree. The sources in the details link both." }, - { id: "unavailable", label: "Submission page unavailable", meaning: "We found a submission page, but it didn't load when we checked." }, - { id: "not-found", label: "Submission page not found", meaning: "We couldn't find where submissions start. Check the site itself before you give up on it." }, -]; - -function MeaningTable({ ariaLabel, rows }: { ariaLabel: string; rows: MeaningRow[] }) { - return ({ id: row.id, cells: { label: row.label, meaning: row.meaning } }))} - />; +// The results header links to these two headings, so each file's h2 keeps a fixed id. +function headingWithId(id: string) { + return function Heading(props: ComponentPropsWithoutRef<"h2">) { + return

; + }; } -const guideHeadingComponents: Components = { - h2: ({ children }) =>

{children}

, - h3: ({ children }) =>

{children}

, -}; +// Source links open in a new tab, so visitors keep their filtered list. +const a = NewTabContentLink; -export function LaunchDirectoryGuide({ directoryPage }: { directoryPage: Stack127DirectoryPage }) { +export function LaunchDirectoryGuide() { return
- - - - - - - - - + + + + + +
; } diff --git a/app/(site)/(directories)/launch-directories/page.tsx b/app/(site)/(directories)/launch-directories/page.tsx index 36f4ea20..1dc8e8d5 100644 --- a/app/(site)/(directories)/launch-directories/page.tsx +++ b/app/(site)/(directories)/launch-directories/page.tsx @@ -1,7 +1,6 @@ import { getRequiredDirectoryPage } from "@/lib/directory-pages"; -import { DirectoryPageTitle, DirectoryPageContent } from "@/app/ui/directories/directory-page-content"; +import { DirectoryPageTitle } from "@/app/ui/directories/directory-page-content"; import { PageMeta } from "@/app/ui/site/page-meta"; -import { ContentMarkdown } from "@/app/ui/content-markdown"; import { DirectoryQueryProvider } from "@/app/ui/directories/directory-query"; import { AppShell, SidebarLabel } from "@/app/ui/site/app-shell"; import { EntryHero } from "@/app/ui/site/entry-hero"; @@ -11,6 +10,7 @@ import { DirectoryTitleIcon } from "@/app/ui/directories/directory-title-icon"; import { getLaunchDirectorySnapshot, launchCategories } from "@/lib/launch-directories"; import { filterLaunchDirectories } from "@/lib/launch-directories-query"; import { getRequiredPublishedPage } from "@/lib/page-registry"; +import Intro from "./content/intro.mdx"; import { LaunchDirectoryGuide } from "./launch-directory-guide"; import { costOptions, linkOptions } from "./launch-directory-options"; import { LaunchDirectoryFilters, LaunchDirectoryResults } from "./launch-directory-view"; @@ -39,14 +39,14 @@ export default async function LaunchDirectoriesPage() {

{" "}

- +
{/* Data freshness marker for the cache verifier, not page metadata. */}
- +
- +
{licenseGroups.map((group) => { @@ -259,21 +272,21 @@ export default async function SoftwareLicensesPage() { className={`license-section license-narrative ${proseClassName} ${proseFlowClassName}`} id="open-source-vs-source-available" > - +
- +
- +
diff --git a/app/(site)/(directories)/tld-directory/content/check-a-name.mdx b/app/(site)/(directories)/tld-directory/content/check-a-name.mdx new file mode 100644 index 00000000..55c73d03 --- /dev/null +++ b/app/(site)/(directories)/tld-directory/content/check-a-name.mdx @@ -0,0 +1,3 @@ +## How do I check a name under one of these endings? + +Use the [domain availability checker](/domain-availability) for one name, or [multi-TLD availability](/multi-tld-availability) to try one name across many endings. For a registered domain's registrar, dates, and status codes, use [domain lookup](/domain-lookup). diff --git a/app/(site)/(directories)/tld-directory/content/dnssec.mdx b/app/(site)/(directories)/tld-directory/content/dnssec.mdx new file mode 100644 index 00000000..6c9be6ad --- /dev/null +++ b/app/(site)/(directories)/tld-directory/content/dnssec.mdx @@ -0,0 +1,3 @@ +## Does a signed extension mean my domain uses DNSSEC? + +No. "Signed" means the ending itself has a DS record in the root zone, so domains under it can use DNSSEC. Each domain still needs to be signed by its DNS host, with its own DS record added through the registrar. To check one domain, use the [DNSSEC checker](/dnssec-checker). diff --git a/app/(site)/(directories)/tld-directory/content/how-many.mdx b/app/(site)/(directories)/tld-directory/content/how-many.mdx new file mode 100644 index 00000000..316a6848 --- /dev/null +++ b/app/(site)/(directories)/tld-directory/content/how-many.mdx @@ -0,0 +1 @@ +## How many domain extensions are there? diff --git a/app/(site)/(directories)/tld-directory/content/intro.mdx b/app/(site)/(directories)/tld-directory/content/intro.mdx new file mode 100644 index 00000000..cd34d7a1 --- /dev/null +++ b/app/(site)/(directories)/tld-directory/content/intro.mdx @@ -0,0 +1 @@ +Every top-level domain in the root zone, with its type, its operator, whether we can look up its registration data, and whether it's signed with DNSSEC. Search by ending or operator, or filter the list. The data comes from IANA, and the refresh date is below the table. diff --git a/app/(site)/(directories)/tld-directory/content/lookups.mdx b/app/(site)/(directories)/tld-directory/content/lookups.mdx new file mode 100644 index 00000000..d07e5369 --- /dev/null +++ b/app/(site)/(directories)/tld-directory/content/lookups.mdx @@ -0,0 +1,11 @@ +## Why can't some domain extensions be looked up? + +Our domain tools read registration data over RDAP, and some registries don't offer it. The Lookups column shows where each ending stands. + +| Lookups | What it means | +| --- | --- | +| Yes | The registry is in [IANA's RDAP directory](https://data.iana.org/rdap/dns.json). | +| Via our own list | The registry runs RDAP but isn't in IANA's directory. We added it after testing it with a real domain. The name under the label runs the service. | +| Cannot check | We know of no RDAP service for this ending, so our lookup and availability tools can't answer for it. | + +A "Cannot check" ending may still have a WHOIS server or a lookup on the registry's website. Its page in [IANA's root zone database](https://www.iana.org/domains/root/db) lists both. [Domain lookup](/domain-lookup) explains how RDAP and WHOIS differ. diff --git a/app/(site)/(directories)/tld-directory/content/prices.mdx b/app/(site)/(directories)/tld-directory/content/prices.mdx new file mode 100644 index 00000000..b539c4e3 --- /dev/null +++ b/app/(site)/(directories)/tld-directory/content/prices.mdx @@ -0,0 +1,3 @@ +## Why aren't domain prices listed? + +Prices change too often to keep right here. They vary by registrar, by promotion, and by whether the name is premium, so check at a registrar before you buy, and check the renewal price too. diff --git a/app/(site)/(directories)/tld-directory/content/sources.mdx b/app/(site)/(directories)/tld-directory/content/sources.mdx new file mode 100644 index 00000000..e4426092 --- /dev/null +++ b/app/(site)/(directories)/tld-directory/content/sources.mdx @@ -0,0 +1,7 @@ +## Where does this data come from? + +- Type and operator: [IANA's root zone database](https://www.iana.org/domains/root/db). +- DNSSEC: DS records in the [root zone file](https://www.internic.net/domain/root.zone). +- Lookups: [IANA's RDAP directory](https://data.iana.org/rdap/dns.json), plus the few registries we added by hand. + +A script rebuilds the table from these sources. If a source changes shape, the script stops instead of saving a partial list. diff --git a/app/(site)/(directories)/tld-directory/content/types.mdx b/app/(site)/(directories)/tld-directory/content/types.mdx new file mode 100644 index 00000000..82d9ce1f --- /dev/null +++ b/app/(site)/(directories)/tld-directory/content/types.mdx @@ -0,0 +1,11 @@ +## What do the domain extension types mean? + +The type is IANA's label for how an ending is run, and it hints at who can register under it. + +| Type | What it is | +| --- | --- | +| generic | Most endings, such as `.com` and `.xyz`. Most arrived from 2013 on, through ICANN's New gTLD Program. Brand endings, such as `.bmw`, are used only by their owner. | +| country-code | Two-letter endings for a country or territory, such as `.uk`, plus versions in other scripts, such as `.中国`, shown with their `xn--` form. Each sets its own rules. | +| sponsored | Endings for one community, such as `.edu` and `.gov`, often with eligibility rules. | +| generic-restricted | Older generic endings that launched with limits on who could register, such as `.biz` and `.pro`. | +| infrastructure | `.arpa`, used for reverse DNS. You can't register a name under it. | diff --git a/app/(site)/(directories)/tld-directory/page.tsx b/app/(site)/(directories)/tld-directory/page.tsx index 7a98ccbd..bf0b69f9 100644 --- a/app/(site)/(directories)/tld-directory/page.tsx +++ b/app/(site)/(directories)/tld-directory/page.tsx @@ -1,10 +1,8 @@ import { getRequiredDirectoryPage } from "@/lib/directory-pages"; -import { DirectoryPageTitle, DirectoryPageContent } from "@/app/ui/directories/directory-page-content"; +import { DirectoryPageTitle } from "@/app/ui/directories/directory-page-content"; import { PageMeta } from "@/app/ui/site/page-meta"; -import { ContentMarkdown } from "@/app/ui/content-markdown"; import { PageCanvas } from "@/app/ui/site/page-canvas"; import "@/app/(site)/(tools)/(domain)/domain-tools.css"; -import Link from "next/link"; import { AppShell } from "../../../ui/site/app-shell"; import { DomainToolsSidebar } from "@/app/(site)/(tools)/(domain)/domain-tools-sidebar"; import { TldTable, type TldRow } from "./tld-table"; @@ -12,15 +10,30 @@ import directory from "@/lib/domain/data/tld-directory.json" with { type: "json" import { DirectoryTitleIcon } from "@/app/ui/directories/directory-title-icon"; import { PageHeader } from "../../../ui/site/page-header"; import { proseSectionFlowClassName } from "../../../ui/site/prose"; +import CheckAName from "./content/check-a-name.mdx"; +import Dnssec from "./content/dnssec.mdx"; +import HowMany from "./content/how-many.mdx"; +import Intro from "./content/intro.mdx"; +import Lookups from "./content/lookups.mdx"; +import Prices from "./content/prices.mdx"; +import Sources from "./content/sources.mdx"; +import Types from "./content/types.mdx"; export default async function TldDirectoryPage() { const directoryPage = await getRequiredDirectoryPage("tld-directory"); const rows = directory.rows as TldRow[]; - const counts = directory.counts; + const signed = rows.filter((row) => row.dnssec).length; + const lookups = rows.filter((row) => row.rdap !== "none").length; + const refreshedOn = new Date(`${directory.fetchedAt}T00:00:00Z`).toLocaleDateString("en-US", { + day: "numeric", + month: "long", + timeZone: "UTC", + year: "numeric", + }); return ( } sidebarLabel="Domain tools sidebar" @@ -29,86 +42,46 @@ export default async function TldDirectoryPage() {

{" "}

- +

-
+
- +

- {counts.total.toLocaleString("en-US")} of them exist right now. Of those,{" "} - {counts.signed.toLocaleString("en-US")} are signed with DNSSEC and{" "} - {counts.rdapCovered.toLocaleString("en-US")} publish registration data that - can be looked up. The number moves as endings are added and retired, so the - table above was last refreshed on {directory.fetchedAt} from root zone list - version {directory.tldListVersion}. + There are {rows.length.toLocaleString("en-US")} top-level domains in the root zone. Of those,{" "} + {signed.toLocaleString("en-US")} are signed with DNSSEC, and we can look up registration data + for {lookups.toLocaleString("en-US")}. The table was last refreshed on {refreshedOn}, from root + zone list version {directory.tldListVersion}.

- -
-
- - - - - - - - - - - - - - - - - - -
generic - Open endings like .com, .app and{" "} - .xyz. Most of the root is this, and most of it arrived - after 2013 when ICANN opened applications. -
country-code - Two letter endings tied to a country or territory. Each is run under - its own national rules, which is why .de and{" "} - .uk behave nothing like each other or like{" "} - .com. -
sponsored - Endings run for a defined community with eligibility rules, such as{" "} - .edu or .aero. You cannot simply register - one. -
infrastructure - .arpa, used by the internet's own plumbing rather - than by anyone building a site. -
-
+
- +
- +
- +
- +
- +
diff --git a/app/(site)/(directories)/z-wave-devices/content/article.mdx b/app/(site)/(directories)/z-wave-devices/content/article.mdx new file mode 100644 index 00000000..27cc43a9 --- /dev/null +++ b/app/(site)/(directories)/z-wave-devices/content/article.mdx @@ -0,0 +1,30 @@ +## Will this Z-Wave device work with Home Assistant? + +Very likely, if it's certified for your region. Home Assistant's Z-Wave integration runs on Z-Wave JS, and [its docs](https://www.home-assistant.io/integrations/zwave_js/) say a device "may very well work as intended" without a device file. + +A configuration file adds the model's settings, such as configuration parameters and association groups, plus any fixes it needs. "No Z-Wave JS match" means we couldn't match a file, sometimes because the certificate lists no product ID. It doesn't mean the device fails. + +## Which Z-Wave frequency do I need? + +The one for your country. Z-Wave radios use different frequencies by region, and Home Assistant's docs say you can't change an end device's frequency, so buy devices made for your region. 700 and 800 series controllers can switch region. + +"US LR" on a card means Z-Wave Long Range, a newer US option that reaches farther. Home Assistant uses it when your adapter supports it. Devices without Long Range still join the same network. + +## Why do product IDs matter more than the name? + +A retail name can cover several hardware versions and regions, each with its own certificate. Z-Wave JS picks a configuration file from the manufacturer ID, product type, and product ID the device reports, and sometimes the firmware version. The details list these IDs and every certified variant, so you can match the exact one you're buying. + +## Where does this list come from? + +It joins two public sources by those product IDs. + +| Source | What it adds | +| --- | --- | +| [Z-Wave Alliance product catalog](https://products.z-wavealliance.org/) | Certification, frequency, device type, and product IDs | +| [Z-Wave JS device database](https://devices.zwave-js.io/) | Whether Z-Wave JS has a configuration file, and what it sets | + +Every product here is certified by the Z-Wave Alliance. We haven't tested them ourselves, so check the manual or configuration link in the details before you buy. + +## What about Zigbee and Matter devices? + +They use different radios and software, so check them in [Zigbee devices](/zigbee-devices) and [Matter devices](/matter-devices). diff --git a/app/(site)/(directories)/z-wave-devices/content/intro.mdx b/app/(site)/(directories)/z-wave-devices/content/intro.mdx new file mode 100644 index 00000000..925c9422 --- /dev/null +++ b/app/(site)/(directories)/z-wave-devices/content/intro.mdx @@ -0,0 +1 @@ +Search certified Z-Wave products by brand, model, or product ID, such as `ZW100` or `ZEN77`. Each card shows the radio frequency and whether Z-Wave JS, the driver Home Assistant uses, has a configuration file for it. The date above the cards shows when we last read the sources. diff --git a/app/(site)/(directories)/z-wave-devices/page.tsx b/app/(site)/(directories)/z-wave-devices/page.tsx index 3f8c5a15..eb1b2414 100644 --- a/app/(site)/(directories)/z-wave-devices/page.tsx +++ b/app/(site)/(directories)/z-wave-devices/page.tsx @@ -1,9 +1,11 @@ import { Waves } from "lucide-react"; import { HardwareDirectoryPage } from "../../../ui/directories/hardware-directory-page"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; import { getHardwareDirectorySnapshot } from "@/lib/hardware-directories"; export default async function ZWaveDevicesPage() { - return } intro={} config={{ detailFilterLabel: "Region or software support", icon: , route: "/z-wave-devices", diff --git a/app/(site)/(directories)/zigbee-coordinators/content/article.mdx b/app/(site)/(directories)/zigbee-coordinators/content/article.mdx new file mode 100644 index 00000000..05e67801 --- /dev/null +++ b/app/(site)/(directories)/zigbee-coordinators/content/article.mdx @@ -0,0 +1,30 @@ +## Which Zigbee coordinator should I buy? + +Start with the radio chipset, because it decides which firmware and software you can use. [Zigbee2MQTT recommends](https://www.zigbee2mqtt.io/guide/adapters/) Texas Instruments, Silicon Labs, and Dresden Elektronik adapters. [Home Assistant's ZHA docs](https://www.home-assistant.io/integrations/zha/) recommend its own adapters first, and list others it has tested. + +| Chipset on the card | Maker | What the docs say | +| --- | --- | --- | +| CC2652, CC1352 | Texas Instruments | Recommended by Zigbee2MQTT | +| EFR32MG21, EFR32MG24 | Silicon Labs | Recommended by Zigbee2MQTT | +| CC2530, CC2531, CC2538 | Texas Instruments, older | Not recommended. They run end-of-life firmware, and ZHA says CC2530 and CC2531 sticks struggle past 15 to 20 devices. | +| XBee 3 | Digi | ZHA supports it but doesn't recommend it | + +Dresden Elektronik adapters, sold as ConBee and RaspBee, show no chipset here. When a card says the chipset isn't published, check the manufacturer page in the details. + +## Should I get a USB or network coordinator? + +Get USB if the adapter can sit near the machine running ZHA or Zigbee2MQTT. Put it on a USB extension cable, away from the computer, and use a USB 2.0 port, as ZHA's docs recommend. + +A network coordinator lets you place the radio anywhere with an Ethernet cable. Zigbee2MQTT warns that adapters on Wi-Fi may be less stable, so it recommends wired Ethernet. + +## Will I need to pair my devices again? + +Usually not, if you keep a backup. Zigbee2MQTT says firmware updates on the same adapter don't need re-pairing, but moving to a different adapter may. ZHA can move a network between Silicon Labs, Texas Instruments, and ConBee radios from a ZHA backup. Devices then rejoin on their own, normally within an hour. + +## Where does this list come from? + +Each card comes from the coordinator records in [Blakadder's Zigbee device compatibility repository](https://zigbee.blakadder.com/), a community list. "Works with" shows the software those reports name. We haven't tested these adapters ourselves, so check the firmware your software needs on the manufacturer page before you buy. + +## Which Zigbee devices will work with my coordinator? + +That depends on ZHA or Zigbee2MQTT more than on the coordinator. Check exact models in [Zigbee devices](/zigbee-devices). diff --git a/app/(site)/(directories)/zigbee-coordinators/content/intro.mdx b/app/(site)/(directories)/zigbee-coordinators/content/intro.mdx new file mode 100644 index 00000000..a6c8cc87 --- /dev/null +++ b/app/(site)/(directories)/zigbee-coordinators/content/intro.mdx @@ -0,0 +1 @@ +A coordinator is the USB or network radio that runs your Zigbee network, and ZHA or Zigbee2MQTT talks to it. Search by model or chipset, such as `ZBDongle-P` or `EFR32MG21`, and open a card for its connection, chipset, and source links. The date above the cards shows when we last read the source. diff --git a/app/(site)/(directories)/zigbee-coordinators/page.tsx b/app/(site)/(directories)/zigbee-coordinators/page.tsx index 15378ced..20e46c35 100644 --- a/app/(site)/(directories)/zigbee-coordinators/page.tsx +++ b/app/(site)/(directories)/zigbee-coordinators/page.tsx @@ -1,9 +1,11 @@ import { RadioTower } from "lucide-react"; import { HardwareDirectoryPage } from "../../../ui/directories/hardware-directory-page"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; import { getHardwareDirectorySnapshot } from "@/lib/hardware-directories"; export default async function ZigbeeCoordinatorsPage() { - return } intro={} config={{ detailFilterLabel: "Connection or radio", icon: , route: "/zigbee-coordinators", diff --git a/app/(site)/(directories)/zigbee-devices/content/article.mdx b/app/(site)/(directories)/zigbee-devices/content/article.mdx new file mode 100644 index 00000000..2e1e6e1b --- /dev/null +++ b/app/(site)/(directories)/zigbee-devices/content/article.mdx @@ -0,0 +1,40 @@ +## Will my Zigbee device work with ZHA? + +Probably, if it follows the Zigbee standard, but no official list confirms it. [Home Assistant's ZHA docs](https://www.home-assistant.io/integrations/zha/) say there is no official compatibility list, because standard devices should work without device-specific code. Devices that bend the standard need a "quirk", a small fix written by volunteers. + +The ZHA results here come from community reports in [Blakadder's Zigbee device compatibility repository](https://zigbee.blakadder.com/). A device with no ZHA report hasn't failed with ZHA. Nobody has reported it there yet. + +## What does a Zigbee2MQTT listing mean? + +It means Zigbee2MQTT has a definition for that exact model, so it knows which features to show. A device without one can still pair, but [Zigbee2MQTT then guesses its features](https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html) from the standard and may miss some. + +The device details show what the definition adds: + + +The values Zigbee2MQTT can read or set, such as `brightness` or `occupancy`. +Whether the definition supports firmware updates over the air. +Yes means this is another brand's version of hardware Zigbee2MQTT already defines. + + +## Why does the exact model matter? + +Support belongs to a model number, not a product name. Brands reuse names across hardware revisions, and a newer revision may behave differently or not be supported yet. + +Tuya-based devices are the hardest case. Many report the same Zigbee model, such as `TS0601`, and differ only in a manufacturer code like `_TZE200_1fuxihti`. The device details list the codes each definition covers. Zigbee2MQTT and ZHA both show your device's code on its page after pairing. If yours isn't listed, its features may not match. + +## Where does this device list come from? + +It joins two public sources. A device is listed when either source knows it. When both name the same brand and model, the card shows both. + +| Source | What it adds | +| --- | --- | +| [Zigbee2MQTT supported devices](https://www.zigbee2mqtt.io/supported-devices/) | Zigbee2MQTT support, exposed fields, OTA updates, and device identifiers | +| [Blakadder compatibility repository](https://zigbee.blakadder.com/) | Community reports for ZHA, deCONZ, ioBroker, Tasmota, and other hubs | + +We haven't tested these devices ourselves. Support changes with new releases and device firmware, so open the source links in the device details before you buy. + +## Do you need a Zigbee coordinator? + +Yes. Every device here joins your network through a coordinator, the USB or network radio that ZHA or Zigbee2MQTT talks to. Coordinators aren't listed on this page. Compare their chipsets and firmware support in [Zigbee coordinators](/zigbee-coordinators). + +For other smart home radios, see [Z-Wave devices](/z-wave-devices) and [Matter devices](/matter-devices). diff --git a/app/(site)/(directories)/zigbee-devices/content/intro.mdx b/app/(site)/(directories)/zigbee-devices/content/intro.mdx new file mode 100644 index 00000000..bbec86c2 --- /dev/null +++ b/app/(site)/(directories)/zigbee-devices/content/intro.mdx @@ -0,0 +1 @@ +Search by brand, retail model, or feature to see whether a Zigbee device has a Zigbee2MQTT definition, a community report for ZHA, or both. Open a card for its features, device identifiers, and links to each source. The date above the cards shows when we last read those sources. diff --git a/app/(site)/(directories)/zigbee-devices/page.tsx b/app/(site)/(directories)/zigbee-devices/page.tsx index 32b42a12..429c33af 100644 --- a/app/(site)/(directories)/zigbee-devices/page.tsx +++ b/app/(site)/(directories)/zigbee-devices/page.tsx @@ -1,7 +1,6 @@ import { getRequiredDirectoryPage } from "@/lib/directory-pages"; -import { DirectoryPageTitle, DirectoryPageContent } from "@/app/ui/directories/directory-page-content"; +import { DirectoryPageTitle } from "@/app/ui/directories/directory-page-content"; import { PageMeta } from "@/app/ui/site/page-meta"; -import { ContentMarkdown } from "@/app/ui/content-markdown"; import { PageCanvas } from "@/app/ui/site/page-canvas"; import { RadioTower } from "lucide-react"; import { AppShell, SidebarLabel } from "@/app/ui/site/app-shell"; @@ -23,6 +22,8 @@ import { DirectoryQueryProvider } from "../../../ui/directories/directory-query" import { sortDevices, zigbeeIndexRecord, zigbeePageSize } from "./filters"; import { ZigbeeDeviceFilters, ZigbeeDeviceResults } from "./zigbee-device-view"; import styles from "./zigbee-devices.module.css"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; export default async function ZigbeeDevicesPage() { const directoryPage = await getRequiredDirectoryPage("zigbee-devices"); @@ -75,7 +76,7 @@ export default async function ZigbeeDevicesPage() {

{" "}

- +
- +
diff --git a/app/(site)/(tools)/(dns)/caa-checker/content/article.mdx b/app/(site)/(tools)/(dns)/caa-checker/content/article.mdx new file mode 100644 index 00000000..fc03aedf --- /dev/null +++ b/app/(site)/(tools)/(dns)/caa-checker/content/article.mdx @@ -0,0 +1,38 @@ +## How does CAA find the policy for a name? + +It uses the closest name that has CAA records. The check starts at the exact hostname and moves up one level at a time. The first name with records holds the whole policy, and anything higher up is ignored. + +1. `www.shop.example.com` has no CAA records. +2. `shop.example.com` has no CAA records. +3. `example.com` has CAA records. This is the policy. + +If no name up to the top-level domain has CAA records, CAA doesn't restrict anyone. + +If a name is an alias (a CNAME), its target's CAA records count. The search doesn't climb the target's parent domains. It goes back to the parents of the name you entered. [RFC 8659](https://www.rfc-editor.org/rfc/rfc8659.html#section-3) defines this search. + +## What do issue, issuewild, and iodef mean? + + +Allows one certificate authority to issue normal certificates. With no `issuewild`, it covers wildcards too. +Allows one certificate authority to issue wildcard certificates, such as `*.example.com`. When any `issuewild` exists, wildcards ignore `issue`. +An email or web address for reports about blocked requests. It doesn't allow or block anything. +An empty value. On its own, it allows no certificate authority. +Marks a record as critical. A certificate authority that doesn't understand it must refuse to issue. + + +Several `issue` records add up, and each one allows one more certificate authority. A policy with only `issuewild` records leaves normal certificates unrestricted. + +Use the value your certificate authority publishes for CAA, such as `letsencrypt.org` for [Let's Encrypt](https://letsencrypt.org/docs/caa/) or `digicert.com` for [DigiCert](https://docs.digicert.com/en/certcentral/manage-certificates/dns-caa-resource-record-check.html). + +## Why was my certificate blocked by CAA? + +These are the usual causes: + +- A parent domain has CAA records you forgot, and your certificate authority isn't in them. +- You listed one certificate authority, but your host or CDN gets certificates from another. Check its docs before you restrict issuance. +- The certificate is a wildcard, and `issuewild` doesn't list your certificate authority. +- The CAA lookup itself fails. The result then says the policy couldn't be determined. [DNS lookup](/dns-lookup) explains SERVFAIL and other errors, and the [DNSSEC checker](/dnssec-checker) finds broken signatures, one possible cause. + +Being allowed by CAA doesn't mean a certificate will be issued. The certificate authority still checks that you control the domain. This check reads the policy only and doesn't list certificates already issued. + +The check asks Cloudflare's public resolver from stack127's server. stack127 doesn't keep the names you check. diff --git a/app/(site)/(tools)/(dns)/caa-checker/content/intro.mdx b/app/(site)/(tools)/(dns)/caa-checker/content/intro.mdx new file mode 100644 index 00000000..5cb7175a --- /dev/null +++ b/app/(site)/(tools)/(dns)/caa-checker/content/intro.mdx @@ -0,0 +1 @@ +Enter the hostname your certificate will cover to see which certificate authorities may issue for it. The check finds the CAA policy that applies, even when it's set on a parent domain, and answers separately for normal and wildcard certificates. diff --git a/app/(site)/(tools)/(dns)/caa-checker/content/usage.mdx b/app/(site)/(tools)/(dns)/caa-checker/content/usage.mdx new file mode 100644 index 00000000..6bb0783b --- /dev/null +++ b/app/(site)/(tools)/(dns)/caa-checker/content/usage.mdx @@ -0,0 +1,20 @@ +## How to read the result + +The result names the certificate authorities allowed for normal and for wildcard certificates. Each one appears as the domain it uses in CAA, such as `letsencrypt.org`. + +| You see | What it means | +| --- | --- | +| Names, then `may issue.` | Only those certificate authorities may issue. | +| `CAA does not restrict this kind of certificate.` | CAA lets any certificate authority issue. | +| `No certificate authority is allowed.` | The policy blocks every certificate authority. | +| `Policy inherited from` a name | The records sit on a parent domain, not on the name you entered. | + +`Where the policy came from` lists each name the check asked, in order. + + + +`api.github.com` has no CAA records of its own, so the check moves up to `github.com` and finds 7. For normal certificates, `digicert.com`, `globalsign.com`, `letsencrypt.org`, and `sectigo.com` may issue. Wildcard certificates leave out `globalsign.com`, because the `issuewild` records don't list it. + +Checked on 9 October 2026. + + diff --git a/app/(site)/(tools)/(dns)/caa-checker/page.tsx b/app/(site)/(tools)/(dns)/caa-checker/page.tsx index 010efd36..b97c0b9c 100644 --- a/app/(site)/(tools)/(dns)/caa-checker/page.tsx +++ b/app/(site)/(tools)/(dns)/caa-checker/page.tsx @@ -1,10 +1,13 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { FileKey } from "lucide-react"; import { CaaCheckerFromUrl } from "./caa-checker-from-url"; import styles from "@/app/(site)/(tools)/(dns)/dns-diagnostics.module.css"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function CaaCheckerPage() { const toolPage = await getRequiredToolPage("caa-checker"); @@ -13,12 +16,16 @@ export default async function CaaCheckerPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(dns)/dns-change-checker/content/article.mdx b/app/(site)/(tools)/(dns)/dns-change-checker/content/article.mdx new file mode 100644 index 00000000..391ccfa8 --- /dev/null +++ b/app/(site)/(tools)/(dns)/dns-change-checker/content/article.mdx @@ -0,0 +1,27 @@ +## How long does DNS propagation take? + +Up to the old record's TTL, counted from when your nameservers start serving the change. A resolver that cached the old record keeps it until that TTL runs out, then fetches the new one. + + + +You change an A record at 2:00 pm, and the nameservers serve it within a minute. A resolver that cached the old record at 1:59 pm can keep it until about 3:00 pm. + + + +Lowering the TTL after the change doesn't speed up copies already cached. A record that didn't exist before can be cached as missing. Resolvers then wait for the zone's negative cache time, which the [SOA checker](/soa-checker) shows. [DNS lookup](/dns-lookup) explains TTL and caching in more detail. + +## What if the nameservers don't agree? + +Sort that out first. Resolvers can fetch from any of them, so some keep getting the old answer. The provider may still be syncing, or one server may have stopped getting updates. The result links to the [SOA checker](/soa-checker), which shows whether one server has an older version of the zone. + +If no nameserver shows the new value, the change isn't live. Check that you edited the DNS provider this domain actually uses. The [nameserver checker](/nameserver-checker) shows which nameservers that is. + +## Can resolvers disagree without being out of date? + +Yes. Large sites and CDNs answer by location, so two resolvers can get different addresses and both be right. Some providers also rotate addresses on every reply. If a resolver still differs after its `Resolver TTL` has run out, the cause isn't an old copy. + +## Does this check propagation worldwide? + +No. It asks 7 public resolvers from stack127's server, not your computer. Your internet provider's resolver, your router, and your VPN aren't included, so they can show another answer. + +IPv6 nameserver addresses are skipped when the checker has no IPv6 route, and the result says so. stack127 doesn't keep the names you check. diff --git a/app/(site)/(tools)/(dns)/dns-change-checker/content/intro.mdx b/app/(site)/(tools)/(dns)/dns-change-checker/content/intro.mdx new file mode 100644 index 00000000..85f8f782 --- /dev/null +++ b/app/(site)/(tools)/(dns)/dns-change-checker/content/intro.mdx @@ -0,0 +1,3 @@ +Enter the name and record type you changed to see if the change is live. The check asks each of the domain's nameservers, then 7 public resolvers, and shows which ones return the new answer. + +Add the value you expect, and the result shows which sources return it. diff --git a/app/(site)/(tools)/(dns)/dns-change-checker/content/usage.mdx b/app/(site)/(tools)/(dns)/dns-change-checker/content/usage.mdx new file mode 100644 index 00000000..259e9d99 --- /dev/null +++ b/app/(site)/(tools)/(dns)/dns-change-checker/content/usage.mdx @@ -0,0 +1,28 @@ +## What to enter as the expected answer + +Type the value the way DNS returns it. Capital letters and a final dot don't matter. + +| Type | Enter it like this | +| --- | --- | +| A or AAAA | `203.0.113.10` | +| MX | `10 mail.example.com`, with the priority first | +| TXT | `"v=spf1 -all"`, with the quotes | +| CNAME | `target.example.net` | + +A TXT value without its quotes won't match anything. + +## How to read the result + +`Published by authoritative nameservers` is the source: what the domain's own servers hand out now. `Seen in public resolver caches` shows the copy each resolver gives its users. + +A resolver marked `Matches reference` returns the same records as the nameservers. `Different answer` means it returns something else. The comparison ignores record order. `Resolver TTL` is the seconds left on that resolver's copy. + + + +All 12 nameserver addresses return `104.20.23.154` and `172.66.147.243`. Six of 7 resolvers match. Yandex DNS returns `8.47.69.5` and `8.6.112.5` instead. + +Both sets are on Cloudflare's network, AS13335. An answer like this usually comes from the provider answering by location, not from an old copy. + +Checked on 9 October 2026. + + diff --git a/app/(site)/(tools)/(dns)/dns-change-checker/page.tsx b/app/(site)/(tools)/(dns)/dns-change-checker/page.tsx index 072cd982..008d99e9 100644 --- a/app/(site)/(tools)/(dns)/dns-change-checker/page.tsx +++ b/app/(site)/(tools)/(dns)/dns-change-checker/page.tsx @@ -1,10 +1,13 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { RefreshCw } from "lucide-react"; import { DnsChangeCheckerFromUrl } from "./dns-change-checker-from-url"; import styles from "./dns-change-checker.module.css"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function DnsChangeCheckerPage() { const toolPage = await getRequiredToolPage("dns-change-checker"); @@ -13,10 +16,14 @@ export default async function DnsChangeCheckerPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(dns)/dns-lookup/content/article.mdx b/app/(site)/(tools)/(dns)/dns-lookup/content/article.mdx new file mode 100644 index 00000000..bbac7970 --- /dev/null +++ b/app/(site)/(tools)/(dns)/dns-lookup/content/article.mdx @@ -0,0 +1,77 @@ +## Why does a DNS lookup still show the old record? + +Usually because a resolver still has the old answer cached. Each resolver keeps a copy until its TTL runs out, and resolvers fetch at different times, so some show the new value while others still show the old one. + +Look up the same name and type with `Authoritative nameserver`: + +- If it shows the new value, the change is saved. Public resolvers pick it up as their cached copies expire. +- If it still shows the old value, the change isn't live. Check that you edited the DNS provider this domain actually uses. The [nameserver checker](/nameserver-checker) shows which one that is. + +Lowering a TTL now doesn't shorten copies already cached. A record that didn't exist can be cached as missing too, so a new TXT record may take a while to show. [RFC 2308](https://www.rfc-editor.org/rfc/rfc2308.html) calls this negative caching. + +The lookup runs from stack127's server, not your computer. Your router, VPN, or office network may use a different resolver and see another answer. Some providers also return different addresses by location. To compare many public resolvers at once, use the [DNS change checker](/dns-change-checker). + +## Which DNS record type should I look up? + +Pick the type that matches the job. One name can hold several types at once without them replacing each other. + +| Type | What it holds | +| --- | --- | +| A | The IPv4 address for the name. | +| AAAA | The IPv6 address. Check it too when a site works on one network but not another. | +| CNAME | An alias to another name. The address comes from the target. | +| MX | The servers that receive email. A lower number means higher priority. | +| NS | The nameservers for the zone. To check they match the domain's registration, use the [nameserver checker](/nameserver-checker). | +| TXT | Text for domain verification and email policies such as SPF and DMARC. | +| CAA | Which certificate authorities may issue certificates. The [CAA checker](/caa-checker) tests the full policy. | +| SOA | The zone's serial number and timers. The [SOA checker](/soa-checker) compares it across nameservers. | +| SRV | The host and port for a service. Look up the service name, such as `_sip._tcp.example.com`. | +| DS and DNSKEY | DNSSEC keys. Their presence doesn't prove DNSSEC works. | +| PTR | The hostname published for an IP address. | + +[Cloudflare's record type reference](https://developers.cloudflare.com/dns/manage-dns-records/reference/dns-record-types/) explains each type in more depth. + +## How do I check email DNS records? + +Each email record lives at a set name, and most are TXT records. A TXT lookup at `example.com` won't show the ones under `_dmarc` or `_domainkey`. + +- Incoming mail: MX at the domain after the `@`, such as `example.com`. +- SPF: TXT at `example.com`, starting `v=spf1`. +- DMARC: TXT at `_dmarc.example.com`, starting `v=DMARC1`. +- DKIM: TXT at `selector._domainkey.example.com`, using the selector your mail provider gives you. Some providers use a CNAME there instead. + +Compare the name and the full value with your provider's instructions. + +`0 .` as the only MX record means the domain accepts no email. [RFC 7505](https://www.rfc-editor.org/rfc/rfc7505.html) calls this a null MX. + +This tool shows the records. It doesn't check that the SPF, DKIM, or DMARC policy is valid, or that mail gets delivered. + +## What do NXDOMAIN, SERVFAIL, and an empty result mean? + +An empty result means the name exists but has no record of that type. The response code tells that apart from a lookup that failed. + +| You see | What it means | +| --- | --- | +| Records | DNS answered. Compare the values with what you expected. | +| `No A record returned.` | The name has no record of that type. Check the spelling and any alias first. | +| NXDOMAIN | The name, or an alias target, doesn't exist. Check spelling and subdomains. | +| SERVFAIL | The resolver couldn't finish the lookup. A nameserver may be down, or DNSSEC may be failing. | +| REFUSED | The server declined to answer. Try another resolver. | +| `did not answer within the lookup timeout` | stack127 got no reply in time. That says nothing about whether the name exists. | + +The codes are defined in [RFC 1035](https://www.rfc-editor.org/rfc/rfc1035.html#section-4.1.1). To see where a lookup stops, use [DNS trace](/dns-trace). + +## Does this lookup check DNSSEC? + +No. The `DNSSEC authentication` line only repeats a flag from the resolver's reply, so `Not authenticated` doesn't mean DNSSEC is broken. A DS or DNSKEY record in the results doesn't prove DNSSEC works either. + +To check whether a domain is signed and validates, use the [DNSSEC checker](/dnssec-checker). + +## What happens to the names I look up? + +- stack127 sends the name to the resolver you picked. For `Authoritative nameserver`, it asks Cloudflare which nameserver to use, then asks that server. +- Addresses in the result go to Team Cymru's DNS service for the network details. +- Your browser loads the site's icon straight from that site. +- stack127 doesn't keep a history of your lookups, and analytics leave out the names you check. + +Look up public names only, not private hostnames you don't want leaving your network. diff --git a/app/(site)/(tools)/(dns)/dns-lookup/content/intro.mdx b/app/(site)/(tools)/(dns)/dns-lookup/content/intro.mdx new file mode 100644 index 00000000..adb0a650 --- /dev/null +++ b/app/(site)/(tools)/(dns)/dns-lookup/content/intro.mdx @@ -0,0 +1,3 @@ +Enter a domain or hostname to see the DNS records it returns right now, such as A, MX, TXT, and CNAME. Pick a public resolver to see the answer it gives its users, or the authoritative nameserver to see what the domain publishes. + +For reverse DNS, choose PTR and enter an IP address. diff --git a/app/(site)/(tools)/(dns)/dns-lookup/content/usage.mdx b/app/(site)/(tools)/(dns)/dns-lookup/content/usage.mdx new file mode 100644 index 00000000..ec1aed38 --- /dev/null +++ b/app/(site)/(tools)/(dns)/dns-lookup/content/usage.mdx @@ -0,0 +1,28 @@ +## What to enter + +Look up the exact name that has the problem. `example.com` and `www.example.com` are separate names and can point to different servers. If you paste a URL, the tool keeps the hostname and drops the rest. + +`All` checks 11 record types at that one name. It doesn't find subdomains or list every record in the domain. Some records live under their own names, such as `_dmarc.example.com`, so look those up directly. + +| Resolver | What you see | Use it when | +| --- | --- | --- | +| A public resolver, such as Cloudflare or Google Public DNS | The answer that resolver gives its users, often a cached copy | You want to see what people using that resolver get | +| Authoritative nameserver | What one of the domain's own nameservers publishes now | You just changed a record and want to see if it saved | + +## How to read the result + +Each record type gets its own block, and each record is listed under the name it belongs to. If your name is an alias (a CNAME) for another name, the records belong to the target, and a line above them shows the path. + +TTL is how long a record may be kept in a cache. `Resolver TTL` is the time left on that resolver's copy, so it's often lower than the domain's setting. `Authoritative TTL` is the value the domain sets. + +Addresses show the network that announces them, from [Team Cymru's IP to ASN data](https://www.team-cymru.com/ip-asn-mapping). That's the hosting or CDN network. It doesn't tell you where the server sits or who owns the site. + +`No MX record returned` is normal for a name that doesn't use that type. It's a problem only when you expected one. + + + +The result says `www.github.com` points to `github.com`. The address is listed under `Records for github.com`, on Microsoft's network, AS8075. So `www.github.com` has no address of its own. It uses the one for `github.com`. + +Checked on 9 October 2026. GitHub may give you a different address. + + diff --git a/app/(site)/(tools)/(dns)/dns-lookup/page.tsx b/app/(site)/(tools)/(dns)/dns-lookup/page.tsx index fbad009c..1208db37 100644 --- a/app/(site)/(tools)/(dns)/dns-lookup/page.tsx +++ b/app/(site)/(tools)/(dns)/dns-lookup/page.tsx @@ -1,10 +1,13 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { Search } from "lucide-react"; import { DnsLookupFromUrl } from "./dns-lookup-from-url"; import styles from "./dns-lookup-content.module.css"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function DnsLookupPage() { const toolPage = await getRequiredToolPage("dns-lookup"); @@ -14,13 +17,17 @@ export default async function DnsLookupPage() { } + intro={} toolPage={toolPage} />
- + + +
+
diff --git a/app/(site)/(tools)/(dns)/dns-trace/content/article.mdx b/app/(site)/(tools)/(dns)/dns-trace/content/article.mdx new file mode 100644 index 00000000..c564bd2a --- /dev/null +++ b/app/(site)/(tools)/(dns)/dns-trace/content/article.mdx @@ -0,0 +1,29 @@ +## How does a DNS trace work? + +It asks each server directly, starting at the root, instead of asking a resolver. A resolver does the same walk for you, but it keeps copies and may hand back a saved answer. The trace keeps no copies, so it shows what the servers publish right now. + +DNS is split into zones. The root servers know who runs `.com`, the `.com` servers know who runs `example.com`, and that domain's own nameservers hold its records. + +## Where can a trace stop, and what does it mean? + +| Where it stops | Usual cause | +| --- | --- | +| At the root | The top-level domain doesn't exist, or no root server could be reached. | +| At the top-level domain | The domain isn't in the registry's zone. It may not be registered, may have expired, or may be on hold. | +| Before the domain's nameservers | The referral named nameservers, but none had a reachable public address. | +| At the domain's nameservers | Read the response. NXDOMAIN means the name doesn't exist. SERVFAIL, REFUSED, or no reply means the server isn't answering properly. | +| After an alias | The alias target doesn't exist, can't be reached, or points back in a loop. | + +A name doesn't need every record type, so "returned no AAAA record" is often fine. [DNS lookup](/dns-lookup) explains each response code. + +## What is glue in a trace? + +Glue is a nameserver's address, sent along with a referral. The parent zone includes it when a nameserver's name sits inside the domain it serves, such as `ns1.example.com` for `example.com`. Without it, nobody could find that nameserver's address. The [nameserver checker](/nameserver-checker) tests whether the glue is right. + +## Should I use a trace or a lookup? + +Use [DNS lookup](/dns-lookup) to see the answer people get from resolvers. Use the trace when a lookup fails and you need to see where, or after you change nameservers at your registrar. + +The trace doesn't check DNSSEC signatures. The [DNSSEC checker](/dnssec-checker) does. + +The trace sends the name straight from stack127's server to the root, top-level domain, and domain nameservers. stack127 doesn't keep the names you check. diff --git a/app/(site)/(tools)/(dns)/dns-trace/content/intro.mdx b/app/(site)/(tools)/(dns)/dns-trace/content/intro.mdx new file mode 100644 index 00000000..04edd883 --- /dev/null +++ b/app/(site)/(tools)/(dns)/dns-trace/content/intro.mdx @@ -0,0 +1 @@ +Enter a name and record type to follow the lookup from the root servers down to the answer, the way `dig +trace` does. Each step shows which server was asked and where it pointed next, so you can see where a lookup stops. diff --git a/app/(site)/(tools)/(dns)/dns-trace/content/usage.mdx b/app/(site)/(tools)/(dns)/dns-trace/content/usage.mdx new file mode 100644 index 00000000..57253fb0 --- /dev/null +++ b/app/(site)/(tools)/(dns)/dns-trace/content/usage.mdx @@ -0,0 +1,15 @@ +## How to read the trace + +Each numbered step is one server the trace asked. A step either points to the nameservers for the next zone down, which is called a referral, or ends the trace. The last step gives the answer, says the name doesn't exist, says there's no record of that type, or shows an error. + +If a server doesn't answer, the trace tries up to 3 servers for that step and lists the failed tries. + + + +1. The root nameserver points to the nameservers for `.com`. +2. The `.com` nameserver points to the nameservers for `github.com`. One of them is `ns-421.awsdns-52.com`. +3. The nameserver for `github.com` answers. `www.github.com` is an alias for `github.com`, which is at `20.207.73.82`. + +Checked on 9 October 2026. + + diff --git a/app/(site)/(tools)/(dns)/dns-trace/page.tsx b/app/(site)/(tools)/(dns)/dns-trace/page.tsx index 4504b82a..484fc51a 100644 --- a/app/(site)/(tools)/(dns)/dns-trace/page.tsx +++ b/app/(site)/(tools)/(dns)/dns-trace/page.tsx @@ -1,10 +1,13 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { Route } from "lucide-react"; import { DnsTraceFromUrl } from "./dns-trace-from-url"; import styles from "./dns-trace.module.css"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function DnsTracePage() { const toolPage = await getRequiredToolPage("dns-trace"); @@ -13,12 +16,16 @@ export default async function DnsTracePage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(dns)/dnssec-checker/content/article.mdx b/app/(site)/(tools)/(dns)/dnssec-checker/content/article.mdx new file mode 100644 index 00000000..2cc1ab66 --- /dev/null +++ b/app/(site)/(tools)/(dns)/dnssec-checker/content/article.mdx @@ -0,0 +1,38 @@ +## How does the DNSSEC chain of trust work? + +Each zone vouches for the one below it. Three record types do the work: + +| Record | Lives in | What it does | +| --- | --- | --- | +| DNSKEY | The zone | The zone's public keys. | +| RRSIG | The zone | A signature over a set of records, made with one of those keys. | +| DS | The parent zone | A fingerprint of the child zone's key. For your domain, you set it through your registrar. | + +Validation starts from the root's key, which resolvers already trust. It checks that each DS matches a DNSKEY one level down, that the keys are signed, and that the answer's RRSIG is valid. [RFC 4033](https://www.rfc-editor.org/rfc/rfc4033.html) describes the design. + +Having DS and DNSKEY records isn't enough. They have to match, and the signatures have to be valid. + +## How do I fix a Bogus result? + +Start with the first step marked `Failed`: + +- If the DS link fails, the DS record at your registrar doesn't match the zone's keys. This often happens after changing DNS provider or keys. Copy the current DS value from your DNS provider to your registrar, or delete the DS to turn DNSSEC off. +- If a DNSKEY or answer step fails, a signature is bad or has expired. `Signature validity` shows when each one runs out. Your DNS provider usually signs the zone, so ask them. + + + +Delete the DS record at your registrar first, and wait for its TTL to pass before you switch nameservers. For `.com`, that's a day. Otherwise the DS points at keys the new provider doesn't have, and the domain goes Bogus. Turn DNSSEC on again at the new provider afterwards. + +Some providers can move a signed zone without turning DNSSEC off, as in [Cloudflare's guide](https://developers.cloudflare.com/dns/dnssec/dnssec-active-migration/). + + + +## Is an Insecure result a problem? + +No. It means DNSSEC isn't turned on for this name. Answers resolve normally, but they aren't protected against forged replies. Turning it on takes a setting at your DNS provider and a DS record at your registrar. + +## Where does the verdict come from? + +stack127 checks the signatures itself with the [Namefi DNSSEC Audit library](https://github.com/d3servelabs/dnssec-audit-ts), fetching records through Cloudflare's public resolver. The `Resolver AD` rows repeat the resolver's own flag for reference, and the verdict doesn't use them. That's also why the DNSSEC line in [DNS lookup](/dns-lookup) isn't a DNSSEC check. + +The check runs from stack127's server, and stack127 doesn't keep the names you check. diff --git a/app/(site)/(tools)/(dns)/dnssec-checker/content/intro.mdx b/app/(site)/(tools)/(dns)/dnssec-checker/content/intro.mdx new file mode 100644 index 00000000..594e5cca --- /dev/null +++ b/app/(site)/(tools)/(dns)/dnssec-checker/content/intro.mdx @@ -0,0 +1 @@ +Enter a domain and record type to check whether its DNSSEC signatures validate, link by link, from the DNS root down to that answer. The result is Secure, Insecure, Bogus, or Indeterminate, with the first step that fails. diff --git a/app/(site)/(tools)/(dns)/dnssec-checker/content/usage.mdx b/app/(site)/(tools)/(dns)/dnssec-checker/content/usage.mdx new file mode 100644 index 00000000..8b5e4b82 --- /dev/null +++ b/app/(site)/(tools)/(dns)/dnssec-checker/content/usage.mdx @@ -0,0 +1,18 @@ +## What do Secure, Insecure, Bogus, and Indeterminate mean? + +| Result | What it means | +| --- | --- | +| Secure | The answer is signed, and every link checks out to the root. This includes a signed proof that a record or name doesn't exist. | +| Insecure | The name isn't signed, and the chain proves that on purpose. Nothing is broken. | +| Bogus | The name should be signed, but a link fails. Resolvers that check DNSSEC return SERVFAIL, so the name stops working for their users. | +| Indeterminate | The check couldn't finish. Run it again before you change anything. | + +DNSSEC signs each answer, not the domain as a whole. Pick the record type that's failing, or A for a general check. + + + +The result is Bogus. The steps pass from the root through `org` and the DS record for `dnssec-failed.org`, then fail: no key in the zone matches the DS record its parent publishes. Cloudflare's resolver returns SERVFAIL for the A record, so its users can't reach the name. + +Comcast runs this domain as a DNSSEC test, broken on purpose. Checked on 9 October 2026. + + diff --git a/app/(site)/(tools)/(dns)/dnssec-checker/page.tsx b/app/(site)/(tools)/(dns)/dnssec-checker/page.tsx index 1b71d017..3f32e9af 100644 --- a/app/(site)/(tools)/(dns)/dnssec-checker/page.tsx +++ b/app/(site)/(tools)/(dns)/dnssec-checker/page.tsx @@ -1,10 +1,13 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { ShieldCheck } from "lucide-react"; import { DnssecCheckerFromUrl } from "./dnssec-checker-from-url"; import styles from "./dnssec-checker.module.css"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function DnssecCheckerPage() { const toolPage = await getRequiredToolPage("dnssec-checker"); @@ -13,12 +16,16 @@ export default async function DnssecCheckerPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(dns)/nameserver-checker/content/article.mdx b/app/(site)/(tools)/(dns)/nameserver-checker/content/article.mdx new file mode 100644 index 00000000..5000e88c --- /dev/null +++ b/app/(site)/(tools)/(dns)/nameserver-checker/content/article.mdx @@ -0,0 +1,31 @@ +## What if the parent and the zone list different nameservers? + +Usually a provider move wasn't finished. A server was added or removed in one place but not the other. Resolvers can use either list, so some lookups work and others fail. + +Make the two lists match. Add every new nameserver at both your registrar and your DNS provider, and remove old ones from both. A mismatch doesn't fix itself over time. + +## When is glue required? + +Glue is a nameserver's address, published by the parent zone with the delegation. The `Glue rule` column says whether a server needs it: + +| Glue rule | When it applies | +| --- | --- | +| `Required` | The nameserver sits inside the domain it serves, such as `ns1.example.com` for `example.com`. Without glue, nobody can find its address. | +| `Optional sibling` | The nameserver sits in another domain under the same parent, such as a `.com` nameserver for a `.com` domain. | +| `Not required` | The nameserver is somewhere else, and normal lookups find its address. | + +If the glue doesn't match the nameserver's own A or AAAA records, the result flags it. Update the glue at your registrar. + +## What is a lame delegation? + +Usually, a nameserver that's listed but doesn't answer as the source for the zone. Definitions vary, and [RFC 9499](https://www.rfc-editor.org/rfc/rfc9499.html#section-7) lists the common ones. The result says such a server `did not claim authority`. Fix the zone on that server, or remove the server from both lists. + +## Why test both UDP and TCP? + +Most DNS queries use UDP. Large answers, such as signed records or long TXT records, switch to TCP. [RFC 7766](https://www.rfc-editor.org/rfc/rfc7766.html) requires nameservers to answer over TCP, so a server that only answers over UDP can fail on those. + +## Should nameservers be on different networks? + +Yes, so one outage can't take them all down. [RFC 2182](https://www.rfc-editor.org/rfc/rfc2182.html) recommends spreading them out. The result notes when every address is on one network, or when two names share one address. + +The checks run from stack127's server. IPv6 addresses are skipped when the checker has no IPv6 route, and the result says so. stack127 doesn't keep the names you check. diff --git a/app/(site)/(tools)/(dns)/nameserver-checker/content/intro.mdx b/app/(site)/(tools)/(dns)/nameserver-checker/content/intro.mdx new file mode 100644 index 00000000..4a9c850f --- /dev/null +++ b/app/(site)/(tools)/(dns)/nameserver-checker/content/intro.mdx @@ -0,0 +1 @@ +Enter a domain to check that the registry and your DNS provider list the same nameservers, that glue addresses are right, and that each server answers. Use it after changing DNS provider, or when a domain stops resolving. diff --git a/app/(site)/(tools)/(dns)/nameserver-checker/content/usage.mdx b/app/(site)/(tools)/(dns)/nameserver-checker/content/usage.mdx new file mode 100644 index 00000000..998a7b1b --- /dev/null +++ b/app/(site)/(tools)/(dns)/nameserver-checker/content/usage.mdx @@ -0,0 +1,15 @@ +## How to read the result + +The first line names the first problem found, or says the delegation checks out. + +In `Delegation, glue, and addresses`, `Parent` means the parent zone, such as `.com`, lists the nameserver. You set that list at your registrar. `Child` means the zone's own NS records list it. You set those at your DNS provider. Both columns should say `Yes` for every server. + +`Nameserver address checks` tests each address over UDP and TCP. `Authoritative SOA` means the server answered as the source for this zone. + + + +GitHub uses 8 nameservers from two providers: 4 from NS1 and 4 from Amazon Route 53. The parent and the zone list the same 8, and every address answers over UDP and TCP. `ns-421.awsdns-52.com` comes with glue, because it sits under `.com` like `github.com`. + +Checked on 9 October 2026. + + diff --git a/app/(site)/(tools)/(dns)/nameserver-checker/page.tsx b/app/(site)/(tools)/(dns)/nameserver-checker/page.tsx index 4c7ca307..4268af2d 100644 --- a/app/(site)/(tools)/(dns)/nameserver-checker/page.tsx +++ b/app/(site)/(tools)/(dns)/nameserver-checker/page.tsx @@ -1,10 +1,13 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { Server } from "lucide-react"; import { NameserverCheckerFromUrl } from "./nameserver-checker-from-url"; import styles from "./nameserver-checker.module.css"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function NameserverCheckerPage() { const toolPage = await getRequiredToolPage("nameserver-checker"); @@ -13,10 +16,14 @@ export default async function NameserverCheckerPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(dns)/soa-checker/content/article.mdx b/app/(site)/(tools)/(dns)/soa-checker/content/article.mdx new file mode 100644 index 00000000..3328bf4c --- /dev/null +++ b/app/(site)/(tools)/(dns)/soa-checker/content/article.mdx @@ -0,0 +1,30 @@ +## What does the SOA serial number mean? + +It's the zone's version number, and it goes up with each change. Many zones use the date plus a counter, such as `2026100901`, as [RFC 1912](https://www.rfc-editor.org/rfc/rfc1912.html#section-2.2) suggests. Others count from 1 or use a timestamp. + +Serials wrap back to zero after 4,294,967,295, so a smaller number isn't always older. The checker compares them with [RFC 1982](https://www.rfc-editor.org/rfc/rfc1982.html) serial arithmetic, not as plain numbers. + +## What do the other SOA fields mean? + +| Field | What it means | +| --- | --- | +| Primary, MNAME | The zone's main nameserver, as the zone names it. | +| Mailbox, RNAME | The zone contact's email, with the first dot standing for the @. | +| Refresh | How often a secondary server checks the primary for changes. | +| Retry | How long a secondary waits to try again after a failed check. | +| Expire | How long a secondary keeps answering when it can't reach the primary. | +| MINIMUM | One of the two values that set the negative cache time. | +| SOA TTL | How long resolvers cache the SOA record itself. | +| Negative cache | How long resolvers cache a missing name or record: the lower of the SOA TTL and MINIMUM. | + +All times are in seconds. Refresh, retry, and expire drive classic zone transfers. Many hosted DNS providers sync their servers another way, so these may not do anything there. The negative cache rule comes from [RFC 2308](https://www.rfc-editor.org/rfc/rfc2308.html). + +## Why do my nameservers show different serials? + +- A change is still syncing. Check again in a few minutes. +- The domain uses two DNS providers, each with its own SOA. Compare the record you care about instead. +- A secondary server stopped updating. It may not reach the primary, or may not be allowed to copy the zone. If its serial stays behind, fix the transfer or remove the server. The [nameserver checker](/nameserver-checker) shows which servers are listed. + +Matching serials don't prove that every record matches. To check one record across servers, use the [DNS change checker](/dns-change-checker). + +The check asks each nameserver directly from stack127's server. IPv6 addresses are skipped when the checker has no IPv6 route. stack127 doesn't keep the names you check. diff --git a/app/(site)/(tools)/(dns)/soa-checker/content/intro.mdx b/app/(site)/(tools)/(dns)/soa-checker/content/intro.mdx new file mode 100644 index 00000000..da2546c9 --- /dev/null +++ b/app/(site)/(tools)/(dns)/soa-checker/content/intro.mdx @@ -0,0 +1 @@ +Enter a domain to compare the SOA record on each of its nameservers. A matching serial number usually means every server has the same version of the zone, and a different one can point to a server that's behind. diff --git a/app/(site)/(tools)/(dns)/soa-checker/content/usage.mdx b/app/(site)/(tools)/(dns)/soa-checker/content/usage.mdx new file mode 100644 index 00000000..7c950e52 --- /dev/null +++ b/app/(site)/(tools)/(dns)/soa-checker/content/usage.mdx @@ -0,0 +1,15 @@ +## How to read the result + +The first line says whether the SOA records agree and, if not, which serial is newest. Servers that return the same values share one row. A server with a different value gets its own row. + +If the `Primary` and `Mailbox` values differ too, you're usually looking at two DNS providers. Each one writes its own SOA, so their serials can't be compared. + + + +The 4 NS1 nameservers report serial 1,656,468,023, with primary `dns1.p08.nsone.net`. The 4 Amazon Route 53 nameservers report serial 1, with primary `ns-1707.awsdns-21.co.uk`. + +The checker calls 1,656,468,023 newest, but neither provider is behind. They each keep their own SOA. + +Checked on 9 October 2026. + + diff --git a/app/(site)/(tools)/(dns)/soa-checker/page.tsx b/app/(site)/(tools)/(dns)/soa-checker/page.tsx index 8ce92dee..1ca09501 100644 --- a/app/(site)/(tools)/(dns)/soa-checker/page.tsx +++ b/app/(site)/(tools)/(dns)/soa-checker/page.tsx @@ -1,10 +1,13 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { FileClock } from "lucide-react"; import { SoaCheckerFromUrl } from "./soa-checker-from-url"; import styles from "./soa-checker.module.css"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function SoaCheckerPage() { const toolPage = await getRequiredToolPage("soa-checker"); @@ -13,10 +16,14 @@ export default async function SoaCheckerPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(domain)/domain-age/content/article.mdx b/app/(site)/(tools)/(domain)/domain-age/content/article.mdx new file mode 100644 index 00000000..f8bb3b76 --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-age/content/article.mdx @@ -0,0 +1,43 @@ +## Is domain age the same as website age? + +No. Domain age dates the registration of the name, not the website on it or the person who owns it now. Someone can buy a 20-year-old domain today and open a new shop on it tomorrow. + +So use the age to test a specific claim, not as a trust score. If a shop says it has used this address for ten years but the registration began last month, ask about the gap. A business can also be older than its domain if it moved to a new name. + +To see what was on the site over the years, open the [Wayback Machine](https://web.archive.org/) and compare captures from different years. A parked page or an unrelated business tells a different story from years of the same shop. A first capture shows a page existed by then, not when it launched, and [the archive has gaps](https://help.archive.org/help/using-the-wayback-machine/). + +## Does domain age reset after renewal, transfer, or expiry? + +Only deletion followed by a new registration resets it. Renewal, a move to another registrar (the company you buy the domain through), and even a change of owner keep the same registration going. + +| What happens | Effect on the age | +| --- | --- | +| The owner renews it | No reset. The expiry date moves forward. | +| It moves to another registrar | No reset. The record may show a transfer date, but not whether the owner changed. | +| The expiry date passes | No reset. The owner can often still renew, or the registrar may pass the name to someone new. | +| It's deleted, then registered again | The age may start from the new registration. Earlier history may be missing. | + +These are separate operations in the [registry protocol, RFC 5731](https://www.rfc-editor.org/rfc/rfc5731.html). [ICANN's renewal and expiry FAQ](https://www.icann.org/resources/pages/domain-name-renewal-expiration-faqs-2018-12-07-en) explains what happens after a name expires. To follow an expiry date, use the [domain expiry checker](/domain-expiry). + +## Does domain age matter for SEO? + +This checker can't tell you. It doesn't look at search traffic, links from other sites, past content, or penalties, so the age isn't an SEO score. + +Before paying extra for an old domain, look at its past sites in the archive and at the sites that link to it. Google's spam policies name [expired domain abuse](https://developers.google.com/search/docs/essentials/spam-policies#expired-domains): buying an expired name and using it mainly to manipulate rankings with content that offers little value. Buying an old domain isn't abuse by itself. + +## Why is the age missing, or different on another site? + +The age is missing when the registry publishes no registration date, or when the domain ending has no public lookup service the checker can use. Neither means the name is new or free to register. `Could not check` means the registry didn't answer or limited requests, so try again in a few minutes. + +If another site shows a different age, compare the dates, not the big numbers. This checker counts from a re-registration date when there is one, and rounds the age. The `Fetched` line says when the record was read. A record marked cached is a saved answer up to 24 hours old. + +The lookup goes from stack127 to the registry. The website itself isn't contacted. For the rest of the record, such as the registrar, statuses, and nameservers, use the [domain registration lookup](/domain-lookup). + +## What do the dates in the result mean? + + +The original registration date. It shows when the registry also publishes a later re-registration date. +When the registration record last changed. It doesn't say what changed, and it isn't when the website was edited. +When the current paid term ends, as the registry reports it. It isn't a deletion date. +When the registry last updated the database it answered from. + diff --git a/app/(site)/(tools)/(domain)/domain-age/content/intro.mdx b/app/(site)/(tools)/(domain)/domain-age/content/intro.mdx new file mode 100644 index 00000000..bda6524e --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-age/content/intro.mdx @@ -0,0 +1 @@ +Enter a domain name or paste a web address to see when the domain was registered and how old it is. The date comes from the public record kept by the domain's registry, such as Verisign for `.com`. diff --git a/app/(site)/(tools)/(domain)/domain-age/content/usage.mdx b/app/(site)/(tools)/(domain)/domain-age/content/usage.mdx new file mode 100644 index 00000000..cab31a3a --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-age/content/usage.mdx @@ -0,0 +1,13 @@ +## How to read the result + +The large number is the time since the current registration began, rounded to years and months. Use the date under it when the exact day matters. + +If you paste a full address, the checker looks up the registered domain. `https://shop.example.com/products` checks `example.com`, because a subdomain has no registration of its own. + +Some registries publish a re-registration date. When they do, the age counts from that later date, and the timeline still shows the first registration. The record doesn't say why the name was registered again or whether the owner changed. + + + +Registered 15 September 1997. The age shows 29 years, 1 month. The timeline adds the last change to the record and the registry expiry date. + + diff --git a/app/(site)/(tools)/(domain)/domain-age/page.tsx b/app/(site)/(tools)/(domain)/domain-age/page.tsx index 8350c711..6e744d1b 100644 --- a/app/(site)/(tools)/(domain)/domain-age/page.tsx +++ b/app/(site)/(tools)/(domain)/domain-age/page.tsx @@ -1,10 +1,13 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { CalendarClock } from "lucide-react"; import { DomainAgeFromUrl } from "./domain-age-from-url"; import styles from "./domain-age-content.module.css"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function DomainAgePage() { const toolPage = await getRequiredToolPage("domain-age"); @@ -14,13 +17,17 @@ export default async function DomainAgePage() { } + intro={} toolPage={toolPage} />
- + + +
+
diff --git a/app/(site)/(tools)/(domain)/domain-availability/content/article.mdx b/app/(site)/(tools)/(domain)/domain-availability/content/article.mdx new file mode 100644 index 00000000..8ab2edc6 --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-availability/content/article.mdx @@ -0,0 +1,24 @@ +## If no registration is found, can I buy the domain? + +Not always. The registry has no record of the name, but a registrar may still refuse the sale or charge far more than usual. + +- Reserved: the registry holds the name back and won't sell it. Which names depends on the ending. +- Premium: the registry prices the name well above the normal fee. The registration record never shows price. +- Restricted: some endings only sell to eligible buyers, such as residents of a country or licensed businesses. +- Just taken: someone may register the name between your check and your checkout. + +A registrar's search shows the price and whether you can buy it. Treat this result as a first filter. + +## Why not just visit the website to check? + +Because a site that doesn't load can still be registered. Many registered names have no website, or no nameservers at all, so the browser can't reach anything. The registry is the only place that knows whether a name is held. To see what DNS answers for a name, use the [DNS lookup](/dns-lookup). + +## Is it safe to check a domain name here? + +The name goes from stack127 to the registry. A registrar is only asked when the name is already registered, and then it's the one that holds it. Saved answers are stored by name, not linked to you. A `Registered` answer can be up to 24 hours old and a `No registration found` answer up to 1 hour old, so check the fetched time before you buy. + +## What if the name is already taken? + +Look at the expiry date and any status shown with it. A name past its expiry may come free, but the owner can often still renew or restore it. The [domain expiry checker](/domain-expiry) explains each stage. For the full record, use the [domain registration lookup](/domain-lookup). + +A registered name may be in use, saved for later, or for sale. This lookup can't tell you which, or the price. diff --git a/app/(site)/(tools)/(domain)/domain-availability/content/intro.mdx b/app/(site)/(tools)/(domain)/domain-availability/content/intro.mdx new file mode 100644 index 00000000..425944cb --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-availability/content/intro.mdx @@ -0,0 +1 @@ +Enter a full domain name, such as `example.com`, to ask its registry whether the name is registered. If no registration is found, check the price at a registrar before you plan around it. diff --git a/app/(site)/(tools)/(domain)/domain-availability/content/usage.mdx b/app/(site)/(tools)/(domain)/domain-availability/content/usage.mdx new file mode 100644 index 00000000..0af374fb --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-availability/content/usage.mdx @@ -0,0 +1,15 @@ +## How to read the result + +| Result | What it means | +| --- | --- | +| `Registered` | Someone holds the name. The registrar, registration date, and expiry date appear when published. | +| `No registration found` | The registry has no record of the name. It's promising, but you may still not be able to buy it. | +| `Cannot determine` | The ending has no public lookup service, or the registry didn't answer. This says nothing about the name. | + + + +`quietlanternstudio.com` is `Registered`, since 6 October 2025. `quietlanternstudio.io` shows `No registration found`. + + + +To try one name across several endings at once, use the [multi-TLD availability checker](/multi-tld-availability). diff --git a/app/(site)/(tools)/(domain)/domain-availability/page.tsx b/app/(site)/(tools)/(domain)/domain-availability/page.tsx index 12d4553f..571b650a 100644 --- a/app/(site)/(tools)/(domain)/domain-availability/page.tsx +++ b/app/(site)/(tools)/(domain)/domain-availability/page.tsx @@ -1,9 +1,12 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { BadgeCheck } from "lucide-react"; import { DomainAvailabilityFromUrl } from "./domain-availability-from-url"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function DomainAvailabilityPage() { const toolPage = await getRequiredToolPage("domain-availability"); @@ -13,11 +16,15 @@ export default async function DomainAvailabilityPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(domain)/domain-expiry/content/article.mdx b/app/(site)/(tools)/(domain)/domain-expiry/content/article.mdx new file mode 100644 index 00000000..65c0776c --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-expiry/content/article.mdx @@ -0,0 +1,33 @@ +## My domain expires soon. What should I check? + +Check your registrar account, not just this page. A public record can't see your payment or settings. + +1. Confirm the renewal date and that auto-renew is on. +2. Check that the saved card hasn't expired. +3. Make sure renewal emails reach an address you read. Registrars must send reminders for generic endings, according to [ICANN's renewal FAQ](https://www.icann.org/resources/pages/domain-name-renewal-expiration-faqs-2018-12-07-en). +4. If you renewed and the date here hasn't moved, ask the registrar to confirm. + +A site that still loads isn't proof the renewal went through. + +## Why do the registry and registrar dates differ? + +The registry runs the ending and the registrar manages your account, and each can publish its own date. They drift apart when the registry renews the name automatically at the end of a term, before the registrar has decided to renew or delete it. The registry date is the one that decides when the domain is deleted. + +## What happens after a domain expires? + +The domain moves through stages, shown under the result with their usual length. What you can do changes at each one. + +| Stage | What you can do | +| --- | --- | +| Grace period | Renew with your registrar. Its terms set the price. The site and email may stop working. | +| Redemption | Ask your registrar to restore it. Expect a higher fee. | +| Pending delete | Nothing. It can't be restored and can't be registered yet. | +| Released | Anyone can register it, first come, first served. | + +These stages are for generic endings such as `.com`. Country endings set their own rules, so check the registry for that ending in the [TLD directory](/tld-directory). The [EPP status codes](/epp-status-codes) page explains each status. + +## When can I register someone else's expired domain? + +No public record gives a guaranteed date. The owner can renew or restore the name until pending delete, and once it's released, someone else may register it seconds before you. Use the [domain availability checker](/domain-availability) to see whether a registration still exists. + +The lookup goes from stack127 to the registry and the registrar, not to the website. A registered result can be a saved answer up to 24 hours old, so a renewal you just paid may not show yet. This is a one-time check, not monitoring. For the rest of the record, use the [domain registration lookup](/domain-lookup). diff --git a/app/(site)/(tools)/(domain)/domain-expiry/content/intro.mdx b/app/(site)/(tools)/(domain)/domain-expiry/content/intro.mdx new file mode 100644 index 00000000..d0529f95 --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-expiry/content/intro.mdx @@ -0,0 +1 @@ +Enter a domain name to see when its current registration term ends, how long is left, and any expiry status the registry shows. The expiry date isn't the day someone else can register the name. diff --git a/app/(site)/(tools)/(domain)/domain-expiry/content/usage.mdx b/app/(site)/(tools)/(domain)/domain-expiry/content/usage.mdx new file mode 100644 index 00000000..b393a55c --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-expiry/content/usage.mdx @@ -0,0 +1,11 @@ +## How to read the result + +The countdown uses the registry's expiry date. When the registrar publishes a different date, both appear side by side. Check your registrar account before trusting either one. + +Once a domain has expired, the large result names its stage, such as `Redemption period`, from the status codes the registry returns. It doesn't guess the stage by counting days from the expiry date. + + + +Time until registry expiry: 2 years. The registry and registrar both show 9 October 2028. + + diff --git a/app/(site)/(tools)/(domain)/domain-expiry/page.tsx b/app/(site)/(tools)/(domain)/domain-expiry/page.tsx index 8e327fc3..d9659eb3 100644 --- a/app/(site)/(tools)/(domain)/domain-expiry/page.tsx +++ b/app/(site)/(tools)/(domain)/domain-expiry/page.tsx @@ -1,9 +1,12 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { CalendarX } from "lucide-react"; import { DomainExpiryFromUrl } from "./domain-expiry-from-url"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function DomainExpiryPage() { const toolPage = await getRequiredToolPage("domain-expiry"); @@ -13,12 +16,16 @@ export default async function DomainExpiryPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(domain)/domain-lookup/content/article.mdx b/app/(site)/(tools)/(domain)/domain-lookup/content/article.mdx new file mode 100644 index 00000000..4e84473a --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-lookup/content/article.mdx @@ -0,0 +1,25 @@ +## What is the difference between RDAP and WHOIS? + +RDAP is the newer way to read public domain registration data, and it replaced WHOIS for generic endings such as `.com` and `.org`. Both read the same registry records. RDAP returns labeled fields and standard event dates, and can declare which data is withheld. WHOIS returns free text that differs by provider. + +Since 28 January 2025, ICANN no longer requires generic registries and registrars to run WHOIS, except for `.com`, `.name`, and `.post`. [ICANN's RDAP page](https://www.icann.org/rdap) explains the change. This lookup uses RDAP only. + +Country endings such as `.uk` or `.de` set their own rules. Some publish RDAP and some don't. When an ending has none, the result shows `Cannot determine`, which says nothing about whether the name is registered. Use the registry's own lookup, which the ending's page in [IANA's root zone database](https://www.iana.org/domains/root/db) links to. The [TLD directory](/tld-directory) shows which endings have RDAP. + +A WHOIS site can show different details because it reads WHOIS text or an older saved copy. Owner details are a separate question, covered in the [registrant lookup](/domain-owner). + +## Why are the registry and registrar shown separately? + +They are two different organizations, and each publishes part of the record. The registry runs the ending, such as Verisign for `.com`, and holds the core record: dates, statuses, and nameservers. The registrar is the company the owner registered through, and often holds the contacts. + +Their expiry dates can differ. The [domain expiry checker](/domain-expiry) explains why, and which one decides when the domain is deleted. + +If the registrar doesn't answer, the result keeps the registry's facts and says the registrar part is missing. + +## Does the last changed date mean the owner changed? + +No. `Record last changed` says the registration record changed, but not which field. `Registry database updated` is when the registry last refreshed its whole database, not this domain. These are [standard RDAP event names](https://www.rfc-editor.org/rfc/rfc9083.html#section-10.2.3), and neither is a history of past owners. + +## Where does the lookup go? + +Your lookup goes from stack127 to the registry and the registrar, not to the website. A registered result can be a saved answer up to 24 hours old, and the source line under the result shows when each part was fetched. diff --git a/app/(site)/(tools)/(domain)/domain-lookup/content/intro.mdx b/app/(site)/(tools)/(domain)/domain-lookup/content/intro.mdx new file mode 100644 index 00000000..fa245b5b --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-lookup/content/intro.mdx @@ -0,0 +1 @@ +Enter a domain name or paste a web address to see its public registration record: the registrar, key dates, status codes, nameservers, and any published contacts. Each fact is labeled with the registry or registrar that published it. diff --git a/app/(site)/(tools)/(domain)/domain-lookup/content/usage.mdx b/app/(site)/(tools)/(domain)/domain-lookup/content/usage.mdx new file mode 100644 index 00000000..8a940c14 --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-lookup/content/usage.mdx @@ -0,0 +1,19 @@ +## How to read the record + +Start with the question that brought you here. Each one points to a different part of the record. + +| Your question | Look at | +| --- | --- | +| Who do I transfer through or report abuse to? | Registrar | +| When does it expire? | Dates, especially registry expiry | +| Why won't it transfer? | Status codes | +| Why doesn't the site load? | Status codes and nameservers | +| Who owns it? | Contacts and redaction | + +The line under `Registered` names the status code with the most effect, such as one that blocks transfers or stops the domain from working. The [EPP status codes](/epp-status-codes) page explains every code and who can remove it. If the site doesn't load, the [domain report](/domain-report) checks the registration and live DNS together. + + + +Registered through MarkMonitor Inc. since 9 October 2007. `clientTransferProhibited` blocks transfers. Eight nameservers are listed, and the registrant shows the organization GitHub, Inc., with the name, email, and phone redacted. + + diff --git a/app/(site)/(tools)/(domain)/domain-lookup/page.tsx b/app/(site)/(tools)/(domain)/domain-lookup/page.tsx index 624ce198..c9a8c81e 100644 --- a/app/(site)/(tools)/(domain)/domain-lookup/page.tsx +++ b/app/(site)/(tools)/(domain)/domain-lookup/page.tsx @@ -1,9 +1,12 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { FileSearch } from "lucide-react"; import { DomainLookupFromUrl } from "./domain-lookup-from-url"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function DomainLookupPage() { const toolPage = await getRequiredToolPage("domain-lookup"); @@ -13,11 +16,15 @@ export default async function DomainLookupPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(domain)/domain-owner/content/article.mdx b/app/(site)/(tools)/(domain)/domain-owner/content/article.mdx new file mode 100644 index 00000000..e2b67afa --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-owner/content/article.mdx @@ -0,0 +1,36 @@ +## Can you find out who owns a domain? + +Sometimes. Companies often appear by name, but most registrars hide the personal details of individuals to comply with privacy laws such as the GDPR. When the name is hidden, this lookup can't reveal it, but the routes below can still reach the owner. + +Even a published name only tells you who registered the domain. That can be a different person or company from whoever runs the website, especially on hosted platforms. + +## What does redacted for privacy mean? + +It means the registrar or registry withheld a field from the public record. Some providers say which fields and how, using the [RDAP redaction standard, RFC 9537](https://www.rfc-editor.org/rfc/rfc9537.html). When they don't, a missing field stays unknown. + +| Method | What happened to the field | +| --- | --- | +| Removed | It was taken out of the record. | +| Emptied | It's still there, with a blank value. | +| Replaced | Its value was swapped for a stand-in, often a contact form or relay address. A stand-in doesn't prove messages reach the owner. | + +## How do you contact a domain owner? + +Pick the route that matches your reason. + +1. To ask about the domain, use the contact form or relay email from the result. It reaches the owner without showing their address, but a reply isn't guaranteed. +2. To report phishing, malware, or spam, write to the registrar's abuse address. Describe the incident and include evidence. The [registrar lookup](/domain-registrar) explains how abuse reports work. +3. For a legal claim or an investigation on a generic ending such as `.com`, request the hidden data through [ICANN's Registration Data Request Service](https://www.icann.org/rdrs-en). The registrar decides whether to disclose it. +4. For anything else that needs the data, a court order or a law enforcement request may apply. + +## What is the difference between a privacy and a proxy service? + +A privacy service replaces the owner's contact details, but the owner stays the registrant. A proxy service registers the domain in its own name and lets the customer use it. [ICANN explains the difference](https://www.icann.org/resources/pages/pp-services-2017-08-31-en). + +Both are different from redaction, where the registrar hides fields on its own. A company name such as "Domains By Proxy" in the record tells you which service is involved, not who's behind it. + +## Why do WHOIS sites show owner details this lookup doesn't? + +Some WHOIS sites keep copies of records from before the details were hidden, or from a previous owner. This lookup reads only the current record, so a name elsewhere may be out of date. The [domain registration lookup](/domain-lookup) explains how RDAP and WHOIS differ. + +The lookup goes from stack127 to the registry and the registrar, not to the website. A registered result can be a saved answer up to 24 hours old, so check the fetched time if the contact details just changed. diff --git a/app/(site)/(tools)/(domain)/domain-owner/content/intro.mdx b/app/(site)/(tools)/(domain)/domain-owner/content/intro.mdx new file mode 100644 index 00000000..a60bab8d --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-owner/content/intro.mdx @@ -0,0 +1 @@ +Enter a domain name to see which owner details its public registration record shows, what was withheld, and how you can still reach the owner. Personal details are usually hidden, so the result often gives a contact form or abuse address instead of a name. diff --git a/app/(site)/(tools)/(domain)/domain-owner/content/usage.mdx b/app/(site)/(tools)/(domain)/domain-owner/content/usage.mdx new file mode 100644 index 00000000..75c3b92a --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-owner/content/usage.mdx @@ -0,0 +1,15 @@ +## How to read the result + +| Result | What it means | +| --- | --- | +| `Published` | The record names a registrant, usually an organization. The name is as the owner gave it, not checked by anyone. | +| `Not published` | No name was returned. A redaction table shows what was withheld, when the provider says. | +| `Cannot determine` | The registry or registrar didn't answer, or the ending has no public lookup service. Try again before treating the name as hidden. | + +Under the result, `How to make contact` lists every contact route the record gives. The abuse address is only for reports of phishing, malware, or spam. + + + +`Published`: the registrant organization is GitHub, Inc. The name, street, email, and phone are redacted, and the record gives a MarkMonitor contact form instead. + + diff --git a/app/(site)/(tools)/(domain)/domain-owner/page.tsx b/app/(site)/(tools)/(domain)/domain-owner/page.tsx index 091d11fe..d502e584 100644 --- a/app/(site)/(tools)/(domain)/domain-owner/page.tsx +++ b/app/(site)/(tools)/(domain)/domain-owner/page.tsx @@ -1,9 +1,12 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { UserSearch } from "lucide-react"; import { DomainOwnerFromUrl } from "./domain-owner-from-url"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function DomainOwnerPage() { const toolPage = await getRequiredToolPage("domain-owner"); @@ -13,12 +16,16 @@ export default async function DomainOwnerPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(domain)/domain-registrar/content/article.mdx b/app/(site)/(tools)/(domain)/domain-registrar/content/article.mdx new file mode 100644 index 00000000..a2ab1532 --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-registrar/content/article.mdx @@ -0,0 +1,37 @@ +## What is the difference between a registry, a registrar, and a reseller? + +The registry runs a domain ending, the registrar sells and manages names in it, and a reseller sells through a registrar. You deal with the last one in the chain. + +| Role | What it does | Example | +| --- | --- | --- | +| Registry | Runs one ending and keeps its records | Verisign runs `.com`, Nominet runs `.uk` | +| Registrar | Registers names with the registry and manages them | MarkMonitor, Hostinger | +| Reseller | Sells names through a registrar, often with hosting | A web host or agency | + +## Why is the registrar a company I've never heard of? + +Usually because you bought the domain through a reseller. Many hosting companies sell domains through wholesale registrars such as Tucows or PDR, so the registrar's name is on the record while your invoice shows the host. A registrar that was bought or renamed can also leave an unfamiliar name. + +To find who you actually pay, search your email for a renewal receipt. Billing and support go to that company. Transfers and account recovery often need the registrar too. + +## How do you report abuse to a registrar? + +Write to the abuse email from the result. Name the exact domain and say what you saw, when, and where, with evidence such as the full URL or the email headers. The registrar may not host the website, and a report doesn't guarantee it will suspend the domain. + +If an ICANN-accredited registrar ignores its duties, you can file an [ICANN compliance complaint](https://www.icann.org/compliance/complaint). + +## How do you get back into a domain someone else registered for you? + +Start with the registrar's or reseller's account recovery, and expect to prove the domain is yours. This often comes up when an agency, contractor, or former employee set it up. Have documents ready that link the domain to you or your business, such as invoices or the registrant details on file. + +This lookup gives you the right company to start with. No public record shows the account's username or email address. + +## Can you tell when a domain changed registrar? + +Sometimes. A few registries publish a transfer date, and the result shows it when they do. `Record last changed` isn't a transfer date, because renewals, nameserver edits, and contact changes all move it. + +## What is an IANA registrar ID? + +It's the fixed number IANA gives each accredited registrar, listed in the [IANA registrar ID registry](https://www.iana.org/assignments/registrar-ids/registrar-ids.xhtml). Registrar names are written in different ways across systems, but the number stays the same, so use it when matching records or filing a complaint. + +The lookup goes from stack127 to the registry and the registrar. A registered result can be a saved answer up to 24 hours old. Before a move, the [transfer readiness checker](/transfer-readiness) shows what's in the way. diff --git a/app/(site)/(tools)/(domain)/domain-registrar/content/intro.mdx b/app/(site)/(tools)/(domain)/domain-registrar/content/intro.mdx new file mode 100644 index 00000000..54097a42 --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-registrar/content/intro.mdx @@ -0,0 +1 @@ +Enter a domain name to find the registrar it's registered through, with its IANA ID and abuse contact. Use it to report abuse, to find where an old domain is held, or to see who to contact before a transfer. diff --git a/app/(site)/(tools)/(domain)/domain-registrar/content/usage.mdx b/app/(site)/(tools)/(domain)/domain-registrar/content/usage.mdx new file mode 100644 index 00000000..bb16a743 --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-registrar/content/usage.mdx @@ -0,0 +1,11 @@ +## How to read the result + +The large name is the registrar the registry has on record. Under it, `Who does what` shows the chain from registry to registrar to any reseller. A reseller only appears when the record names one, so `Not published` doesn't mean there isn't one. + +The abuse email and phone are for reporting phishing, malware, or spam. They won't help with account access or billing. + + + +The registrar is MarkMonitor Inc., IANA ID 292. The abuse contact is abusecomplaints@markmonitor.com. + + diff --git a/app/(site)/(tools)/(domain)/domain-registrar/page.tsx b/app/(site)/(tools)/(domain)/domain-registrar/page.tsx index 344027a4..cf636ceb 100644 --- a/app/(site)/(tools)/(domain)/domain-registrar/page.tsx +++ b/app/(site)/(tools)/(domain)/domain-registrar/page.tsx @@ -1,9 +1,12 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { Building2 } from "lucide-react"; import { DomainRegistrarFromUrl } from "./domain-registrar-from-url"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function DomainRegistrarPage() { const toolPage = await getRequiredToolPage("domain-registrar"); @@ -13,12 +16,16 @@ export default async function DomainRegistrarPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(domain)/domain-report/content/article.mdx b/app/(site)/(tools)/(domain)/domain-report/content/article.mdx new file mode 100644 index 00000000..4342ba18 --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-report/content/article.mdx @@ -0,0 +1,31 @@ +## Why is my domain registered but not resolving? + +Usually a hold status or a nameserver problem. A `clientHold` or `serverHold` status tells the registry to stop publishing the domain, so nothing under it resolves while the registration stays valid. The report flags a hold under `Needs attention`. The [EPP status codes](/epp-status-codes) page says who can remove each one. + +If there's no hold, look at the nameserver chain. Missing nameservers, or ones that don't answer, also stop a domain from resolving. If DNS answers correctly and the site still fails, the problem is the web host, which this report doesn't test. + +## Why do nameservers differ between the registry and DNS? + +Usually a nameserver change was made in one place but not the other, often during a move to a new DNS host. Nameservers are listed in three places, and they should agree. + +1. `Registration record`: what you set through your registrar. +2. `Parent referral`: what the parent zone, such as `.com`, tells visitors. +3. `Child zone`: the NS records in your own zone. + +When they disagree, some visitors reach servers that aren't set up for the domain, and answers come and go. The [nameserver checker](/nameserver-checker) tests each server. + +## Does DNSSEC switched on mean it works? + +No. The registration record shows whether a DS record is published, which switches DNSSEC on. It doesn't show whether the signatures are valid. + +A domain with DNSSEC on and a broken chain stops resolving for everyone whose resolver checks signatures, and keeps working for everyone else. That's why the report asks for a decision and links to the [DNSSEC checker](/dnssec-checker), which validates the chain. + +## Why is there no score? + +There's no single right setup for every domain, so a score would invent one. A healthy domain can show findings, and a high score could hide a problem the score didn't check. Each finding shows its evidence instead. + +## What doesn't the report check? + +It doesn't test websites, certificates, or email delivery, and it's a one-time check with no alerts. For deeper DNS checks, use the [SOA checker](/soa-checker) for zone consistency or the [CAA checker](/caa-checker) for certificate rules. + +The report runs from stack127's server. DNS answers are live, but the registration part can be a saved answer up to 24 hours old, so the two timestamps can differ. diff --git a/app/(site)/(tools)/(domain)/domain-report/content/intro.mdx b/app/(site)/(tools)/(domain)/domain-report/content/intro.mdx new file mode 100644 index 00000000..d2f4ab48 --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-report/content/intro.mdx @@ -0,0 +1 @@ +Enter a domain name to check its registration record and its live DNS in one report, and see where the two disagree. Use it when a domain is registered but something isn't working, or after moving DNS. diff --git a/app/(site)/(tools)/(domain)/domain-report/content/usage.mdx b/app/(site)/(tools)/(domain)/domain-report/content/usage.mdx new file mode 100644 index 00000000..621429fc --- /dev/null +++ b/app/(site)/(tools)/(domain)/domain-report/content/usage.mdx @@ -0,0 +1,19 @@ +## How to read the report + +Start with `Checks in this report`. A check that failed or was skipped stays unresolved. It doesn't count as a pass. + +Findings come in three groups. + +| Group | Examples | +| --- | --- | +| Needs attention | Nameservers differ, a hold status, expiry within 30 days | +| Needs a decision | DNSSEC is switched on at the registry | +| Context | Nameservers agree, DNSSEC is off | + +Each finding links to the tool that looks into it further. The nameserver chain shows the three places nameservers are listed, side by side. + + + +Both checks completed. Nothing needs attention. The registration record, parent referral, and child zone all list the same eight nameservers, and DNSSEC is off. + + diff --git a/app/(site)/(tools)/(domain)/domain-report/page.tsx b/app/(site)/(tools)/(domain)/domain-report/page.tsx index 45591f0e..7fdce560 100644 --- a/app/(site)/(tools)/(domain)/domain-report/page.tsx +++ b/app/(site)/(tools)/(domain)/domain-report/page.tsx @@ -1,9 +1,12 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { ClipboardList } from "lucide-react"; import { DomainReportFromUrl } from "./domain-report-from-url"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function DomainReportPage() { const toolPage = await getRequiredToolPage("domain-report"); @@ -13,12 +16,16 @@ export default async function DomainReportPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(domain)/multi-tld-availability/content/article.mdx b/app/(site)/(tools)/(domain)/multi-tld-availability/content/article.mdx new file mode 100644 index 00000000..aa3d86bf --- /dev/null +++ b/app/(site)/(tools)/(domain)/multi-tld-availability/content/article.mdx @@ -0,0 +1,15 @@ +## Which endings should I check? + +Start with the endings your audience knows and that you're allowed to register. The preselected endings are a starting set that can all be checked, not a recommendation. + +For a local business, add your country's ending and read its rules, since some only sell to residents or local companies. For protecting a brand, check the endings people might confuse with yours. This check isn't trademark clearance. + +## Why is a free name sometimes not for sale? + +The registration record never shows price or who's allowed to buy. A name with no registration can still be reserved, premium-priced, or restricted. The [domain availability checker](/domain-availability) explains each case. Confirm the first-year and renewal price at a registrar before you choose. + +## Why is the check limited to twelve endings? + +Each ending is a separate request to a different registry, and registries limit how often one address can ask. Every visitor shares stack127's address, so a cap per check and per visitor keeps the tools working for everyone. If you hit a limit, the page says so. + +Each name goes from stack127 to its registry. Saved answers are stored by name, not linked to you. A `Registered` row can be up to 24 hours old and a `No registration found` row up to 1 hour old, and each row shows when it was fetched. diff --git a/app/(site)/(tools)/(domain)/multi-tld-availability/content/intro.mdx b/app/(site)/(tools)/(domain)/multi-tld-availability/content/intro.mdx new file mode 100644 index 00000000..b19574d4 --- /dev/null +++ b/app/(site)/(tools)/(domain)/multi-tld-availability/content/intro.mdx @@ -0,0 +1 @@ +Enter a name without an ending, pick up to 12 endings, and see which ones are already registered. Each row shows its own registry's answer, so a check that failed never looks like a free name. diff --git a/app/(site)/(tools)/(domain)/multi-tld-availability/content/usage.mdx b/app/(site)/(tools)/(domain)/multi-tld-availability/content/usage.mdx new file mode 100644 index 00000000..009054f2 --- /dev/null +++ b/app/(site)/(tools)/(domain)/multi-tld-availability/content/usage.mdx @@ -0,0 +1,16 @@ +## How to read the results + +The summary counts how many endings have no registration. Each row then shows one of four results. + +| Result | What it means | +| --- | --- | +| `No registration found` | The registry has no record of the name with that ending. | +| `Registered` | Someone holds it. The registrar and expiry date show when published. | +| `Cannot check` | The ending has no public lookup service. Use the registry's own search, listed in the [TLD directory](/tld-directory). | +| `Check failed` | The registry didn't answer or limited requests. Try again in a few minutes. | + + + +Across the 10 preselected endings, 9 of 10 have no registration. Only `quietlanternstudio.com` is `Registered`, through Tucows Domains Inc., with an expiry date of 6 October 2027. + + diff --git a/app/(site)/(tools)/(domain)/multi-tld-availability/page.tsx b/app/(site)/(tools)/(domain)/multi-tld-availability/page.tsx index a362118d..47f1ad48 100644 --- a/app/(site)/(tools)/(domain)/multi-tld-availability/page.tsx +++ b/app/(site)/(tools)/(domain)/multi-tld-availability/page.tsx @@ -1,9 +1,12 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { Layers } from "lucide-react"; import { MultiTldTool } from "./multi-tld-tool"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function MultiTldAvailabilityPage() { const toolPage = await getRequiredToolPage("multi-tld-availability"); @@ -12,12 +15,16 @@ export default async function MultiTldAvailabilityPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(domain)/punycode-converter/content/article.mdx b/app/(site)/(tools)/(domain)/punycode-converter/content/article.mdx new file mode 100644 index 00000000..a092429f --- /dev/null +++ b/app/(site)/(tools)/(domain)/punycode-converter/content/article.mdx @@ -0,0 +1,27 @@ +## What is punycode? + +Punycode is the way a domain name with non-ASCII letters is written in plain ASCII, so DNS can handle it. Each encoded part starts with `xn--`. `münchen.de` and `xn--mnchen-3ya.de` are the same domain, written two ways. + +[RFC 3492](https://www.rfc-editor.org/rfc/rfc3492.html) defines the encoding, and [RFC 5890](https://www.rfc-editor.org/rfc/rfc5890.html) sets the rules for which names are valid. Not every Unicode string can be a domain name, so the result lists any rule a name breaks. + +## How do you spot a punycode phishing domain? + +Look for letters from another writing system that copy familiar ones. Latin `a` is U+0061, and Cyrillic `а` is U+0430. They look the same, but they make a different domain. This trick is called a homograph attack. + +Most lookalikes mix writing systems inside one part of the name, so the tool flags that and shows each character. A mixed name is a reason to look closer, not proof of fraud. A name written entirely in Cyrillic or Greek is normal where those languages are used. + +## What won't this catch? + +Lookalikes made only of ASCII letters. `paypaI.com` with a capital i, or `rn` standing in for `m`, use ordinary Latin letters, so no writing system check can flag them. No warning doesn't mean the name is safe. + +Your browser also decides when to show the readable form and when to show `xn--`. The rules differ between browsers and change over time. [Chromium's IDN display policy](https://chromium.googlesource.com/chromium/src/+/main/docs/idn.md) is one example. + +## Why is my converted domain name too long? + +Encoding makes non-ASCII names longer. `例え.jp` has 2 letters before the dot, but its encoded form `xn--r8jz45g` has 11. Each part has a 63-byte limit after encoding, and the whole name has a 253-byte limit. The label breakdown shows each part's encoded length. + +## Does punycode apply to the whole URL? + +No, only the domain name. The path and query use percent encoding, such as `%20` for a space. When you paste a full address, only its hostname changes. + +If a link looks suspicious, the [domain age checker](/domain-age) shows when the name was registered. diff --git a/app/(site)/(tools)/(domain)/punycode-converter/content/intro.mdx b/app/(site)/(tools)/(domain)/punycode-converter/content/intro.mdx new file mode 100644 index 00000000..f9d73553 --- /dev/null +++ b/app/(site)/(tools)/(domain)/punycode-converter/content/intro.mdx @@ -0,0 +1 @@ +Paste a domain name or web address in either form, readable like `münchen.de` or encoded like `xn--mnchen-3ya.de`, to see both forms and every character in it. Conversion runs in your browser, and the domain isn't looked up. diff --git a/app/(site)/(tools)/(domain)/punycode-converter/content/usage.mdx b/app/(site)/(tools)/(domain)/punycode-converter/content/usage.mdx new file mode 100644 index 00000000..a7ec3713 --- /dev/null +++ b/app/(site)/(tools)/(domain)/punycode-converter/content/usage.mdx @@ -0,0 +1,11 @@ +## How to read the result + +The label breakdown shows each part of the name between the dots, with its encoded length. One part can't be longer than 63 bytes. + +For a name with non-ASCII characters, the character table lists each one with its code point, Unicode name, and writing system. A line under the table says whether any part mixes writing systems, which is the usual sign of a lookalike. + + + +The ASCII form is `xn--pple-43d.com`. The character table shows the first letter as U+0430 CYRILLIC SMALL LETTER A, and the result flags that the label mixes Cyrillic and Latin. + + diff --git a/app/(site)/(tools)/(domain)/punycode-converter/page.tsx b/app/(site)/(tools)/(domain)/punycode-converter/page.tsx index 4dd129f1..170a5a65 100644 --- a/app/(site)/(tools)/(domain)/punycode-converter/page.tsx +++ b/app/(site)/(tools)/(domain)/punycode-converter/page.tsx @@ -1,9 +1,12 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { Languages } from "lucide-react"; import { PunycodeTool } from "./punycode-tool"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function PunycodeConverterPage() { const toolPage = await getRequiredToolPage("punycode-converter"); @@ -12,12 +15,16 @@ export default async function PunycodeConverterPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(domain)/transfer-readiness/content/article.mdx b/app/(site)/(tools)/(domain)/transfer-readiness/content/article.mdx new file mode 100644 index 00000000..1e20ef71 --- /dev/null +++ b/app/(site)/(tools)/(domain)/transfer-readiness/content/article.mdx @@ -0,0 +1,35 @@ +## Which transfer locks can you remove? + +Only the one your registrar sets. The others need the registrar's help or time. The [EPP status codes](/epp-status-codes) page explains each code. + +| Status | Who can clear it | +| --- | --- | +| `clientTransferProhibited` | You, usually with a "transfer lock" switch in your registrar account. | +| `serverTransferProhibited` | Only the registry. Ask your registrar why it's there. | +| `pendingTransfer` | It clears when the transfer that's already running ends. Wait for it to finish, or ask your registrar to cancel it. | +| `redemptionPeriod` or `pendingDelete` | The domain must be restored first, if restoring is still possible. | + +## Why can't I transfer a domain I registered or moved recently? + +Under ICANN's [Transfer Policy](https://www.icann.org/en/contracted-parties/accredited-registrars/transfer-policy-01-06-2016-en), the current registrar may refuse a transfer within 60 days of the registration or of the last transfer. The checker treats those 60 days as a block, so ask your registrar if you need an exception. + +Changing the registrant's name, organization, or email can also start a 60-day lock on generic endings. Registrars may let you opt out, but only before you make the change. Ask before editing contact details to prepare a transfer. + +The [ICANN Board adopted new transfer rules](https://www.icann.org/en/board-activities-and-meetings/materials/approved-resolutions-regular-meeting-of-the-icann-board-07-06-2026-en) on 7 June 2026. They don't apply until ICANN publishes a start date, so the 60-day rules still hold. + +## How do I move a domain without the site or email going down? + +Sort out DNS before you start, because a transfer moves the registration, not your DNS, website, or email. + +1. Find out where your DNS is hosted. If it's at the old registrar, copy every record to the new DNS host and switch the nameservers before the transfer. +2. If DNSSEC is on, set up signing at the new DNS host and update the DS record, or switch DNSSEC off first. A broken chain stops the domain from resolving for many visitors. The [DNSSEC checker](/dnssec-checker) tests the chain. +3. Remove the registrar transfer lock and get the authorization code from the old registrar. +4. Start the transfer at the new registrar and approve any confirmation email. + +Never paste the authorization code into a lookup tool or a public message. It's the key to the transfer. + +## Do country-code domains follow the same rules? + +No. ICANN's Transfer Policy only covers generic endings such as `.com`. Country endings such as `.uk` or `.de` have their own steps, codes, and waiting periods, and the result says when the 60-day checks don't apply. Find the registry's rules through the [TLD directory](/tld-directory). + +The lookup goes from stack127 to the registry and the registrar. A registered result can be a saved answer up to 24 hours old, so a lock you just removed may still show. To find your registrar's details, use the [registrar lookup](/domain-registrar). diff --git a/app/(site)/(tools)/(domain)/transfer-readiness/content/intro.mdx b/app/(site)/(tools)/(domain)/transfer-readiness/content/intro.mdx new file mode 100644 index 00000000..a8fa3403 --- /dev/null +++ b/app/(site)/(tools)/(domain)/transfer-readiness/content/intro.mdx @@ -0,0 +1 @@ +Enter a domain name to see what its public record says could block a move to another registrar: transfer locks, a recent registration or transfer, and a close expiry date. Your registrar account can still hold blocks that no public record shows. diff --git a/app/(site)/(tools)/(domain)/transfer-readiness/content/usage.mdx b/app/(site)/(tools)/(domain)/transfer-readiness/content/usage.mdx new file mode 100644 index 00000000..60c7788c --- /dev/null +++ b/app/(site)/(tools)/(domain)/transfer-readiness/content/usage.mdx @@ -0,0 +1,18 @@ +## How to read the result + +The first line counts the blockers it found and splits them into ones you can clear in your registrar account and ones that need waiting or the registrar's help. Each check below it shows one of four states. + +| State | What it means | +| --- | --- | +| Blocked | This stops a transfer right now. | +| Risk | The transfer can go ahead, but plan for this first, such as DNSSEC or DNS hosted at the old registrar. | +| Unknown | The public record doesn't say. Check in your account. | +| Clear | Nothing in the public record blocks it. | + +`No public blocker was found` doesn't mean the transfer will go through. You still need the authorization code, account access, and the registrar's own steps. + + + +`github.com cannot be transferred now. One public blocker is visible: one you can clear in your account.` That blocker is the registrar transfer lock. Time since the last transfer is `Unknown`, because the registry published no transfer date, and `Where DNS is hosted` is a risk to plan for. + + diff --git a/app/(site)/(tools)/(domain)/transfer-readiness/page.tsx b/app/(site)/(tools)/(domain)/transfer-readiness/page.tsx index a735bbcb..1048e377 100644 --- a/app/(site)/(tools)/(domain)/transfer-readiness/page.tsx +++ b/app/(site)/(tools)/(domain)/transfer-readiness/page.tsx @@ -1,9 +1,12 @@ import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; import { PageCanvas } from "@/app/ui/site/page-canvas"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { ArrowLeftRight } from "lucide-react"; import { TransferReadinessFromUrl } from "./transfer-readiness-from-url"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function TransferReadinessPage() { const toolPage = await getRequiredToolPage("transfer-readiness"); @@ -13,12 +16,16 @@ export default async function TransferReadinessPage() { } + intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(saas)/arpu-arpa-calculator/content/article.mdx b/app/(site)/(tools)/(saas)/arpu-arpa-calculator/content/article.mdx new file mode 100644 index 00000000..1780db8d --- /dev/null +++ b/app/(site)/(tools)/(saas)/arpu-arpa-calculator/content/article.mdx @@ -0,0 +1,30 @@ +## How do you calculate ARPU and ARPA? + +Both divide revenue by a count. They differ in which revenue and which count. + + + +ARPU = net revenue in the period ÷ active users in the period + +ARPA = MRR at month end ÷ paying accounts at month end + + + +[Stripe's ARPU guide](https://stripe.com/resources/more/what-is-average-revenue-per-user-why-it-matters-and-how-to-calculate-it) leaves the period, the revenue, and the meaning of "active" up to you. [ChartMogul's ARPA report](https://help.chartmogul.com/article/209-chart-average-revenue-per-account) divides MRR by paying subscribers and counts a customer with several subscriptions once. + +## What's the difference between ARPU and ARPA? + +ARPU counts people. ARPA counts paying accounts. One team account with 10 users paying $500 a month is one account at $500 of ARPA. Counted as users, that's $50 each. + +ARPU also counts people who don't pay, which pulls it down for apps with a free tier. ARPA counts only accounts that pay. + +## Can you divide quarterly ARPU by three to get monthly ARPU? + +Not exactly. Dividing by three still uses everyone active across the three months, which is at least as many as in any one month. So it usually comes out lower than a true monthly ARPU. Count active users for one month instead. + +## What does ARPA tell you next? + +ARPA is the starting point for most per-customer SaaS math. + +- The [customer lifetime value calculator](/customer-lifetime-value-calculator) turns ARPA, margin, and churn into gross profit per customer. +- The [break-even MRR calculator](/break-even-mrr-calculator) uses it to count the paying accounts that cover your costs. diff --git a/app/(site)/(tools)/(saas)/arpu-arpa-calculator/content/intro.mdx b/app/(site)/(tools)/(saas)/arpu-arpa-calculator/content/intro.mdx new file mode 100644 index 00000000..610d0372 --- /dev/null +++ b/app/(site)/(tools)/(saas)/arpu-arpa-calculator/content/intro.mdx @@ -0,0 +1,3 @@ +This calculator gives one of two averages: ARPU, revenue per active user over a period, or ARPA, monthly recurring revenue (MRR) per paying account at a month end. + +For ARPU, have net revenue and the number of active people for the same period. For ARPA, have month-end MRR and the number of paying accounts on that date. diff --git a/app/(site)/(tools)/(saas)/arpu-arpa-calculator/content/usage.mdx b/app/(site)/(tools)/(saas)/arpu-arpa-calculator/content/usage.mdx new file mode 100644 index 00000000..cdab01ef --- /dev/null +++ b/app/(site)/(tools)/(saas)/arpu-arpa-calculator/content/usage.mdx @@ -0,0 +1,23 @@ +## Which average should you pick? + +Pick by what you count: people or paying accounts. + +| | ARPU | ARPA | +| --- | --- | --- | +| Revenue | Net revenue over the whole period | MRR at the month end | +| Count | Every active person, paying or not | Paying customer accounts | +| Fits | Apps with free users, ads, or one-off purchases | Subscriptions billed per account or team | + +## What to enter + +For ARPU, decide what "active" means, such as signed in or made a purchase, and use the same rule every time. There's no standard definition. Count each person once across the whole period. + +For ARPA, use MRR, so a yearly plan counts as one twelfth of its price. The [MRR calculator](/mrr-calculator) works that out from your plans. + + + +ARPU: $75,000 of net revenue from April to June, and 5,000 active people in that time. ARPU is $15.00 for the quarter. + +ARPA: $12,000 of MRR at the end of April, and 120 paying accounts. ARPA is $100.00 a month. + + diff --git a/app/(site)/(tools)/(saas)/arpu-arpa-calculator/page.tsx b/app/(site)/(tools)/(saas)/arpu-arpa-calculator/page.tsx index 5e1775b1..4707bee1 100644 --- a/app/(site)/(tools)/(saas)/arpu-arpa-calculator/page.tsx +++ b/app/(site)/(tools)/(saas)/arpu-arpa-calculator/page.tsx @@ -1,18 +1,24 @@ import { UsersRound } from "lucide-react"; import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { PageCanvas } from "@/app/ui/site/page-canvas"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { ArpuArpaCalculator } from "./arpu-arpa-calculator"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function ArpuArpaCalculatorPage() { const toolPage = await getRequiredToolPage("arpu-arpa-calculator"); return ( - } toolPage={toolPage} /> + } intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(saas)/arr-calculator/content/article.mdx b/app/(site)/(tools)/(saas)/arr-calculator/content/article.mdx new file mode 100644 index 00000000..221e5b9f --- /dev/null +++ b/app/(site)/(tools)/(saas)/arr-calculator/content/article.mdx @@ -0,0 +1,36 @@ +## What does ARR mean? + +ARR means either annualized run rate or annual recurring revenue. Both use the same three letters, but they count different things. This calculator gives annualized run rate. + +| | Annualized run rate | Annual recurring revenue | +| --- | --- | --- | +| How it's worked out | MRR × 12 | Each contract's value ÷ its years, for contracts of 12 months or longer | +| Counts monthly plans | Yes | No | +| Fits | Businesses billing mostly monthly | Businesses billing mostly yearly or on multi-year contracts | + +[ChartMogul's ARR guide](https://chartmogul.com/saas-metrics/arr/) sets out both meanings and says most SaaS companies now mean run rate. If you bill both monthly and yearly, run rate is the one that counts everything. + + + +MRR is $10,000: $8,000 from monthly plans and $2,000 from yearly plans that pay $24,000 a year. + +- Annualized run rate: $10,000 × 12 = $120,000 +- Annual recurring revenue: $24,000, from the yearly plans only + + + +## Is ARR the revenue you'll make this year? + +No. ARR is today's monthly rate stretched over a year. It isn't cash collected, revenue already earned, or a forecast. New customers, upgrades, and cancellations change it next month. + +## Why doesn't a company's reported ARR match MRR × 12? + +Companies set their own ARR rules, and many explain them in their filings. [Vertex](https://www.sec.gov/Archives/edgar/data/1806837/000110465926090420/verx-20260630x10q.htm) uses MRR from the last month of the period × 12. [Bentley Systems](https://www.sec.gov/Archives/edgar/data/1031308/000103130824000008/a24q2exhibit992.htm) adds the yearly value of its recurring contracts to three months of usage-based subscription revenue, annualized. + +Before you compare two ARR figures, check which meaning each uses, what it includes, and the date it was taken. + +## How do you turn ARR into MRR? + +Divide annualized run rate by 12. $120,000 of ARR is $10,000 of MRR. This only works for run-rate ARR. Annual recurring revenue leaves out monthly plans, so dividing it by 12 understates MRR. + +To see how MRR moved over a month, use the [MRR waterfall calculator](/mrr-waterfall-calculator). To see how much cash each new dollar of ARR cost, use the [burn multiple calculator](/burn-multiple-calculator). diff --git a/app/(site)/(tools)/(saas)/arr-calculator/content/intro.mdx b/app/(site)/(tools)/(saas)/arr-calculator/content/intro.mdx new file mode 100644 index 00000000..fae72266 --- /dev/null +++ b/app/(site)/(tools)/(saas)/arr-calculator/content/intro.mdx @@ -0,0 +1,3 @@ +This calculator turns your monthly recurring revenue (MRR) into annualized ARR, which is MRR × 12. + +Have your current MRR total, with yearly and quarterly plans already counted as monthly amounts. If you only have plan prices and subscription counts, start with the [MRR calculator](/mrr-calculator). diff --git a/app/(site)/(tools)/(saas)/arr-calculator/content/usage.mdx b/app/(site)/(tools)/(saas)/arr-calculator/content/usage.mdx new file mode 100644 index 00000000..93f70664 --- /dev/null +++ b/app/(site)/(tools)/(saas)/arr-calculator/content/usage.mdx @@ -0,0 +1,9 @@ +## What to enter + +Enter one month's recurring revenue, as of one date. A $1,200 yearly plan counts as $100, not $1,200. Leave out setup fees, tax, and other one-time charges. + + + +$10,000 × 12 = $120,000.00 of annualized ARR. + + diff --git a/app/(site)/(tools)/(saas)/arr-calculator/page.tsx b/app/(site)/(tools)/(saas)/arr-calculator/page.tsx index 02677bb4..4e2f9070 100644 --- a/app/(site)/(tools)/(saas)/arr-calculator/page.tsx +++ b/app/(site)/(tools)/(saas)/arr-calculator/page.tsx @@ -1,18 +1,24 @@ import { CalendarDays } from "lucide-react"; import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { PageCanvas } from "@/app/ui/site/page-canvas"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { ArrCalculator } from "./arr-calculator"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function ArrCalculatorPage() { const toolPage = await getRequiredToolPage("arr-calculator"); return ( - } toolPage={toolPage} /> + } intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(saas)/break-even-mrr-calculator/content/article.mdx b/app/(site)/(tools)/(saas)/break-even-mrr-calculator/content/article.mdx new file mode 100644 index 00000000..e7ba0ca6 --- /dev/null +++ b/app/(site)/(tools)/(saas)/break-even-mrr-calculator/content/article.mdx @@ -0,0 +1,112 @@ +## How is break-even MRR calculated? + +Break-even MRR is your fixed monthly cost divided by the share of each revenue dollar left after variable costs. The account count divides the same fixed cost by what one account contributes, then rounds up to a whole account. + +Contribution is monthly ARPA minus the variable cost of one account. ARPA means average revenue per account. The contribution ratio is contribution divided by ARPA. + + + +Break-even MRR = fixed costs ÷ contribution ratio + +Accounts = fixed costs ÷ contribution per account, rounded up + + + +The [SBA's break-even guidance](https://legacy.sba.gov/business-guide/plan-your-business/calculate-your-startup-costs/break-even-point) uses the same division. You can't sell part of an account, so the count rounds up. The revenue figure rounds up to the next cent, so it never falls short. + + + +Contribution is $41.00 per account. The ratio shows 83.67%, which is $41 ÷ $49 rounded to a hundredth of a percent. The math uses the exact ratio. + +$25,000 × $49 ÷ $41 comes to $29,878.048..., so break-even MRR is $29,878.05. + +$25,000 ÷ $41 is 609.76 accounts, so you need 610. Those accounts bring $29,890.00 of MRR, which leaves $10.00 after fixed costs. + + + +$29,878.05 is the smallest monthly revenue that covers the costs. $29,890.00 is what 610 whole accounts bring in. The page shows both. + +## Which costs are fixed, and which grow? + +Fixed costs stay put as the account count changes. Variable costs grow with accounts or with revenue. The SBA guidance says to split a cost that has both parts, and to turn a yearly bill into a monthly amount. + +| Cost | Where it goes | +| --- | --- | +| Rent, salaries, and software you pay with no new accounts | Fixed, per month or per year | +| A hosting minimum you pay even with no usage | Fixed | +| Hosting or support that rises with accounts or usage | Variable, per account | +| Payment fees that are a percent of revenue | Variable, as a share of MRR | +| Your own pay, when this result should cover it | Fixed | +| A bill with a fixed part and a growing part | Split it. Don't enter the same dollars twice. | + +A yearly line of $100 shows $8.33 a month, because $100 ÷ 12 doesn't land on a whole cent. The math keeps the exact twelfth. + +[Stripe's gross margin guide](https://stripe.com/resources/more/saas-gross-margin-explained-what-it-is-and-why-it-is-important) puts hosting, support, and payment processing in the cost to serve. Some of that cost is fixed, and some of it grows. If your gross margin already subtracts a fixed hosting minimum or a support salary, don't use that whole margin as the variable share. Enter the fixed part on a fixed line and only the growing part as variable. + +A steady sales payroll can sit on a fixed line when you want the result to cover it. Ad spend that grows with each new customer is the cost of winning customers, and this page leaves it out. Use the [CAC payback calculator](/cac-payback-calculator) for that. + +## Should your own pay be included? + +Include it when you want the revenue that covers your pay and the other fixed costs. Leave it off when you want the other bills only. The breakdown shows the lines you included. + + + +Break-even MRR covers the costs on your list and nothing more. It doesn't add a profit goal, a tax reserve, or a cost you left off. This calculator doesn't ask for a target profit. + + + +## What if variable costs are a share of MRR? + +Use `Share of MRR` when the variable cost is a percent of recurring revenue. Break-even MRR is then fixed monthly cost divided by the share you keep. + + + +Break-even MRR = fixed costs ÷ (1 - variable share) + + + +$4,500 of fixed costs and a 20% variable share leave 80 cents of each revenue dollar, so break-even MRR is $5,625.00. Leave ARPA blank and the revenue answer is still complete, but there's no account count. + +Add an ARPA of $29 and contribution is $23.20 per account. You need 194 accounts. Those bring $5,626.00, which leaves $0.80 after fixed costs. + +The share stops at 100%, so this mode can't show an account that loses money. Use `Per account` with a variable cost above ARPA for that case. + +## What does current MRR change? + +Current MRR shows where today's recurring revenue sits against break-even. It doesn't change break-even MRR. + +Take $1,000 of fixed costs, $50 of ARPA, and $10 of variable cost. Contribution is $40.00 and break-even MRR is $1,250.00. 25 accounts bring exactly $1,250.00, so the two revenue figures match here. + +| Current MRR | Monthly result now | Gap | More accounts at $50 | +| --- | --- | --- | --- | +| $500 | -$600.00 | MRR still needed: $750.00 | 15 | +| $5,000 | $3,000.00 | Above break-even by $3,750.00 | 0 | + +At $500 of current MRR, variable costs leave $400.00, which is $600.00 short of the $1,000 fixed cost. Each extra account adds $40.00, so 15 accounts close that $600.00 gap. + +When the main result isn't a dollar amount, `Monthly result now` still shows. The revenue gap and the extra accounts stay blank. + +## When is there no break-even point? + +There's no break-even point when each account contributes nothing or loses money. More accounts can't close a fixed-cost gap then. + +| Contribution | Fixed costs | Main result | +| --- | --- | --- | +| Positive | Above 0 | The dollar amount | +| Positive | 0 | `$0.00`. Any paying account adds profit. | +| Zero | Above 0 | `No break-even point`. More accounts never cover the fixed costs. | +| Negative | Above 0 | `No break-even point`. More accounts widen the gap. | +| Zero | 0 | `Breaks even at any MRR` | +| Negative | 0 | `Only at $0 MRR`. Each added account loses money. | + +ARPA of $29 and a variable cost of $29, with $4,500 fixed, leaves $0.00 per account, so more accounts never cover that $4,500. A variable cost of $30 loses $1.00 per account, so more accounts widen the gap. At a current MRR of $2,900, monthly result now is -$4,600.00. + +## Is break-even MRR cash, or a date? + +Neither. It is the monthly rate of recurring revenue that covers this cost list. [ChartMogul's MRR definition](https://chartmogul.com/saas-metrics/mrr/) spreads each subscription across its billing interval and leaves one-time charges out, so MRR is not the cash you collect this month. + +[Stripe's guide to subscription revenue recognition](https://stripe.com/gb/resources/more/revenue-recognition-for-subscription-based-businesses-explained) also counts revenue as the service is delivered. A customer can pay for a year up front and still add one twelfth to MRR. This page doesn't predict the month you'll reach break-even, and it isn't an income statement. + +One ARPA is an average, and several plans can drift from it. The SBA notes that one average can misstate a mix of products. Use a weighted average, or run the calculator once per plan. + +Next, the [CAC payback calculator](/cac-payback-calculator) shows how many months of gross profit repay the cost of one new customer. Build that cost in the [customer acquisition cost calculator](/customer-acquisition-cost-calculator) when it needs its own lines. The [customer lifetime value calculator](/customer-lifetime-value-calculator) and the [LTV:CAC calculator](/ltv-cac-calculator) compare what a customer is worth with what they cost. The [SaaS metrics calculator](/saas-metrics-calculator) gives the wider picture for one month. diff --git a/app/(site)/(tools)/(saas)/break-even-mrr-calculator/content/intro.mdx b/app/(site)/(tools)/(saas)/break-even-mrr-calculator/content/intro.mdx new file mode 100644 index 00000000..caa843b6 --- /dev/null +++ b/app/(site)/(tools)/(saas)/break-even-mrr-calculator/content/intro.mdx @@ -0,0 +1,5 @@ +This calculator shows the monthly recurring revenue that covers your fixed costs after variable costs, and how many paying accounts that takes. + +List the costs that stay the same as you add accounts. Have the monthly revenue per account, and either a variable cost per account or a percent of revenue. + +Add your current recurring revenue if you want the gap from today. diff --git a/app/(site)/(tools)/(saas)/break-even-mrr-calculator/content/usage.mdx b/app/(site)/(tools)/(saas)/break-even-mrr-calculator/content/usage.mdx new file mode 100644 index 00000000..b675ca59 --- /dev/null +++ b/app/(site)/(tools)/(saas)/break-even-mrr-calculator/content/usage.mdx @@ -0,0 +1,25 @@ +## What to enter + +Fixed costs stay the same when you add a paying account. Use one line per cost, up to 20. A name is optional. A blank name shows as Fixed cost 1, Fixed cost 2, and so on in the breakdown. + +A monthly line is what you pay each month. A yearly line is the bill for the whole year, and the breakdown divides it by 12. + +Add your own pay only when this answer should cover it. Leave it off when you want the other bills only. + +Split a bill that has a minimum plus usage. The minimum is fixed. The part that grows with accounts or revenue is variable. Don't type the whole bill in both places. + +`Per account` is a dollar cost for each paying account, such as usage-based hosting or a per-seat tool. It can be higher than the revenue from that account. `Share of MRR` is a percent of recurring revenue, from 0 to 100, such as a payment fee. Only the field for the method you picked counts. + +Monthly ARPA is average revenue per account for one month. With `Per account`, ARPA must be above 0. With `Share of MRR`, it's optional. A blank ARPA means the account count is unknown, not that revenue is zero. + +Current MRR is optional. Use the recurring monthly amount, and count a yearly plan as one twelfth. Leave it blank if you don't know it. Type 0 only when today's recurring revenue really is zero. + +Type digits with up to two decimals. A `$`, comma, or `%` sign is rejected. Currency changes the symbol only. + +## How to read the result + +The main result is the smallest monthly recurring revenue that covers your fixed costs after variable costs. + +`Paying accounts needed` rounds up to a whole account. `MRR at N accounts` is the revenue those accounts bring in, which can be a little higher than the main result. `Left after fixed costs` is what those accounts leave after variable and fixed costs. + +`Monthly result now` shows after you enter current MRR. It is that revenue after variable costs, minus fixed costs. A minus sign is a shortfall on this cost list. Cash in the bank can differ. diff --git a/app/(site)/(tools)/(saas)/break-even-mrr-calculator/page.tsx b/app/(site)/(tools)/(saas)/break-even-mrr-calculator/page.tsx index 6347f298..b5486400 100644 --- a/app/(site)/(tools)/(saas)/break-even-mrr-calculator/page.tsx +++ b/app/(site)/(tools)/(saas)/break-even-mrr-calculator/page.tsx @@ -1,18 +1,24 @@ import { Scale } from "lucide-react"; import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { PageCanvas } from "@/app/ui/site/page-canvas"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { BreakEvenMrrCalculator } from "./break-even-mrr-calculator"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function BreakEvenMrrCalculatorPage() { const toolPage = await getRequiredToolPage("break-even-mrr-calculator"); return ( - } toolPage={toolPage} /> + } intro={} toolPage={toolPage} /> - + + +
+ ); diff --git a/app/(site)/(tools)/(saas)/burn-multiple-calculator/content/article.mdx b/app/(site)/(tools)/(saas)/burn-multiple-calculator/content/article.mdx new file mode 100644 index 00000000..c66c4b64 --- /dev/null +++ b/app/(site)/(tools)/(saas)/burn-multiple-calculator/content/article.mdx @@ -0,0 +1,35 @@ +## How is burn multiple calculated? + +Divide net cash burn by net new ARR for the same period. + + + +Burn multiple = net cash burn ÷ net new ARR + + + +David Sacks of Craft Ventures [introduced the burn multiple](https://www.craftventures.com/articles/the-burn-multiple) to ask how much a startup burns to add each dollar of ARR. His example: a startup burned $2 million in a quarter while ARR grew $1 million, a burn multiple of 2. + +## What is a good burn multiple? + +Lower is better. Investors in venture-backed startups often use these bands. + +| Burn multiple | Read as | +| --- | --- | +| Under 1 | Exceptional | +| 1 to 1.5 | Great | +| 1.5 to 2 | Good | +| 2 to 3 | Worth looking into | +| Above 3 | A warning sign | + +[ChartMogul's burn multiple guide](https://chartmogul.com/saas-metrics/burn-multiple/) lists these bands. Craft Ventures calls its own table rules of thumb for venture-stage startups. + +## Why does my burn multiple jump around? + +Small ARR changes make big multiples. $12,000 of burn against $1,000 of net new ARR is 12×, even if the business is fine. A large deal, a lost customer, or a big payment near the edge of a period can swing it too. Longer periods smooth this out. + +Burn multiple also doesn't show that the spending caused the growth. It only compares the two numbers. + +## Where do the inputs come from? + +Net new ARR is usually the change in run-rate ARR, which counts monthly plans too. The [ARR calculator](/arr-calculator) explains the two meanings of ARR. To see which gains and losses made up the change, use the [MRR waterfall calculator](/mrr-waterfall-calculator). diff --git a/app/(site)/(tools)/(saas)/burn-multiple-calculator/content/intro.mdx b/app/(site)/(tools)/(saas)/burn-multiple-calculator/content/intro.mdx new file mode 100644 index 00000000..205331a1 --- /dev/null +++ b/app/(site)/(tools)/(saas)/burn-multiple-calculator/content/intro.mdx @@ -0,0 +1,3 @@ +This calculator shows your burn multiple: how much cash you burned for each dollar of annual recurring revenue (ARR) you added. + +Have one period's net cash burn and net new ARR, such as a quarter's burn and how much ARR grew that quarter. diff --git a/app/(site)/(tools)/(saas)/burn-multiple-calculator/content/usage.mdx b/app/(site)/(tools)/(saas)/burn-multiple-calculator/content/usage.mdx new file mode 100644 index 00000000..6a3b7774 --- /dev/null +++ b/app/(site)/(tools)/(saas)/burn-multiple-calculator/content/usage.mdx @@ -0,0 +1,19 @@ +## What to enter + +Net cash burn is the cash you spent running the business minus the cash customers paid you. Leave out money from investors and loans. If customers paid you more than you spent, enter a negative amount. + +Net new ARR is ARR at the end of the period minus ARR at the start. ARR is already a yearly rate, so don't annualize the change, and don't multiply a quarter's burn by four. + +If you track MRR, net new ARR is the change in MRR × 12. MRR going from $40,000 to $42,000 is $24,000 of net new ARR. + +## How to read the result + + + +You burned $36,000. ARR grew from $480,000 to $504,000, so net new ARR is $24,000. + +Burn multiple is 1.50×. You spent $1.50 of cash for each $1 of new ARR. + + + +If you didn't burn cash, or ARR didn't grow, there's no multiple to show. The result says which one happened. diff --git a/app/(site)/(tools)/(saas)/burn-multiple-calculator/page.tsx b/app/(site)/(tools)/(saas)/burn-multiple-calculator/page.tsx index 7b673588..c4e3cd85 100644 --- a/app/(site)/(tools)/(saas)/burn-multiple-calculator/page.tsx +++ b/app/(site)/(tools)/(saas)/burn-multiple-calculator/page.tsx @@ -1,18 +1,24 @@ import { Coins } from "lucide-react"; import { ToolPageShell } from "@/app/ui/tools/tool-page-shell"; -import { ToolPageHeader, ToolPageMarkdown } from "@/app/ui/site/tool-page-content"; +import { ToolPageArticle, ToolPageHeader } from "@/app/ui/site/tool-page-content"; import { PageCanvas } from "@/app/ui/site/page-canvas"; import { getRequiredToolPage } from "@/lib/tool-pages"; import { BurnMultipleCalculator } from "./burn-multiple-calculator"; +import Article from "./content/article.mdx"; +import Intro from "./content/intro.mdx"; +import Usage from "./content/usage.mdx"; export default async function BurnMultipleCalculatorPage() { const toolPage = await getRequiredToolPage("burn-multiple-calculator"); return ( -