diff --git a/content/features/private pages.md b/content/features/private pages.md
index e225e8c..9be591b 100644
--- a/content/features/private pages.md	
+++ b/content/features/private pages.md	
@@ -1,5 +1,7 @@
 ---
 title: Private Pages
+tags:
+- plugin/filter
 ---
 
 There may be some notes you want to avoid publishing as a website. Quartz supports this through two mechanisms which can be used in conjunction:
diff --git a/content/features/table of contents.md b/content/features/table of contents.md
index ecc36fd..f058573 100644
--- a/content/features/table of contents.md	
+++ b/content/features/table of contents.md	
@@ -2,7 +2,7 @@
 title: "Table of Contents"
 tags:
   - component
-  - plugins/transformer
+  - plugin/transformer
 ---
 
 Quartz can automatically generate a table of contents from a list of headings on each page. It will also show you your current scroll position on the site by marking headings you've scrolled through with a different colour.
diff --git a/quartz.config.ts b/quartz.config.ts
index 447039d..dc9b7d5 100644
--- a/quartz.config.ts
+++ b/quartz.config.ts
@@ -9,7 +9,7 @@ const config: QuartzConfig = {
     analytics: {
       provider: "plausible",
     },
-    baseUrl: "quartz.jzhao.xyz",
+    baseUrl: "four.quartz.jzhao.xyz",
     ignorePatterns: ["private", "templates"],
     theme: {
       typography: {
diff --git a/quartz/components/pages/TagContent.tsx b/quartz/components/pages/TagContent.tsx
index 5300cce..05aaade 100644
--- a/quartz/components/pages/TagContent.tsx
+++ b/quartz/components/pages/TagContent.tsx
@@ -3,7 +3,7 @@ import { Fragment, jsx, jsxs } from "preact/jsx-runtime"
 import { toJsxRuntime } from "hast-util-to-jsx-runtime"
 import style from "../styles/listPage.scss"
 import { PageList } from "../PageList"
-import { ServerSlug, canonicalizeServer, getAllSegmentPrefixes } from "../../path"
+import { ServerSlug, canonicalizeServer, getAllSegmentPrefixes, joinSegments } from "../../path"
 import { QuartzPluginData } from "../../plugins/vfile"
 
 const numPages = 10
@@ -11,7 +11,7 @@ function TagContent(props: QuartzComponentProps) {
   const { tree, fileData, allFiles } = props
   const slug = fileData.slug
 
-  if (!slug?.startsWith("tags/")) {
+  if (!(slug?.startsWith("tags/") || slug === "tags")) {
     throw new Error(`Component "TagContent" tried to render a non-tag page: ${slug}`)
   }
 
@@ -44,7 +44,7 @@ function TagContent(props: QuartzComponentProps) {
             return (
               <div>
                 <h2>
-                  <a class="internal tag-link" href={`./tags/${tag}`}>
+                  <a class="internal tag-link" href={`./${joinSegments("tags", tag)}`}>
                     #{tag}
                   </a>
                 </h2>
diff --git a/quartz/plugins/emitters/assets.ts b/quartz/plugins/emitters/assets.ts
index 400c39d..0f7f3e4 100644
--- a/quartz/plugins/emitters/assets.ts
+++ b/quartz/plugins/emitters/assets.ts
@@ -24,7 +24,7 @@ export const Assets: QuartzEmitterPlugin = () => {
         const dir = path.dirname(dest) as FilePath
         await fs.promises.mkdir(dir, { recursive: true }) // ensure dir exists
         await fs.promises.copyFile(src, dest)
-        res.push(fp)
+        res.push(dest)
       }
 
       return res
diff --git a/quartz/plugins/emitters/static.ts b/quartz/plugins/emitters/static.ts
index 75bcc74..794cbac 100644
--- a/quartz/plugins/emitters/static.ts
+++ b/quartz/plugins/emitters/static.ts
@@ -12,6 +12,6 @@ export const Static: QuartzEmitterPlugin = () => ({
     const staticPath = joinSegments(QUARTZ, "static")
     const fps = await glob("**", staticPath, cfg.configuration.ignorePatterns)
     await fs.promises.cp(staticPath, joinSegments(argv.output, "static"), { recursive: true })
-    return fps.map((fp) => joinSegments("static", fp)) as FilePath[]
+    return fps.map((fp) => joinSegments(argv.output, "static", fp)) as FilePath[]
   },
 })
diff --git a/quartz/plugins/emitters/tagPage.tsx b/quartz/plugins/emitters/tagPage.tsx
index 19e2906..fd00d9c 100644
--- a/quartz/plugins/emitters/tagPage.tsx
+++ b/quartz/plugins/emitters/tagPage.tsx
@@ -49,7 +49,7 @@ export const TagPage: QuartzEmitterPlugin<FullPageLayout> = (userOpts) => {
           return [
             tag,
             defaultProcessedContent({
-              slug: joinSegments("tags", tag, "index") as ServerSlug,
+              slug: joinSegments("tags", tag) as ServerSlug,
               frontmatter: { title, tags: [] },
             }),
           ]
@@ -59,7 +59,7 @@ export const TagPage: QuartzEmitterPlugin<FullPageLayout> = (userOpts) => {
       for (const [tree, file] of content) {
         const slug = file.data.slug!
         if (slug.startsWith("tags/")) {
-          const tag = joinSegments(slug.slice("tags/".length), "index")
+          const tag = slug.slice("tags/".length)
           if (tags.has(tag)) {
             tagDescriptions[tag] = [tree, file]
           }