diff --git a/packages/console/src/assets/docs/guides/web-express/README.mdx b/packages/console/src/assets/docs/guides/web-express/README.mdx
index bc13e20d5..e2705d0a6 100644
--- a/packages/console/src/assets/docs/guides/web-express/README.mdx
+++ b/packages/console/src/assets/docs/guides/web-express/README.mdx
@@ -5,12 +5,14 @@ import InlineNotification from '@/ds-components/InlineNotification';
 import { generateStandardSecret } from '@logto/shared/universal';
 import Steps from '@/mdx-components/Steps';
 import Step from '@/mdx-components/Step';
+import Checkpoint from '../../fragments/_checkpoint.md';
+import RedirectUris from '../../fragments/_redirect-uris-web.mdx';
 
 <Steps>
 
 <Step
   title="Installation"
-  subtitle="Install Logto SDK for your project"
+  subtitle="Install Logto SDK and required dependencies"
 >
 
 <Tabs>
@@ -39,36 +41,26 @@ pnpm add @logto/express cookie-parser express-session
 </Step>
 
 <Step
-  title="Init LogtoClient"
+  title="Prepare configs and required middlewares"
 >
 
-<InlineNotification>
-  In the following steps, we assume your app is running on <code>http://localhost:3000</code>.
-</InlineNotification>
+Prepare configuration for the Logto client:
 
-Import and initialize LogtoClient:
+<Code title="app.ts" className="language-ts">
+    {`import type { LogtoExpressConfig } from '@logto/express';
 
-<Code className="language-ts">
-    {`import LogtoClient from '@logto/express';
-
-export const logtoClient = new LogtoClient({
+const config: LogtoExpressConfig = {
   endpoint: '${props.endpoint}',
   appId: '${props.app.id}',
   appSecret: '${props.app.secret}',
   baseUrl: 'http://localhost:3000', // Change to your own base URL
-});`}
+};
+`}
 </Code>
 
-</Step>
-
-<Step
-  title="Prepare required middlewares"
-  subtitle="1 step"
->
-
 The SDK requires [express-session](https://www.npmjs.com/package/express-session) to be configured in prior.
 
-<Code className="language-ts">
+<Code className="language-ts" title="app.ts">
     {`import cookieParser from 'cookie-parser';
 import session from 'express-session';
 
@@ -78,86 +70,48 @@ app.use(session({ secret: '${generateStandardSecret()}', cookie: { maxAge: 14 *
 
 </Step>
 
-<Step
-  title="Implement sign-in"
->
+<Step title="Register auth routes">
 
-### Configure Redirect URI
-
-First, let’s enter your redirect URI. E.g. `http://localhost:3000/api/logto/sign-in-callback`.
-
-<UriInputField name="redirectUris" />
-
-### Prepare Logto routes
-
-Prepare routes to connect with Logto.
-
-Go back to your IDE/editor, use the following code to implement the API routes first:
-
-```ts
-import { handleAuthRoutes } from '@logto/express';
-
-app.use(handleAuthRoutes(config));
-```
-
-This will create 3 routes automatically:
+The SDK provides a helper function `handleAuthRoutes` to register 3 routes:
 
 1. `/logto/sign-in`: Sign in with Logto.
 2. `/logto/sign-in-callback`: Handle sign-in callback.
 3. `/logto/sign-out`: Sign out with Logto.
 
-### Implement sign-in
+Add the following code to your app:
 
-We're almost there! Now, create a sign-in button to redirect to the sign-in route on user click.
+```ts title="app.ts"
+import { handleAuthRoutes } from '@logto/express';
 
-```ts
-app.get('/', (req, res) => {
-  res.setHeader('content-type', 'text/html');
-  res.end(`<div><a href="/logto/sign-in">Sign In</a></div>`);
-});
+app.use(handleAuthRoutes(config));
 ```
 
 </Step>
 
-<Step
-  title="Implement sign-out"
+<Step 
+  title="Configure redirect URIs"
+  subtitle="2 URIs"
 >
 
-Calling `/logto/sign-out` will clear all the Logto data in memory and cookies if they exist.
-
-After signing out, it'll be great to redirect your user back to your website. Let's add `http://localhost:3000` as one of the Post Sign-out URIs in Admin Console (shows under Redirect URIs).
+<RedirectUris callbackUri="http://localhost:3000/logto/sign-in-callback" />
 
 </Step>
 
-<Step
-  title="Handle authentication status"
->
+<Step title="Implement sign-in and sign-out">
 
-In Logto SDK, you can use the `withLogto` middleware to get `req.user.isAuthenticated` to check the authentication status, if the user is signed in, the value will be `true`, otherwise, the value will be `false`.
+With the routes registered, now let's implement the sign-in and sign-out buttons in the home page. We need to redirect the user to the sign-in or sign-out route when needed. To help with this, use `withLogto` to inject authentication status to `req.user`.
 
-```ts
+```ts title="app.ts"
 import { withLogto } from '@logto/express';
 
-app.use(withLogto(config));
-```
+app.get('/', withLogto(config), (req, res) => {
+  res.setHeader('content-type', 'text/html');
 
-No, let's use this value to protect routes by creating a simple middleware:
-
-```ts
-const requireAuth = async (req: Request, res: Response, next: NextFunction) => {
-  if (!req.user.isAuthenticated) {
-    res.redirect('/logto/sign-in');
+  if (req.user.isAuthenticated) {
+    res.end(`<div>Hello ${req.user.claims?.sub}, <a href="/logto/sign-out">Sign Out</a></div>`);
+  } else {
+    res.end('<div><a href="/logto/sign-in">Sign In</a></div>');
   }
-
-  next();
-};
-```
-
-And then use it in the route handler:
-
-```ts
-app.get('/protected', requireAuth, (req, res) => {
-  res.end('protected resource');
 });
 ```
 </Step>
@@ -166,13 +120,9 @@ app.get('/protected', requireAuth, (req, res) => {
   title="Checkpoint: Test your application"
 >
 
-Now, you can test your application:
-
-1. Run your application, you will see the sign-in button.
-2. Click the sign-in button, and you will be redirected to the sign in route, and the SDK will then init the sign-in process and redirect to the Logto sign-in page.
-3. After you signed in, you will be redirect back to your application and see the sign-out button.
-4. Calling `/logto/sign-out` to sign-out.
+<Checkpoint />
 
 </Step>
 
 </Steps>
+