diff --git a/src/components/header.lisp b/src/components/header.lisp
index 9546095..ca08c9b 100644
--- a/src/components/header.lisp
+++ b/src/components/header.lisp
@@ -7,7 +7,7 @@
 
 (defparameter *nav-menu*
   '(("/about" "about")
-    ("/work" "work")
+    ("/works" "works")
     ("/blog" "blog")))
 
 (defcomp ~pc-header ()
diff --git a/src/lib/cms.lisp b/src/lib/cms.lisp
index 7f75c80..f374ad9 100644
--- a/src/lib/cms.lisp
+++ b/src/lib/cms.lisp
@@ -9,7 +9,7 @@
                 #:microcms-service-domain
                 #:microcms-api-key)
   (:export #:get-about
-           #:get-work
+           #:get-works
            #:get-blog-list
            #:get-blog-detail))
 (in-package #:website/lib/cms)
@@ -27,8 +27,8 @@
 (define-object-client about)
 (memorize get-about)
 
-(define-object-client work)
-(memorize get-work)
+(define-object-client works)
+(memorize get-works)
 
 (define-list-client blog)
 (memorize get-blog-list)
diff --git a/src/renderer.lisp b/src/renderer.lisp
index 7863e38..7891cdd 100644
--- a/src/renderer.lisp
+++ b/src/renderer.lisp
@@ -16,7 +16,9 @@
 
 (defmethod jingle:process-response :around ((app jingle:app) result)
   (when (eq (request-method *request*) :get)
-    (set-response-header :cache-control "public, max-age=60"))
+    (if (context :no-cache)
+        (set-response-header :cache-control "private, no-store, must-revalidate")
+        (set-response-header :cache-control "public, max-age=60")))
   (cond ((api-request-p)
          (set-response-header :content-type "application/json; charset=utf-8") 
          (call-next-method app (to-json result)))
diff --git a/src/routes/about.lisp b/src/routes/about.lisp
index 1fd330c..22c5241 100644
--- a/src/routes/about.lisp
+++ b/src/routes/about.lisp
@@ -17,13 +17,14 @@
 (defun handle-get (params)
   (setf (context :metadata) *metadata*)
   (with-request-params ((draft-key "draft-key" nil)) params
+    (setf (context :no-cache) draft-key)
     (let ((about (get-about :query (list :draft-key draft-key))))
       (hsx
        (<>
          (and draft-key (hsx (p :class "text-lg text-pink-500" "下書きモード")))
          (article :class "prose max-w-none"
            (h1 "About")
-           (div  :class "flex justify-center"
+           (div :class "flex justify-center"
              (figure :class "flex flex-col items-center"
                (img
                  :src (accesses about :avatar :url)
diff --git a/src/routes/api/revalidate.lisp b/src/routes/api/revalidate.lisp
index 7c0457e..03d4a4b 100644
--- a/src/routes/api/revalidate.lisp
+++ b/src/routes/api/revalidate.lisp
@@ -8,7 +8,8 @@
   (:import-from #:website/helper
                 #:get-request-body-plist)
   (:import-from #:website/lib/cms
-                #:get-about)
+                #:get-about
+                #:get-works)
   (:export #:handle-post))
 (in-package #:website/routes/api/revalidate)
 
@@ -20,5 +21,6 @@
     (return-from handle-post '(:|message| "Invalid token")))
   (let* ((body (get-request-body-plist))
          (api (getf body :|api|)))
-    (cond ((string= api "about") (clear-cache 'get-about)))
+    (cond ((string= api "about") (clear-cache 'get-about))
+          ((string= api "works") (clear-cache 'get-works)))
     '(:|message| "ok")))
diff --git a/src/routes/work.lisp b/src/routes/work.lisp
deleted file mode 100644
index c1e6cf4..0000000
--- a/src/routes/work.lisp
+++ /dev/null
@@ -1,19 +0,0 @@
-(defpackage #:website/routes/work
-  (:use #:cl
-        #:hsx
-        #:jingle)
-  (:import-from #:website/lib/cms
-                #:get-work)
-  (:import-from #:website/lib/time
-                #:datetime
-                #:jp-datetime)
-  (:export #:handle-get))
-(in-package #:website/routes/work)
-
-(defparameter *metadata*
-  (list :title "work"))
-
-(defun handle-get (params)
-  (declare (ignore params))
-  (setf (context :metadata) *metadata*)
-  (hsx (p "coming soon")))
diff --git a/src/routes/works.lisp b/src/routes/works.lisp
new file mode 100644
index 0000000..9110875
--- /dev/null
+++ b/src/routes/works.lisp
@@ -0,0 +1,31 @@
+(defpackage #:website/routes/works
+  (:use #:cl
+        #:hsx
+        #:jingle)
+  (:import-from #:website/lib/cms
+                #:get-works)
+  (:import-from #:website/lib/time
+                #:datetime
+                #:jp-datetime)
+  (:export #:handle-get))
+(in-package #:website/routes/works)
+
+(defparameter *metadata*
+  (list :title "works"))
+
+(defun handle-get (params)
+  (setf (context :metadata) *metadata*)
+  (with-request-params ((draft-key "draft-key" nil)) params
+    (setf (context :no-cache) draft-key)
+    (let ((works (get-works :query (list :draft-key draft-key))))
+      (hsx
+       (<>
+         (and draft-key (hsx (p :class "text-lg text-pink-500" "下書きモード")))
+         (article :class "prose max-w-none"
+           (h1 "Works")
+           (raw! (getf works :content))
+           (p :class "text-right"
+             "(最終更新:"
+             (|time| :datetime (datetime (getf works :revised-at))
+                     (jp-datetime (getf works :revised-at)))
+             ")")))))))