diff --git a/deploy/Caddyfile b/deploy/Caddyfile
index bbae05c9..36fdc21e 100644
--- a/deploy/Caddyfile
+++ b/deploy/Caddyfile
@@ -99,7 +99,11 @@ message.style {
@moved_webhook_post path /blog/executing-webhooks /blog/executing-webhooks/
redir @moved_webhook_post /features/discord-webhooks 301
- redir /app /app/
+ # The app's root is the editor. Redirect so search engines see one URL for it
+ # instead of three. The app redirects / to /editor the same way, keeping the query.
+ @app_root path /app /app/
+ redir @app_root /app/editor{?query} 301
+
handle_path /app/* {
root * /srv/message.style/app
@@ -114,10 +118,9 @@ message.style {
}
# Pages people search for have their own title and text, see embedg-app/pages.ts.
- # Everything else gets index.html, which is noindex. /app itself is the editor.
+ # Everything else gets index.html, which is noindex.
handle {
header Cache-Control "no-cache"
- rewrite / /pages/editor.html
rewrite /editor/share/* /pages/shared.html
try_files /pages{path}.html {path} {path}/ /index.html
file_server
diff --git a/embedg-server/command/cmd_embed.go b/embedg-server/command/cmd_embed.go
index 908d2c94..272ba06c 100644
--- a/embedg-server/command/cmd_embed.go
+++ b/embedg-server/command/cmd_embed.go
@@ -10,7 +10,7 @@ import (
func (g *CommandHandler) handleEmbedCommand(e *handler.CommandEvent) error {
return e.Respond(discord.InteractionResponseTypeCreateMessage, discord.MessageCreate{
- Content: "If you want to have more options to customize your message go to [message.style]()!",
+ Content: "If you want to have more options to customize your message go to [message.style]()!",
Components: embedEditComponents(),
Flags: discord.MessageFlagEphemeral,
})
diff --git a/embedg-site/blog/2026-09-30-fluxer-webhooks/index.md b/embedg-site/blog/2026-09-30-fluxer-webhooks/index.md
index 93176e54..7e085627 100644
--- a/embedg-site/blog/2026-09-30-fluxer-webhooks/index.md
+++ b/embedg-site/blog/2026-09-30-fluxer-webhooks/index.md
@@ -12,7 +12,7 @@ Embed Generator can now send messages to [Fluxer](https://fluxer.app). Paste a F
For a while we supported Guilded the same way, until Roblox shut it down in December 2025. Fluxer is a better fit anyway. It's an open source chat platform that opened to the public in January, and its webhooks follow Discord's closely: the same URL shape, the same embed format and the same Markdown, down to `` timestamps and `-#` subtext. A message you built for Discord mostly works on Fluxer as it is.
-To try it, create a webhook in the settings of a Fluxer channel and copy the URL, which starts with `https://api.fluxer.app/webhooks/`. In the [editor](https://message.style/app), pick Webhook as the target and paste it. The editor recognizes the URL and adjusts to what Fluxer can show. Content, up to 10 embeds with every field, file attachments and a custom name and avatar per message all go through. You can edit a message after sending it by pasting its link, or restore it into the editor to pick up where you left off. The [Webhook Info tool](https://message.style/app/tools/webhook-info) reads Fluxer webhooks as well.
+To try it, create a webhook in the settings of a Fluxer channel and copy the URL, which starts with `https://api.fluxer.app/webhooks/`. In the [editor](https://message.style/app/editor), pick Webhook as the target and paste it. The editor recognizes the URL and adjusts to what Fluxer can show. Content, up to 10 embeds with every field, file attachments and a custom name and avatar per message all go through. You can edit a message after sending it by pasting its link, or restore it into the editor to pick up where you left off. The [Webhook Info tool](https://message.style/app/tools/webhook-info) reads Fluxer webhooks as well.
The part that doesn't carry over is components. Fluxer has no buttons, select menus or Components V2 layouts yet, so the editor hides them while a Fluxer webhook is the target and won't send a message that still has them. The same goes for everything that runs through the Embed Generator bot, like buttons that hand out roles, scheduled messages and custom commands, since the bot only lives on Discord. Fluxer's roadmap lists buttons and interactions, and we'll look at it again once they exist.
diff --git a/embedg-site/docs/features/fluxer.md b/embedg-site/docs/features/fluxer.md
index 7daca8b6..f150a82a 100644
--- a/embedg-site/docs/features/fluxer.md
+++ b/embedg-site/docs/features/fluxer.md
@@ -10,7 +10,7 @@ description: Send embeds to Fluxer with Embed Generator. Paste a Fluxer webhook
## Send a message to Fluxer
1. In Fluxer, create a webhook in the settings of the channel you want to post in and copy its URL. It starts with `https://api.fluxer.app/webhooks/`.
-2. Open the [editor](https://message.style/app), choose **Webhook** as the target and paste the URL.
+2. Open the [editor](https://message.style/app/editor), choose **Webhook** as the target and paste the URL.
3. Build the message and click **Send Message**.
Paste the link of a message you sent into **Message ID or URL** to edit it later, or click **Restore Message** to load it back into the editor.
diff --git a/embedg-site/docs/guides/migrating-discohook.md b/embedg-site/docs/guides/migrating-discohook.md
index 95512ac6..b601d973 100644
--- a/embedg-site/docs/guides/migrating-discohook.md
+++ b/embedg-site/docs/guides/migrating-discohook.md
@@ -10,7 +10,7 @@ If you are coming from Discohook and would like to start using Embed Generator i
## Getting started
-To get started with Embed Generator go [message.style/app](https://message.style/app). You will see a message editor that should look fairly similar to what you are used to from Discohook. There are a few differences, but all the features you are used to are there and work the same way - or better - as with Discohook.
+To get started with Embed Generator go [message.style/app](https://message.style/app/editor). You will see a message editor that should look fairly similar to what you are used to from Discohook. There are a few differences, but all the features you are used to are there and work the same way - or better - as with Discohook.
One important difference is that you will want to login with your Discord account when you are using Embed Generator. This makes it possible to save your messages in the cloud so you can access them on any device. With Discohook your message backups are stored locally and are no synchronized between devices, this makes it easy to lose your messages accidentally.
diff --git a/embedg-site/docs/guides/webhooks.md b/embedg-site/docs/guides/webhooks.md
index 42eb49f8..ea04a848 100644
--- a/embedg-site/docs/guides/webhooks.md
+++ b/embedg-site/docs/guides/webhooks.md
@@ -22,7 +22,7 @@ You need the **Manage Webhooks** permission in the channel.
## Send a message with Embed Generator
-1. Open the [editor](https://message.style/app).
+1. Open the [editor](https://message.style/app/editor).
2. At the top, choose **Webhook** as the target and paste the URL.
3. Build your message: content, embeds, images, or a [Components V2](../features/components-v2) layout. Optionally set a username and avatar for this message.
4. Click **Send Message**.
diff --git a/embedg-site/docs/intro.md b/embedg-site/docs/intro.md
index 49a31f06..086244c8 100644
--- a/embedg-site/docs/intro.md
+++ b/embedg-site/docs/intro.md
@@ -11,7 +11,7 @@ Embed Generator is a visual editor for Discord messages. You build embeds, butto
## Your first message in five steps
-1. **Open the editor** at [message.style/app](https://message.style/app). No account needed for this part.
+1. **Open the editor** at [message.style/app](https://message.style/app/editor). No account needed for this part.
2. **Write the message.** Add content, then click **Add Embed** for a title, description, fields, an image and a color. The preview on the right updates as you type.
3. **Set a name and avatar** at the top if you don't want the default ones.
4. **Pick where it goes.** Log in with Discord, invite the bot and choose a channel, which unlocks every feature. Or paste a [webhook URL](./guides/webhooks.md) if you'd rather not log in. See [Webhook or Channel?](./guides/send-modes.md) for the difference.
diff --git a/embedg-site/docusaurus.config.ts b/embedg-site/docusaurus.config.ts
index ce387b56..0758e89a 100644
--- a/embedg-site/docusaurus.config.ts
+++ b/embedg-site/docusaurus.config.ts
@@ -182,7 +182,7 @@ const config: Config = {
position: "right",
},
{
- href: "https://message.style/app",
+ href: "https://message.style/app/editor",
label: "Open App",
position: "right",
className: "navbar__item--cta",
@@ -195,7 +195,7 @@ const config: Config = {
{
title: "Product",
items: [
- { label: "Open App", href: "https://message.style/app" },
+ { label: "Open App", href: "https://message.style/app/editor" },
{ label: "Premium", href: "https://message.style/premium" },
{ label: "Documentation", to: "/docs" },
{ label: "Blog", to: "/blog" },
diff --git a/embedg-site/src/components/HomeFooter.tsx b/embedg-site/src/components/HomeFooter.tsx
index 0513261e..9e02feb7 100644
--- a/embedg-site/src/components/HomeFooter.tsx
+++ b/embedg-site/src/components/HomeFooter.tsx
@@ -4,7 +4,7 @@ const columns = [
{
title: "Product",
links: [
- { label: "Open App", href: "/app" },
+ { label: "Open App", href: "/app/editor" },
{ label: "Premium", href: "/premium" },
{ label: "Documentation", href: "/docs" },
{ label: "Blog", href: "/blog" },
diff --git a/embedg-site/src/components/HomeHeader.tsx b/embedg-site/src/components/HomeHeader.tsx
index 3ba6c2e9..8a46b5df 100644
--- a/embedg-site/src/components/HomeHeader.tsx
+++ b/embedg-site/src/components/HomeHeader.tsx
@@ -38,7 +38,7 @@ export default function HomeHeader(): JSX.Element {
))}
diff --git a/embedg-site/src/components/HomeHero.tsx b/embedg-site/src/components/HomeHero.tsx
index 708265ce..1ccb97b2 100644
--- a/embedg-site/src/components/HomeHero.tsx
+++ b/embedg-site/src/components/HomeHero.tsx
@@ -22,7 +22,7 @@ export default function HomeHero(): JSX.Element {