NB: if this is an editor2 post and you want it editable locally via editor2, don't forget you need to run `npm run sync-dev-ydocs`.
This is a document with many node types. It lives in `test/helpers/bodyStubs/all_node_types.ts`. For now, it is in building mode as we get a better handle on nodes for editor2. Don't expect to be able to edit all of them in editor2. If you add a new node type, add it here to help people figure things out!
Don't forget that you can also append /email to this path to see if this also renders correctly in email.
node.type: [image3]

node.type: [applePodcast]
The below video will not work--there is no file in s3
node.type: [video]
node.type: [audio]
node.type: [twitter]

Yet another Blockbuster Video 📼 is closing.https://t.co/Jy8UobAToS
They started the year with 9 stores, this brings them down to just 3: two in Alaska and one in Oregon. pic.twitter.com/9PvR3VwiZJ
node.type: [twitter2]
node.type: [youtube]
node.type: [youtube2]
below is a button with URL https://test1.substack.info/subscribe?, which is replaced with deepPrepare magic
node.type: [button]
below is a button with URL that does not use deepPrepare magic
node.type: [button]
node.type: [image]
node.type: [image2]

node.type: [subscribeWidget]
node.type: [embeddedPost]
node.type: [spotify]
node.type: [spotify2]
node.type: [cashtag]
node.type: [comic]
node.type: [pdf]
node.type: [ebook]
node.type: [file]
node.type: [substack_mentions]
node.type: [instagram]
node.type: [poll]
node.type: [embeddedPublication]
node.type: [install_substack_app]
node.type: [install_substack_app]
node.type: [bandcamp]
node.type: [vimeo]
node.type: [tiktok]
Enable 3rd party cookies or use another browser
node.type: [opensea]
node.type: [soundcloud]
node.type: [communityChat]
node.type: [comment]
node.type: [assetError]

node.type: [communityPost]
node.type: [gitgist]
import SwiftUI | |
extension String { | |
static let nameKey = "nameKey" | |
static let ageKey = "ageKey" | |
} | |
struct ContentView: View { | |
@AppStorage(.nameKey) var name: String = "" | |
let age = UserDefaults.standard.integer(forKey: .ageKey) | |
var body: some View { | |
VStack { | |
Text("name: \(name)") | |
Text("age: \(age)") | |
} | |
} | |
} |
The following node, augmentation_placeholder, should never appear in a published document. It is included here for completeness.
node.type: [augmentation_placeholder]
node.type: [prediction_market]
node.type: [manifold]
node.type: [kindle]
node.type: [datawrapper]
node.type: [lichess]
node.type: [imageGallery]



node.type: [blockquote]
here is a blockquote
node.type: [pullquote]
Here is a pull quote
node.type: [captionedImage]
node.type: [captionedShareButton]
node.type: [captionedWriterReferralButton]
node.type: [latex_block]
node.type: [codeBlock TipTap]
System.out.println("hello world");
node.type: [bulletList TipTap]
dog
cat
node.type: [orderedList TipTap]
alpha
beta
node.type: [horizontalRule TipTap]
node.type: [hardBreak TipTap]
node.type: [paragraph]
a footnote1
node.type: [preformatted_text_block]
big space then newline down here
node.type: [bold TipTap]
foo BOLD bar
node.type: [italic TipTap]
foo BOLD bar
node.type: [strike TipTap]
foo BOLD bar
node.type: [subscript]
foosubbar
node.type: [superscript]
foosuperbar
node.type: [link]
foo linked text bar
node.type: [meeting]

Book a meeting with Rob Henderson
node.type: [digestPostEmbed]
audioUrl never appears in a doc, as far as I can tell, but we use it to render old podcast episodes on custom publication themes (at least according to a comment in the schema file), so we are including it here.
node.type: [audioUrl]
templateComment should never appear in a published doc. However we are going to include it here b/c otherwise we will run the risk of breaking renders, even if only in the editor, that we are not aware of. Inclusion of this node will prevent publishing of the post however.
node.type: [templateComment]
--- READ AND DELETE BEFORE SENDING ---\n\nSpecial offers are one of the most effective tools Substack writers have to convert free readers to paid. We've found that time-limited sales are particularly effective.\n\nThe default offer will expire 24 hours after you created this draft.\n\nIf you want to modify the special offer, you can create your own by deleting the button below and inserting a new one under More → Buttons → Special offer.\n\nThe text below is just an example, so we recommend personalizing the email to reflect your publication, voice, and readership.\n\n--- READ AND DELETE BEFORE SENDING ---
node.type: [referral_link]
preview_in_substack_app should never be persisted. We are including it here for the sake of completeness, and to help this be a more fully fleshed canary post. This does not point at a pub/post that exists in the dev server.
node.type: [preview_in_substack_app]
fragmentNode is a weird one we insert during pasting footnotes, apparently. Make sure we can stay rendering it in case it got persisted somehow.
node.type: [fragmentNode]
node.type: [referralTier]
node.type: [button]
node.type: [recipe]
node.type: [sponsorshipCampaign]
node.type: [pinterest]
node.type: [fpRecircBlock]
node.type: [footnote]
something down here