Retext
Dynamic fields

One snippet, the right details every time

Add today's date, a deadline next week, what you just copied, a name you type in, or another snippet. Retext fills them in as the snippet expands.

Dynamic fields come with every plan, Free included

Every field

Examples assume today is Wednesday, October 28, 2026, on a Mac set to US English.

{date}Today's date

→ October 28, 2026

The long date, written the way your Mac's region settings write it.

{date:short}Today's date, short

→ 10/28/26

The short date in your region's format.

{date+7}A date in the future

→ November 4, 2026

Any number of days ahead. {date+1} is tomorrow and {date+30} is 30 days out.

{date-1}A date in the past

→ October 27, 2026

Any number of days back. Add :short for the short form, as in {date+14:short}.

{time}The current time

→ 3:45 PM

Hours and minutes, in your Mac's 12- or 24-hour setting.

{day}Day of the week

→ Wednesday

The full name of today's weekday.

{clipboard}Your clipboard

→ whatever text you last copied

The text on your clipboard when the snippet expands. Your clipboard is left as it was afterwards.

{fill:Name}A fill-in prompt

→ what you type in the form

Retext asks for each fill-in before it pastes. Use the same label twice and you're asked once; both spots get your answer.

{cursor}Where the cursor lands

→ (nothing; your cursor goes here)

After expanding, the cursor sits here instead of at the end, ready for you to keep typing.

{snippet:sig}Another snippet

→ the full text of ;sig

Drops one snippet inside another. Use the trigger without the semicolon.

Worked examples

Copy any of these into Retext. In the results, | marks where your cursor lands.

Meeting follow-up

;fu

One fill-in for the name, a date two days out, your signature from ;sig, and the cursor waiting where the personal line goes.

Snippet

Hi {fill:First name},

Thanks for your time on {day}. As promised, I'll send the proposal by {date+2}.

{cursor}

{snippet:sig}

What gets typed

Hi Priya,

Thanks for your time on Wednesday. As promised, I'll send the proposal by October 30, 2026.

|

Best,
Sam Rivera

Invoice terms

;terms

Date math does the counting, so the due date is right every time.

Snippet

Invoice date: {date}
Payment due: {date+30} (net 30)
Reference: {fill:Invoice number}

What gets typed

Invoice date: October 28, 2026
Payment due: November 27, 2026 (net 30)
Reference: INV-1042

Quote what you copied

;re

Copy a line from an email or a chat, type ;re, and reply right under the quote.

Snippet

You wrote:
> {clipboard}

{cursor}

What gets typed

You wrote:
> Can we move the launch to Friday?

|

Support reply with a shared closing

;refund

Every reply ends with ;support-close. Change that one snippet and every reply that uses it changes too.

Snippet

Hi {fill:Customer name},

I've refunded order {fill:Order number}. You'll see it on your statement in 5 to 10 business days.

{snippet:support-close}

What gets typed

Hi Jordan,

I've refunded order 88213. You'll see it on your statement in 5 to 10 business days.

Anything else, just reply here.
The Acme Support Team

Timestamped note

;log

A quick stamp for changelogs, call notes and standups.

Snippet

[{date:short} {time}] {cursor}

What gets typed

[10/28/26 3:45 PM] |

Status update

;wk

The skeleton you'd retype every Friday, with the date filled in.

Snippet

Week ending {date+2:short}

Done:
- {cursor}

Next:
- 

Blocked on: {fill:Blocker, or none}

What gets typed

Week ending 10/30/26

Done:
- |

Next:
- 

Blocked on: none

The fine print

How fields behave at the edges.

Nest up to five deep

A snippet can include another, which can include another, five levels down. Reuse one as often as you like in the same snippet. A snippet that includes itself, or a trigger that doesn't exist, stays as typed so you can spot it.

One cursor

If a snippet has more than one {cursor}, the first one wins and the rest are removed.

Your Mac's formats

Dates and times follow your Mac's language and region settings, so a UK Mac writes 28 October 2026.

Fill-ins in the snippet you type

Put {fill:…} fields in the snippet you trigger. Fill-ins inside a nested snippet aren't asked for, so keep shared pieces like a signature fill-in free.

Previewed by autocomplete (beta)

With autocomplete on, ghost text shows a dynamic snippet the way it will read: today's date filled in, and fill-ins as [Name].

Converted on import

Import from TextExpander, Espanso, Raycast or Alfred and their placeholders become these fields wherever they mean the same thing. The import preview lists anything that didn't convert.

Questions? Answers.

What are dynamic fields?

Placeholders in curly braces that Retext replaces as the snippet expands. {date} becomes today's date, {clipboard} becomes what you copied, and {fill:Name} asks you for a name. The same snippet comes out right every time you use it.

Do fill-ins ask every time?

Yes. Each time a snippet with {fill:…} fields expands, Retext shows a small form with one box per label, then pastes the finished text where you were typing. Cancel the form and nothing is pasted.

Can I add or subtract days from a date?

Yes. {date+7} is a week from today and {date-1} is yesterday. Use any whole number of days, and add :short for the short format: {date+30:short}.

What happens with {snippet:…} if the snippet doesn't exist?

The field stays in the text exactly as written, so you can see what's missing. The same goes for a snippet that includes itself and for anything nested more than five levels deep.

Does {clipboard} change my clipboard?

No. Retext reads the text on your clipboard, pastes the finished snippet, and puts your clipboard back.

Do dynamic fields work in team snippets?

Yes. Team snippets are expanded the same way as your own, fields and all.

Stop retyping the date

Download Retext, paste in one of the examples above, and type its trigger.