diff --git a/src/web/docs/api/endpoints/view.pug b/src/web/docs/api/endpoints/view.pug
index cab814cabc..d456022f6e 100644
--- a/src/web/docs/api/endpoints/view.pug
+++ b/src/web/docs/api/endpoints/view.pug
@@ -1,9 +1,6 @@
 extends ../../layout.pug
 include ../mixins
 
-block title
-	| #{endpoint} | Misskey API
-
 block meta
 	link(rel="stylesheet" href="/assets/docs/api/endpoints/style.css")
 
diff --git a/src/web/docs/api/entities/view.pug b/src/web/docs/api/entities/view.pug
index 756e966b53..57c6d4cad7 100644
--- a/src/web/docs/api/entities/view.pug
+++ b/src/web/docs/api/entities/view.pug
@@ -1,9 +1,6 @@
 extends ../../layout.pug
 include ../mixins
 
-block title
-	| #{name} | Misskey API
-
 block meta
 	link(rel="stylesheet" href="/assets/docs/api/entities/style.css")
 
diff --git a/src/web/docs/api/gulpfile.ts b/src/web/docs/api/gulpfile.ts
index 6cbae5ea2d..139ae92412 100644
--- a/src/web/docs/api/gulpfile.ts
+++ b/src/web/docs/api/gulpfile.ts
@@ -108,12 +108,13 @@ gulp.task('doc:api:endpoints', () => {
 				paramDefs: extractDefs(ep.params),
 				res: sortParams(ep.res.map(p => parseParam(p))),
 				resDefs: extractDefs(ep.res),
-				kebab,
-				common: commonVars
 			};
 			langs.forEach(lang => {
 				pug.renderFile('./src/web/docs/api/endpoints/view.pug', Object.assign({}, vars, {
-					lang
+					lang,
+					title: ep.endpoint,
+					kebab,
+					common: commonVars
 				}), (renderErr, html) => {
 					if (renderErr) {
 						console.error(renderErr);
@@ -146,12 +147,13 @@ gulp.task('doc:api:entities', () => {
 				desc: entity.desc,
 				props: sortParams(entity.props.map(p => parseParam(p))),
 				propDefs: extractDefs(entity.props),
-				kebab,
-				common: commonVars
 			};
 			langs.forEach(lang => {
 				pug.renderFile('./src/web/docs/api/entities/view.pug', Object.assign({}, vars, {
-					lang
+					lang,
+					title: entity.name,
+					kebab,
+					common: commonVars
 				}), (renderErr, html) => {
 					if (renderErr) {
 						console.error(renderErr);
diff --git a/src/web/docs/gulpfile.ts b/src/web/docs/gulpfile.ts
index 6f2351dacb..2377844650 100644
--- a/src/web/docs/gulpfile.ts
+++ b/src/web/docs/gulpfile.ts
@@ -36,20 +36,30 @@ gulp.task('doc:docs', () => {
 			const [, name, lang] = file.match(/docs\/(.+?)\.(.+?)\.pug$/);
 			const vars = {
 				common: commonVars,
-				lang: lang
+				lang: lang,
+				title: fs.readFileSync(file, 'utf-8').match(/^h1 (.+?)\r?\n/)[1]
 			};
-			pug.renderFile(file, vars, (renderErr, html) => {
+			pug.renderFile(file, vars, (renderErr, content) => {
 				if (renderErr) {
 					console.error(renderErr);
 					return;
 				}
-				const htmlPath = `./built/web/docs/${lang}/${name}.html`;
-				mkdirp(path.dirname(htmlPath), (mkdirErr) => {
-					if (mkdirErr) {
-						console.error(mkdirErr);
+
+				pug.renderFile('./src/web/docs/layout.pug', Object.assign({}, vars, {
+					content
+				}), (renderErr2, html) => {
+					if (renderErr2) {
+						console.error(renderErr2);
 						return;
 					}
-					fs.writeFileSync(htmlPath, html, 'utf-8');
+					const htmlPath = `./built/web/docs/${lang}/${name}.html`;
+					mkdirp(path.dirname(htmlPath), (mkdirErr) => {
+						if (mkdirErr) {
+							console.error(mkdirErr);
+							return;
+						}
+						fs.writeFileSync(htmlPath, html, 'utf-8');
+					});
 				});
 			});
 		});
diff --git a/src/web/docs/index.en.pug b/src/web/docs/index.en.pug
index af0bba8b2c..1fcc870d3d 100644
--- a/src/web/docs/index.en.pug
+++ b/src/web/docs/index.en.pug
@@ -1,9 +1,3 @@
-extends ./layout.pug
+h1 Misskey Docs
 
-block title
-	| Misskey Docs
-
-block main
-	h1 Misskey Docs
-
-	p Welcome to docs of Misskey.
+p Welcome to docs of Misskey.
diff --git a/src/web/docs/index.ja.pug b/src/web/docs/index.ja.pug
index cd43045f6e..4a0bf7fa1d 100644
--- a/src/web/docs/index.ja.pug
+++ b/src/web/docs/index.ja.pug
@@ -1,9 +1,3 @@
-extends ./layout.pug
+h1 Misskey ドキュメント
 
-block title
-	| Misskey ドキュメント
-
-block main
-	h1 Misskey ドキュメント
-
-	p Misskeyのドキュメントへようこそ
+p Misskeyのドキュメントへようこそ
diff --git a/src/web/docs/layout.pug b/src/web/docs/layout.pug
index d6ecb4b6aa..f8570dd3ac 100644
--- a/src/web/docs/layout.pug
+++ b/src/web/docs/layout.pug
@@ -5,7 +5,7 @@ html(lang= lang)
 		meta(charset="UTF-8")
 		meta(name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no")
 		title
-			block title
+			| #{title} | Misskey Docs
 		link(rel="stylesheet" href="/assets/docs/style.css")
 		block meta
 
@@ -27,3 +27,5 @@ html(lang= lang)
 								li: a(href=`/docs/${lang}/api/endpoints/${common.kebab(endpoint)}`)= endpoint
 		main
 			block main
+			if content
+				| !{content}
diff --git a/src/web/docs/vars.ts b/src/web/docs/vars.ts
index 80fdc9a7de..37bc9d7b0f 100644
--- a/src/web/docs/vars.ts
+++ b/src/web/docs/vars.ts
@@ -27,7 +27,7 @@ export default function() {
 				title: {}
 			};
 		}
-		vars['docs'][name]['title'][lang] = fs.readFileSync(x, 'utf-8').match(/\r?\n\th1 (.+?)\r?\n/)[1];
+		vars['docs'][name]['title'][lang] = fs.readFileSync(x, 'utf-8').match(/^h1 (.+?)\r?\n/)[1];
 	});
 
 	vars['kebab'] = string => string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase();