cici 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -0
- package/.next/app-build-manifest.json +122 -0
- package/.next/app-path-routes-manifest.json +1 -0
- package/.next/build-manifest.json +32 -0
- package/.next/export-marker.json +1 -0
- package/.next/images-manifest.json +1 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +1 -0
- package/.next/react-loadable-manifest.json +1886 -0
- package/.next/required-server-files.json +1 -0
- package/.next/routes-manifest.json +1 -0
- package/.next/server/app/_not-found/page.js +1 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/server/app/api/asset/[...path]/route.js +1 -0
- package/.next/server/app/api/asset/[...path]/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/[...nextauth]/route.js +1 -0
- package/.next/server/app/api/auth/[...nextauth]/route.js.nft.json +1 -0
- package/.next/server/app/api/blog/[id]/highlights/[hid]/comments/[cid]/reactions/route.js +1 -0
- package/.next/server/app/api/blog/[id]/highlights/[hid]/comments/[cid]/reactions/route.js.nft.json +1 -0
- package/.next/server/app/api/blog/[id]/highlights/[hid]/comments/[cid]/route.js +1 -0
- package/.next/server/app/api/blog/[id]/highlights/[hid]/comments/[cid]/route.js.nft.json +1 -0
- package/.next/server/app/api/blog/[id]/highlights/[hid]/replies/route.js +1 -0
- package/.next/server/app/api/blog/[id]/highlights/[hid]/replies/route.js.nft.json +1 -0
- package/.next/server/app/api/blog/[id]/highlights/[hid]/resolve/route.js +1 -0
- package/.next/server/app/api/blog/[id]/highlights/[hid]/resolve/route.js.nft.json +1 -0
- package/.next/server/app/api/blog/[id]/highlights/[hid]/route.js +1 -0
- package/.next/server/app/api/blog/[id]/highlights/[hid]/route.js.nft.json +1 -0
- package/.next/server/app/api/blog/[id]/highlights/route.js +1 -0
- package/.next/server/app/api/blog/[id]/highlights/route.js.nft.json +1 -0
- package/.next/server/app/api/graphql/route.js +140 -0
- package/.next/server/app/api/graphql/route.js.nft.json +1 -0
- package/.next/server/app/api/mile/prompts/route.js +230 -0
- package/.next/server/app/api/mile/prompts/route.js.nft.json +1 -0
- package/.next/server/app/api/mile/prompts.body +1 -0
- package/.next/server/app/api/mile/prompts.meta +1 -0
- package/.next/server/app/api/upload/route.js +1 -0
- package/.next/server/app/api/upload/route.js.nft.json +1 -0
- package/.next/server/app/api/webhooks/notification/route.js +1 -0
- package/.next/server/app/api/webhooks/notification/route.js.nft.json +1 -0
- package/.next/server/app/atom.xml/route.js +34 -0
- package/.next/server/app/atom.xml/route.js.nft.json +1 -0
- package/.next/server/app/atom.xml.body +15 -0
- package/.next/server/app/atom.xml.meta +1 -0
- package/.next/server/app/blog/[id]/page.js +30 -0
- package/.next/server/app/blog/[id]/page.js.nft.json +1 -0
- package/.next/server/app/blog/[id]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/blog/page.js +1 -0
- package/.next/server/app/blog/page.js.nft.json +1 -0
- package/.next/server/app/blog/page_client-reference-manifest.js +1 -0
- package/.next/server/app/editor/page.js +45 -0
- package/.next/server/app/editor/page.js.nft.json +1 -0
- package/.next/server/app/editor/page_client-reference-manifest.js +1 -0
- package/.next/server/app/favicon.ico/route.js +1 -0
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
- package/.next/server/app/favicon.ico.body +0 -0
- package/.next/server/app/favicon.ico.meta +1 -0
- package/.next/server/app/login/page.js +1 -0
- package/.next/server/app/login/page.js.nft.json +1 -0
- package/.next/server/app/login/page_client-reference-manifest.js +1 -0
- package/.next/server/app/memos/page.js +26 -0
- package/.next/server/app/memos/page.js.nft.json +1 -0
- package/.next/server/app/memos/page_client-reference-manifest.js +1 -0
- package/.next/server/app/page.js +1 -0
- package/.next/server/app/page.js.nft.json +1 -0
- package/.next/server/app/page_client-reference-manifest.js +1 -0
- package/.next/server/app/robots.txt/route.js +1 -0
- package/.next/server/app/robots.txt/route.js.nft.json +1 -0
- package/.next/server/app/robots.txt.body +8 -0
- package/.next/server/app/robots.txt.meta +1 -0
- package/.next/server/app/rss.xml/route.js +18 -0
- package/.next/server/app/rss.xml/route.js.nft.json +1 -0
- package/.next/server/app/rss.xml.body +12 -0
- package/.next/server/app/rss.xml.meta +1 -0
- package/.next/server/app/sitemap.xml/route.js +76 -0
- package/.next/server/app/sitemap.xml/route.js.nft.json +1 -0
- package/.next/server/app/sitemap.xml.body +33 -0
- package/.next/server/app/sitemap.xml.meta +1 -0
- package/.next/server/app/unavailable/page.js +1 -0
- package/.next/server/app/unavailable/page.js.nft.json +1 -0
- package/.next/server/app/unavailable/page_client-reference-manifest.js +1 -0
- package/.next/server/app-paths-manifest.json +27 -0
- package/.next/server/chunks/1230.js +1 -0
- package/.next/server/chunks/1446.js +1 -0
- package/.next/server/chunks/1450.js +1 -0
- package/.next/server/chunks/1536.js +1 -0
- package/.next/server/chunks/1615.js +1 -0
- package/.next/server/chunks/1682.js +6 -0
- package/.next/server/chunks/179.js +14 -0
- package/.next/server/chunks/2448.js +34 -0
- package/.next/server/chunks/2481.js +1 -0
- package/.next/server/chunks/2518.js +12 -0
- package/.next/server/chunks/2581.js +1 -0
- package/.next/server/chunks/2878.js +63 -0
- package/.next/server/chunks/3125.js +1 -0
- package/.next/server/chunks/330.js +1 -0
- package/.next/server/chunks/3381.js +1 -0
- package/.next/server/chunks/3464.js +1 -0
- package/.next/server/chunks/3573.js +1 -0
- package/.next/server/chunks/3607.js +14 -0
- package/.next/server/chunks/3844.js +1 -0
- package/.next/server/chunks/4536.js +1 -0
- package/.next/server/chunks/4742.js +1 -0
- package/.next/server/chunks/4857.js +1 -0
- package/.next/server/chunks/6621.js +1 -0
- package/.next/server/chunks/7070.js +12 -0
- package/.next/server/chunks/719.js +1 -0
- package/.next/server/chunks/7667.js +1 -0
- package/.next/server/chunks/7674.js +1 -0
- package/.next/server/chunks/7937.js +1 -0
- package/.next/server/chunks/7990.js +1 -0
- package/.next/server/chunks/8038.js +1 -0
- package/.next/server/chunks/8195.js +1 -0
- package/.next/server/chunks/8198.js +1 -0
- package/.next/server/chunks/8224.js +1 -0
- package/.next/server/chunks/8398.js +1 -0
- package/.next/server/chunks/8948.js +2 -0
- package/.next/server/chunks/9600.js +1 -0
- package/.next/server/chunks/9627.js +1 -0
- package/.next/server/chunks/9715.js +1 -0
- package/.next/server/chunks/9772.js +2 -0
- package/.next/server/chunks/font-manifest.json +1 -0
- package/.next/server/font-manifest.json +1 -0
- package/.next/server/functions-config-manifest.json +1 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -0
- package/.next/server/middleware-manifest.json +6 -0
- package/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +1 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages/_app.js +1 -0
- package/.next/server/pages/_app.js.nft.json +1 -0
- package/.next/server/pages/_document.js +1 -0
- package/.next/server/pages/_document.js.nft.json +1 -0
- package/.next/server/pages/_error.js +1 -0
- package/.next/server/pages/_error.js.nft.json +1 -0
- package/.next/server/pages-manifest.json +1 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +1 -0
- package/.next/server/webpack-runtime.js +1 -0
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +13 -13
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/asset/[...path]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/asset/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/comments/[cid]/reactions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/comments/[cid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/replies/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/resolve/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blog/[id]/highlights/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/graphql/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/mile/prompts.body +1 -1
- package/.next/standalone/.next/server/app/api/upload/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/atom.xml/route.js +3 -3
- package/.next/standalone/.next/server/app/atom.xml/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/atom.xml.body +1 -1677
- package/.next/standalone/.next/server/app/blog/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/blog/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/blog/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/blog/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/editor/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/editor/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/memos/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/memos/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/robots.txt/route.js +1 -1
- package/.next/standalone/.next/server/app/rss.xml/route.js +2 -2
- package/.next/standalone/.next/server/app/rss.xml/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/rss.xml.body +1 -227
- package/.next/standalone/.next/server/app/sitemap.xml/route.js +5 -5
- package/.next/standalone/.next/server/app/sitemap.xml.body +5 -101
- package/.next/standalone/.next/server/app/unavailable/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +6 -6
- package/.next/standalone/.next/server/chunks/3464.js +1 -1
- package/.next/standalone/.next/server/chunks/3607.js +1 -1
- package/.next/standalone/.next/server/chunks/719.js +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/package.json +6 -5
- package/.next/standalone/sample-content/blog/hello-cici.md +25 -0
- package/.next/standalone/sample-content/likes.json +1 -0
- package/.next/standalone/sample-content/memos.json +7 -0
- package/.next/standalone/sample-content/site-config.json +18 -0
- package/.next/static/PDn4f_-4CIbfG8EmueowG/_buildManifest.js +1 -0
- package/.next/static/PDn4f_-4CIbfG8EmueowG/_ssgManifest.js +1 -0
- package/.next/static/chunks/0e5ce63c-dc8fe6cd5df6dc6f.js +1 -0
- package/.next/static/chunks/0e762574-561b753e40bf5566.js +1 -0
- package/.next/static/chunks/117-70c87e31cd233c14.js +2 -0
- package/.next/static/chunks/152-16409649f7f42f9f.js +1 -0
- package/.next/static/chunks/153-f9c1aae3150e3029.js +1 -0
- package/.next/static/chunks/164-27f8b4187a29c395.js +1 -0
- package/.next/static/chunks/306-8d9c9a07b04a69f4.js +1 -0
- package/.next/static/chunks/343-ef3404804cc77cf3.js +1 -0
- package/.next/static/chunks/37-4aae6f4051a21b05.js +1 -0
- package/.next/static/chunks/479ba886-f76cebda33235b4d.js +1 -0
- package/.next/static/chunks/586-51f7e768b82803f6.js +1 -0
- package/.next/static/chunks/654-13e1845df8edb304.js +1 -0
- package/.next/static/chunks/767-2ec5d3ea9fe43cfa.js +1 -0
- package/.next/static/chunks/789-9810818d7be29598.js +1 -0
- package/.next/static/chunks/795d4814-090707ad3f792458.js +1 -0
- package/.next/static/chunks/878-b71984a1ef1b61e8.js +1 -0
- package/.next/static/chunks/8e1d74a4-f0365ca0a1823520.js +1 -0
- package/.next/static/chunks/961-29616c8a08e9f439.js +1 -0
- package/.next/static/chunks/972-774fbff93f73f32d.js +1 -0
- package/.next/static/chunks/app/_not-found/page-3061d7e79b77cf51.js +1 -0
- package/.next/static/chunks/app/blog/[id]/page-1fc779790ce384a8.js +1 -0
- package/.next/static/chunks/app/blog/page-096c29c6f69ebc33.js +1 -0
- package/.next/static/chunks/app/editor/page-f387899e39bc5e66.js +1 -0
- package/.next/static/chunks/app/layout-3439dc235234d73d.js +1 -0
- package/.next/static/chunks/app/login/page-6b91892f0e29c5e9.js +1 -0
- package/.next/static/chunks/app/memos/page-1b33cb7e1f301ba0.js +1 -0
- package/.next/static/chunks/app/page-f7dabeade6df80fd.js +1 -0
- package/.next/static/chunks/app/unavailable/page-c7774081778f08fc.js +1 -0
- package/.next/static/chunks/c916193b-16ee67ea0eb0c9df.js +1 -0
- package/.next/static/chunks/d3ac728e-709e52b22b85fd0a.js +1 -0
- package/.next/static/chunks/ee560e2c-0aeb447bc68f09f5.js +1 -0
- package/.next/static/chunks/fd9d1056-a4afdface6e53879.js +1 -0
- package/.next/static/chunks/framework-00a8ba1a63cfdc9e.js +1 -0
- package/.next/static/chunks/main-530e55a5659ae7e4.js +1 -0
- package/.next/static/chunks/main-app-838433dc18720d83.js +1 -0
- package/.next/static/chunks/pages/_app-15e2daefa259f0b5.js +1 -0
- package/.next/static/chunks/pages/_error-28b803cb2479b966.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-a3d722a538b58757.js +1 -0
- package/.next/static/css/3864b451a61e4546.css +1 -0
- package/.next/static/css/67e4cfd62ab3f75c.css +1 -0
- package/.next/static/css/bf9d0ede562bd061.css +3 -0
- package/.next/static/media/04b170fa1114a606-s.woff2 +0 -0
- package/.next/static/media/08e5276c49c9ea3c-s.woff2 +0 -0
- package/.next/static/media/095b3ef40b322df1-s.woff2 +0 -0
- package/.next/static/media/0d843c40cdb24da5-s.woff2 +0 -0
- package/.next/static/media/16198ffb9c9fdd71-s.woff2 +0 -0
- package/.next/static/media/185e1e5dfa43e25f-s.woff2 +0 -0
- package/.next/static/media/1cfb11966f8bf838-s.woff2 +0 -0
- package/.next/static/media/1f4ef3a7563c157c-s.woff2 +0 -0
- package/.next/static/media/207ad64b019bcdef-s.woff2 +0 -0
- package/.next/static/media/21f0145a081cb2c8-s.woff2 +0 -0
- package/.next/static/media/25169183b7610496-s.woff2 +0 -0
- package/.next/static/media/2c913da5dc1da2ce-s.woff2 +0 -0
- package/.next/static/media/2d7ca78015d280d1-s.woff2 +0 -0
- package/.next/static/media/32be0b7a9127e345-s.woff2 +0 -0
- package/.next/static/media/33a4c9c744d0f9cd-s.woff2 +0 -0
- package/.next/static/media/3579da1a17de9863-s.woff2 +0 -0
- package/.next/static/media/36524af73d313f3b-s.woff2 +0 -0
- package/.next/static/media/3683934951fcdfff-s.woff2 +0 -0
- package/.next/static/media/3a3a2937d60ce37f-s.woff2 +0 -0
- package/.next/static/media/3e2c1db9f0de322f-s.woff2 +0 -0
- package/.next/static/media/3f282b8fe3ef7004-s.woff2 +0 -0
- package/.next/static/media/4294bde93a0ebb03-s.woff2 +0 -0
- package/.next/static/media/4cb92749e68500bf-s.woff2 +0 -0
- package/.next/static/media/4d3ec3b19c6bf06c-s.woff2 +0 -0
- package/.next/static/media/4eaaaae34a570973-s.woff2 +0 -0
- package/.next/static/media/4f45b9473df2758b-s.woff2 +0 -0
- package/.next/static/media/59769944ee073575-s.woff2 +0 -0
- package/.next/static/media/5bca2cb7d28055ae-s.woff2 +0 -0
- package/.next/static/media/5d217fec32e2068e-s.woff2 +0 -0
- package/.next/static/media/5f46c2de3a30070d-s.woff2 +0 -0
- package/.next/static/media/651d2e07f2cec067-s.woff2 +0 -0
- package/.next/static/media/684008be259a59c6-s.woff2 +0 -0
- package/.next/static/media/6858bbe75ab53fba-s.woff2 +0 -0
- package/.next/static/media/6cbcf0df7f219406-s.woff2 +0 -0
- package/.next/static/media/6d92d05365182413-s.woff2 +0 -0
- package/.next/static/media/7470b994d8569922-s.woff2 +0 -0
- package/.next/static/media/74e7e1e3fdad08dd-s.woff2 +0 -0
- package/.next/static/media/77901e7a9559d10c-s.woff2 +0 -0
- package/.next/static/media/796fab757a0e6146-s.woff2 +0 -0
- package/.next/static/media/7a830ebca9fe9db7-s.woff2 +0 -0
- package/.next/static/media/7bef3958b14cb6e3-s.woff2 +0 -0
- package/.next/static/media/81eb003b78a42a7b-s.woff2 +0 -0
- package/.next/static/media/84057adca98c0827-s.woff2 +0 -0
- package/.next/static/media/84a87fc9f232641e-s.woff2 +0 -0
- package/.next/static/media/84efce35a48f395c-s.woff2 +0 -0
- package/.next/static/media/872bfc82854f88b2-s.woff2 +0 -0
- package/.next/static/media/878380e8db69cb31-s.woff2 +0 -0
- package/.next/static/media/89c333b5a8239870-s.woff2 +0 -0
- package/.next/static/media/8a2e82a5f6677757-s.woff2 +0 -0
- package/.next/static/media/8cb8df5532e281af-s.woff2 +0 -0
- package/.next/static/media/8efbe4984052b206-s.woff2 +0 -0
- package/.next/static/media/8f2ab7576a12de97-s.woff2 +0 -0
- package/.next/static/media/905b23b26fa2645b-s.woff2 +0 -0
- package/.next/static/media/91fb5c9b9b43e9ec-s.woff2 +0 -0
- package/.next/static/media/92079ce87aa6c00d-s.woff2 +0 -0
- package/.next/static/media/9d87bcf0c05a83d6-s.p.woff2 +0 -0
- package/.next/static/media/9e9c82ad03b7dfa5-s.woff2 +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.1608a09b.woff +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.4aafdb68.ttf +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.a79f1c31.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.b6770918.woff +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.cce5b8ec.ttf +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.ec17d132.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.07ef19e7.ttf +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.55fac258.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.dad44a7f.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.9f256b85.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.b18f59e1.ttf +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.d42a5579.woff2 +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.7c187121.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.d3c882a6.woff2 +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.ed38e79f.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Bold.b74a1a8b.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Bold.c3fb5ac2.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Bold.d181c465.woff +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.6f2bb1df.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.70d8b0a5.ttf +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.e3f82f9d.woff +0 -0
- package/.next/static/media/KaTeX_Main-Italic.47373d1e.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Italic.8916142b.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Italic.9024d815.woff +0 -0
- package/.next/static/media/KaTeX_Main-Regular.0462f03b.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Regular.7f51fe03.woff +0 -0
- package/.next/static/media/KaTeX_Main-Regular.b7f8fe9b.ttf +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.572d331f.woff2 +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.a879cf83.ttf +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.f1035d8d.woff +0 -0
- package/.next/static/media/KaTeX_Math-Italic.5295ba48.woff +0 -0
- package/.next/static/media/KaTeX_Math-Italic.939bc644.ttf +0 -0
- package/.next/static/media/KaTeX_Math-Italic.f28c23ac.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.8c5b5494.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.94e1e8dc.ttf +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.bf59d231.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.3b1e59b3.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.7c9bc82b.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.b4c20c84.ttf +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.74048478.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.ba21ed5f.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.d4d7ba48.ttf +0 -0
- package/.next/static/media/KaTeX_Script-Regular.03e9641d.woff2 +0 -0
- package/.next/static/media/KaTeX_Script-Regular.07505710.woff +0 -0
- package/.next/static/media/KaTeX_Script-Regular.fe9cbbe1.ttf +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.e1e279cb.woff +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.eae34984.woff2 +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.fabc004a.ttf +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.57727022.woff +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.5916a24f.woff2 +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.d6b476ec.ttf +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.9acaf01c.woff +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.a144ef58.ttf +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.b4230e7e.woff2 +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.10d95fd3.woff2 +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.7a996c9d.woff +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.fbccdabe.ttf +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.6258592b.woff +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.a8709e36.woff2 +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.d97aaf4a.ttf +0 -0
- package/.next/static/media/a0c7b168290800ea-s.woff2 +0 -0
- package/.next/static/media/a211c214b387705f-s.woff2 +0 -0
- package/.next/static/media/a515f80c15233dd2-s.woff2 +0 -0
- package/.next/static/media/a59cf4e3704a8bf9-s.woff2 +0 -0
- package/.next/static/media/a7107da688a6a6c4-s.woff2 +0 -0
- package/.next/static/media/b0785a8aafa8fb40-s.woff2 +0 -0
- package/.next/static/media/b3afeb402d0641d1-s.woff2 +0 -0
- package/.next/static/media/b3d4f23ea9869e41-s.woff2 +0 -0
- package/.next/static/media/b88b6f09060fd402-s.woff2 +0 -0
- package/.next/static/media/b9bde58fd979694e-s.woff2 +0 -0
- package/.next/static/media/bdb722ed5812b325-s.woff2 +0 -0
- package/.next/static/media/c24e4778556eba42-s.woff2 +0 -0
- package/.next/static/media/c3040269b1771b02-s.woff2 +0 -0
- package/.next/static/media/c4123b44ca624496-s.woff2 +0 -0
- package/.next/static/media/ccadbccc98acfb1c-s.woff2 +0 -0
- package/.next/static/media/d04351f5bc3644ea-s.woff2 +0 -0
- package/.next/static/media/d1778a980b3fad78-s.woff2 +0 -0
- package/.next/static/media/d416562cb7cba055-s.woff2 +0 -0
- package/.next/static/media/d872fd07230782c0-s.woff2 +0 -0
- package/.next/static/media/db3791bbb1ae5747-s.woff2 +0 -0
- package/.next/static/media/dd090f323c5887c3-s.woff2 +0 -0
- package/.next/static/media/dd1fcf6432702b11-s.woff2 +0 -0
- package/.next/static/media/e45abf9e3abcfe63-s.woff2 +0 -0
- package/.next/static/media/e6e70594dba816d3-s.woff2 +0 -0
- package/.next/static/media/e8a6cb3b0c8c1d41-s.woff2 +0 -0
- package/.next/static/media/e8fdc46fb8ed5f75-s.woff2 +0 -0
- package/.next/static/media/ed7a78808c74aaab-s.woff2 +0 -0
- package/.next/static/media/ef9a93445fe49953-s.woff2 +0 -0
- package/.next/static/media/f00fd2cfeda7750f-s.woff2 +0 -0
- package/.next/static/media/f0863c4be7cb812e-s.woff2 +0 -0
- package/.next/static/media/f2fb250c4baa1fea-s.woff2 +0 -0
- package/.next/static/media/f392a13a0094c3d1-s.woff2 +0 -0
- package/.next/static/media/f42f4d2ecc3cba08-s.woff2 +0 -0
- package/.next/static/media/f8f98f7e33dde58b-s.woff2 +0 -0
- package/.next/static/media/fba9d66c2358f8e6-s.woff2 +0 -0
- package/.next/static/media/fc8b52876cd8aa42-s.woff2 +0 -0
- package/.next/static/media/fcc5ccbd071c5f3e-s.woff2 +0 -0
- package/.next/static/media/fe9908567bfd9cbf-s.woff2 +0 -0
- package/.next/trace +120 -0
- package/.next/types/app/api/asset/[...path]/route.ts +343 -0
- package/.next/types/app/api/auth/[...nextauth]/route.ts +343 -0
- package/.next/types/app/api/blog/[id]/highlights/[hid]/comments/[cid]/reactions/route.ts +343 -0
- package/.next/types/app/api/blog/[id]/highlights/[hid]/comments/[cid]/route.ts +343 -0
- package/.next/types/app/api/blog/[id]/highlights/[hid]/replies/route.ts +343 -0
- package/.next/types/app/api/blog/[id]/highlights/[hid]/resolve/route.ts +343 -0
- package/.next/types/app/api/blog/[id]/highlights/[hid]/route.ts +343 -0
- package/.next/types/app/api/blog/[id]/highlights/route.ts +343 -0
- package/.next/types/app/api/graphql/route.ts +343 -0
- package/.next/types/app/api/mile/prompts/route.ts +343 -0
- package/.next/types/app/api/upload/route.ts +343 -0
- package/.next/types/app/api/webhooks/notification/route.ts +343 -0
- package/.next/types/app/atom.xml/route.ts +343 -0
- package/.next/types/app/blog/[id]/page.ts +79 -0
- package/.next/types/app/blog/page.ts +79 -0
- package/.next/types/app/editor/page.ts +79 -0
- package/.next/types/app/login/page.ts +79 -0
- package/.next/types/app/memos/page.ts +79 -0
- package/.next/types/app/page.ts +79 -0
- package/.next/types/app/rss.xml/route.ts +343 -0
- package/.next/types/app/unavailable/page.ts +79 -0
- package/.next/types/package.json +1 -0
- package/README.md +17 -1
- package/bin/cici.js +128 -23
- package/package.json +6 -5
- package/public/Tinymind-banner.png +0 -0
- package/public/Tinymind.dmg +0 -0
- package/public/icon-144.jpg +0 -0
- package/public/icon.jpg +0 -0
- package/public/manifest.json +25 -0
- package/public/presentations/coordinated-access-control-with-policy/index.html +1593 -0
- package/public/tinymind.icns +0 -0
- package/.next/standalone/data/assets/1727016079577.jpg +0 -0
- package/.next/standalone/data/assets/images/2024-12-03/1733256504772.jpg +0 -0
- package/.next/standalone/data/assets/images/2024-12-12/.gitkeep +0 -0
- package/.next/standalone/data/assets/images/2024-12-12/1734033798997.png +0 -0
- package/.next/standalone/data/assets/images/2024-12-21/.gitkeep +0 -0
- package/.next/standalone/data/assets/images/2024-12-21/1734785902890.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/.gitkeep +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734990512413.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734991833894.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993188114.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993280313.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993317984.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993411252.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993425042.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993480342.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993562660.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993625024.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993677103.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993893285.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734993996131.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734994035144.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734994064317.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734994128679.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734994189257.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734994521799.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-23/1734994530669.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-24/.gitkeep +0 -0
- package/.next/standalone/data/assets/images/2024-12-24/1735032434591.jpeg +0 -0
- package/.next/standalone/data/assets/images/2024-12-24/1735068363518.jpeg +0 -0
- package/.next/standalone/data/assets/images/Cofe-app.png +0 -0
- package/.next/standalone/data/blog/.gitkeep +0 -0
- package/.next/standalone/data/blog/2017-summary.md +0 -59
- package/.next/standalone/data/blog/a-complex-web-app-refactor.md +0 -72
- package/.next/standalone/data/blog/a-day-of-remote-worker.md +0 -82
- package/.next/standalone/data/blog/async-action-in-redux.md +0 -257
- package/.next/standalone/data/blog/cofe.md +0 -398
- package/.next/standalone/data/blog/expensee-shortcut-numbers-guide.md +0 -99
- package/.next/standalone/data/blog/first-golang-project-fx.md +0 -113
- package/.next/standalone/data/blog/work-going-index.md +0 -49
- package/.next/standalone/data/blog//344/270/212/346/265/267/345/210/260/351/230/277/345/247/206/346/226/257/347/211/271/344/270/271.md +0 -114
- package/.next/standalone/data/blog//344/272/214/346/234/210/350/221/241/350/220/204/347/211/231/346/270/270/350/256/260.md +0 -107
- package/.next/standalone/data/blog//345/215/216/344/270/272/351/270/277/350/222/231-harmaryos-next-/347/272/277/344/270/213/346/264/273/345/212/250/345/260/217/350/256/260.md +0 -180
- package/.next/standalone/data/blog//345/233/233/346/234/210/347/232/204/345/260/276/345/267/264/351/200/233/345/276/267/345/233/275-/346/237/217/346/236/227.md +0 -76
- package/.next/standalone/data/blog//345/234/250/344/274/246/346/225/246-shoreditch-/345/221/206/344/270/211/345/244/251.md +0 -40
- package/.next/standalone/data/blog//346/204/217/345/244/247/345/210/251/347/275/227/351/251/254/345/244/217/345/244/251/345/233/233/346/227/245/346/270/270.md +0 -59
- package/.next/standalone/data/blog//346/210/221/345/201/232/344/272/206/344/270/200/346/254/276/346/227/205/350/241/214/350/256/260/345/275/225/345/272/224/347/224/250/357/274/232mile.md +0 -40
- package/.next/standalone/data/blog//350/245/277/347/217/255/347/211/231/344/270/203/345/244/251/347/232/204/346/227/205/350/241/214.md +0 -128
- package/.next/standalone/data/blog//351/200/233/351/200/233/346/265/216/345/267/236/345/262/233.md +0 -78
- package/.next/standalone/data/blog-manifest.json +0 -21
- package/.next/standalone/data/highlights/expensee-shortcut-numbers-guide.json +0 -77
- package/.next/standalone/data/likes.json +0 -56
- package/.next/standalone/data/memos.json +0 -1255
- package/.next/standalone/data/site-config.json +0 -22
- /package/.next/standalone/.next/static/{ACh2hmfOOZR7INKDQAX5I → PDn4f_-4CIbfG8EmueowG}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{ACh2hmfOOZR7INKDQAX5I → PDn4f_-4CIbfG8EmueowG}/_ssgManifest.js +0 -0
- /package/.next/standalone/{data → sample-content/assets}/.gitkeep +0 -0
- /package/.next/standalone/{data/assets/images/2024-12-03 → sample-content/highlights}/.gitkeep +0 -0
|
@@ -1,398 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: The Complete Cofe Guide
|
|
3
|
-
date: 2025-10-06T10:30:00.000Z
|
|
4
|
-
status: draft
|
|
5
|
-
latitude: 37.78297388090404
|
|
6
|
-
longitude: -122.41031261300729
|
|
7
|
-
city: San Francisco
|
|
8
|
-
street: Market Street
|
|
9
|
-
external_discussions:
|
|
10
|
-
- platform: hackernews
|
|
11
|
-
url: https://news.ycombinator.com/item?id=example
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
[**Cofe**](https://github.com/metrue/cofe) is blog and memo taking app, which fully powered by Github API, and your blog posts and memos are all stored in your own repo, and all the writings are in version control.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
**Everything you need to know about setting up, customizing, and mastering Cofe.**
|
|
21
|
-
|
|
22
|
-
Cofe is a beautifully simple blog and memo app that stores everything in your GitHub repository. No databases, no complex setups - just write and publish.
|
|
23
|
-
|
|
24
|
-
> **Live Example**: See Cofe in action at [blog.minghe.me](https://blog.minghe.me) - a real blog powered by Cofe.
|
|
25
|
-
|
|
26
|
-
## Quick Start
|
|
27
|
-
|
|
28
|
-
### 1. GitHub OAuth Setup
|
|
29
|
-
|
|
30
|
-
First, create a GitHub OAuth App:
|
|
31
|
-
|
|
32
|
-
1. Go to [GitHub Settings > Developer Settings > OAuth Apps](https://github.com/settings/developers)
|
|
33
|
-
2. Click "New OAuth App"
|
|
34
|
-
3. Fill in the details:
|
|
35
|
-
- **Application name**: `Cofe Blog`
|
|
36
|
-
- **Homepage URL**: `http://localhost:3000` (for development)
|
|
37
|
-
- **Authorization callback URL**: `http://localhost:3000/api/auth/callback/github`
|
|
38
|
-
4. Save your **Client ID** and **Client Secret**
|
|
39
|
-
|
|
40
|
-
### 2. Environment Setup
|
|
41
|
-
|
|
42
|
-
Clone the repository and install dependencies:
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
git clone https://github.com/metrue/Cofe.git
|
|
46
|
-
cd Cofe
|
|
47
|
-
npm install
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
Create your environment variables:
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
# Required for GitHub integration
|
|
54
|
-
export GITHUB_USERNAME='your-github-username'
|
|
55
|
-
export GITHUB_ID='your-github-oauth-client-id'
|
|
56
|
-
export GITHUB_SECRET='your-github-oauth-client-secret'
|
|
57
|
-
|
|
58
|
-
# Required for authentication
|
|
59
|
-
export NEXTAUTH_SECRET='your-random-secret-string'
|
|
60
|
-
export NEXTAUTH_URL='http://localhost:3000'
|
|
61
|
-
|
|
62
|
-
# Optional: Analytics (see Analytics section)
|
|
63
|
-
export NEXT_PUBLIC_ANALYTICS_ENABLED=false
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### 3. Start Writing
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
npm run dev
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
Visit `http://localhost:3000`, sign in with GitHub, and start creating!
|
|
73
|
-
|
|
74
|
-
## Core Features
|
|
75
|
-
|
|
76
|
-
### Blog Posts
|
|
77
|
-
|
|
78
|
-
Rich blog posts with full markdown support:
|
|
79
|
-
|
|
80
|
-
- **Markdown**: Standard and extended syntax
|
|
81
|
-
- **Code Highlighting**: Syntax highlighting for 100+ languages
|
|
82
|
-
- **Math**: LaTeX equations with KaTeX
|
|
83
|
-
- **Images**: Drag & drop or paste images
|
|
84
|
-
- **Location**: Automatic location tagging
|
|
85
|
-
- **Discussions**: Link external discussions from HN, Reddit, V2EX
|
|
86
|
-
|
|
87
|
-
### Quick Memos
|
|
88
|
-
|
|
89
|
-
Capture thoughts instantly:
|
|
90
|
-
|
|
91
|
-
- **Fast Entry**: One-click memo creation
|
|
92
|
-
- **Location Tracking**: Automatic location capture
|
|
93
|
-
- **Like System**: Engage with your content
|
|
94
|
-
- **Masonry Layout**: Beautiful responsive grid
|
|
95
|
-
|
|
96
|
-
### External Discussions
|
|
97
|
-
|
|
98
|
-
Connect your posts to external conversations:
|
|
99
|
-
|
|
100
|
-
```yaml
|
|
101
|
-
external_discussions:
|
|
102
|
-
- platform: hackernews
|
|
103
|
-
url: https://news.ycombinator.com/item?id=123456
|
|
104
|
-
- platform: reddit
|
|
105
|
-
url: https://reddit.com/r/programming/comments/xyz/
|
|
106
|
-
- platform: v2ex
|
|
107
|
-
url: https://v2ex.com/t/123456
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
Cofe automatically fetches and displays comment counts and links.
|
|
111
|
-
|
|
112
|
-
## Advanced Configuration
|
|
113
|
-
|
|
114
|
-
### Analytics Setup
|
|
115
|
-
|
|
116
|
-
Enable privacy-first analytics with Umami:
|
|
117
|
-
|
|
118
|
-
1. **Get Umami**: Sign up at [cloud.umami.is](https://cloud.umami.is) or [self-host](https://umami.is/docs)
|
|
119
|
-
2. **Create Website**: Add your domain and get the Website ID
|
|
120
|
-
3. **Configure Environment**:
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
export NEXT_PUBLIC_ANALYTICS_ENABLED=true
|
|
124
|
-
export NEXT_PUBLIC_UMAMI_WEBSITE_ID=your-website-id
|
|
125
|
-
|
|
126
|
-
# Optional: Custom Umami instance
|
|
127
|
-
export NEXT_PUBLIC_UMAMI_SCRIPT_URL=https://your-umami.com/script.js
|
|
128
|
-
|
|
129
|
-
# Optional: Domain restrictions
|
|
130
|
-
export NEXT_PUBLIC_UMAMI_DOMAINS=yourdomain.com,www.yourdomain.com
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### Site Configuration
|
|
134
|
-
|
|
135
|
-
Customize your site in `lib/siteConfig.ts`:
|
|
136
|
-
|
|
137
|
-
```typescript
|
|
138
|
-
export const getSiteConfig = () => ({
|
|
139
|
-
title: 'Your Blog Name',
|
|
140
|
-
description: 'Your blog description',
|
|
141
|
-
author: {
|
|
142
|
-
name: 'Your Name',
|
|
143
|
-
email: 'your@email.com'
|
|
144
|
-
},
|
|
145
|
-
social: {
|
|
146
|
-
twitter: 'yourusername',
|
|
147
|
-
github: 'yourusername'
|
|
148
|
-
},
|
|
149
|
-
keywords: ['blog', 'tech', 'programming']
|
|
150
|
-
})
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### Custom Styling
|
|
154
|
-
|
|
155
|
-
Cofe uses Tailwind CSS. Customize styles in:
|
|
156
|
-
|
|
157
|
-
- `app/globals.css` - Global styles
|
|
158
|
-
- `tailwind.config.js` - Tailwind configuration
|
|
159
|
-
- Individual components for specific customizations
|
|
160
|
-
|
|
161
|
-
## Content Management
|
|
162
|
-
|
|
163
|
-
### File Structure
|
|
164
|
-
|
|
165
|
-
Cofe stores content in your GitHub repository:
|
|
166
|
-
|
|
167
|
-
```
|
|
168
|
-
data/
|
|
169
|
-
├── blog/ # Blog posts (.md files)
|
|
170
|
-
├── memos.json # All memos
|
|
171
|
-
├── links.json # External links
|
|
172
|
-
└── likes.json # Like data
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
### Blog Post Format
|
|
176
|
-
|
|
177
|
-
Blog posts use frontmatter:
|
|
178
|
-
|
|
179
|
-
```yaml
|
|
180
|
-
---
|
|
181
|
-
title: Your Post Title
|
|
182
|
-
date: 2025-10-06T10:30:00.000Z
|
|
183
|
-
latitude: 37.7749
|
|
184
|
-
longitude: -122.4194
|
|
185
|
-
city: San Francisco
|
|
186
|
-
street: Market Street
|
|
187
|
-
external_discussions:
|
|
188
|
-
- platform: hackernews
|
|
189
|
-
url: https://news.ycombinator.com/item?id=123
|
|
190
|
-
---
|
|
191
|
-
|
|
192
|
-
Your markdown content here...
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
### Memo Format
|
|
196
|
-
|
|
197
|
-
Memos are stored as JSON objects:
|
|
198
|
-
|
|
199
|
-
```json
|
|
200
|
-
{
|
|
201
|
-
"id": "1728123456789",
|
|
202
|
-
"content": "Your memo content with **markdown**",
|
|
203
|
-
"timestamp": "2025-10-06T10:30:00.000Z",
|
|
204
|
-
"latitude": 37.7749,
|
|
205
|
-
"longitude": -122.4194,
|
|
206
|
-
"city": "San Francisco",
|
|
207
|
-
"street": "Market Street"
|
|
208
|
-
}
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
## Deployment
|
|
212
|
-
|
|
213
|
-
### Vercel (Recommended)
|
|
214
|
-
|
|
215
|
-
1. **Deploy**: Click the deploy button or connect your GitHub repo
|
|
216
|
-
2. **Environment Variables**: Add all your environment variables
|
|
217
|
-
3. **Domain**: Configure your custom domain
|
|
218
|
-
4. **SSL**: Automatic HTTPS setup
|
|
219
|
-
|
|
220
|
-
### Other Platforms
|
|
221
|
-
|
|
222
|
-
Cofe works on any platform that supports Next.js:
|
|
223
|
-
|
|
224
|
-
- **Netlify**: Use the Next.js plugin
|
|
225
|
-
- **Railway**: Direct deployment support
|
|
226
|
-
- **DigitalOcean App Platform**: Node.js app
|
|
227
|
-
- **Self-hosted**: Docker or Node.js server
|
|
228
|
-
|
|
229
|
-
## API Reference
|
|
230
|
-
|
|
231
|
-
### GraphQL Endpoints
|
|
232
|
-
|
|
233
|
-
Cofe provides a GraphQL API at `/api/graphql`:
|
|
234
|
-
|
|
235
|
-
#### Queries
|
|
236
|
-
|
|
237
|
-
```graphql
|
|
238
|
-
# Get all blog posts
|
|
239
|
-
query {
|
|
240
|
-
blogPosts {
|
|
241
|
-
id
|
|
242
|
-
title
|
|
243
|
-
content
|
|
244
|
-
date
|
|
245
|
-
city
|
|
246
|
-
street
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
# Get specific blog post
|
|
251
|
-
query {
|
|
252
|
-
blogPost(id: "post-id") {
|
|
253
|
-
id
|
|
254
|
-
title
|
|
255
|
-
content
|
|
256
|
-
discussions {
|
|
257
|
-
platform
|
|
258
|
-
url
|
|
259
|
-
count
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
# Get all memos
|
|
265
|
-
query {
|
|
266
|
-
memos {
|
|
267
|
-
id
|
|
268
|
-
content
|
|
269
|
-
timestamp
|
|
270
|
-
city
|
|
271
|
-
street
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
# Get like information
|
|
276
|
-
query {
|
|
277
|
-
getLikes(itemType: "blog", id: "post-id") {
|
|
278
|
-
count
|
|
279
|
-
countries
|
|
280
|
-
userLiked
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
#### Mutations
|
|
286
|
-
|
|
287
|
-
```graphql
|
|
288
|
-
# Create blog post
|
|
289
|
-
mutation {
|
|
290
|
-
createBlogPost(input: {
|
|
291
|
-
title: "New Post"
|
|
292
|
-
content: "Content here..."
|
|
293
|
-
latitude: 37.7749
|
|
294
|
-
longitude: -122.4194
|
|
295
|
-
city: "San Francisco"
|
|
296
|
-
street: "Market Street"
|
|
297
|
-
}) {
|
|
298
|
-
id
|
|
299
|
-
title
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
# Create memo
|
|
304
|
-
mutation {
|
|
305
|
-
createMemo(input: {
|
|
306
|
-
content: "Quick thought..."
|
|
307
|
-
latitude: 37.7749
|
|
308
|
-
longitude: -122.4194
|
|
309
|
-
city: "San Francisco"
|
|
310
|
-
}) {
|
|
311
|
-
id
|
|
312
|
-
content
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
# Toggle like
|
|
317
|
-
mutation {
|
|
318
|
-
toggleLike(itemType: "blog", id: "post-id") {
|
|
319
|
-
liked
|
|
320
|
-
count
|
|
321
|
-
countries
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
## Troubleshooting
|
|
327
|
-
|
|
328
|
-
### Common Issues
|
|
329
|
-
|
|
330
|
-
**Authentication not working?**
|
|
331
|
-
- Check your GitHub OAuth callback URL
|
|
332
|
-
- Verify NEXTAUTH_SECRET is set
|
|
333
|
-
- Ensure NEXTAUTH_URL matches your domain
|
|
334
|
-
|
|
335
|
-
**Images not loading?**
|
|
336
|
-
- Verify GitHub token has repo access
|
|
337
|
-
- Check image URLs are publicly accessible
|
|
338
|
-
- Ensure proper file permissions
|
|
339
|
-
|
|
340
|
-
**Build failures?**
|
|
341
|
-
- Run `npm run lint` and fix any issues
|
|
342
|
-
- Check `npx tsc --noEmit` for TypeScript errors
|
|
343
|
-
- Verify all environment variables are set
|
|
344
|
-
|
|
345
|
-
**Location not working?**
|
|
346
|
-
- Enable location permissions in browser
|
|
347
|
-
- Check HTTPS requirement for geolocation
|
|
348
|
-
- Verify network connectivity for reverse geocoding
|
|
349
|
-
|
|
350
|
-
### Getting Help
|
|
351
|
-
|
|
352
|
-
1. **Check Issues**: [GitHub Issues](https://github.com/metrue/Cofe/issues)
|
|
353
|
-
2. **Discussions**: Use the external discussions feature
|
|
354
|
-
3. **Contributing**: See [AGENTS.md](./AGENTS.md) for development guidelines
|
|
355
|
-
|
|
356
|
-
## Migration
|
|
357
|
-
|
|
358
|
-
### From Jekyll
|
|
359
|
-
|
|
360
|
-
1. Copy markdown files to `data/blog/`
|
|
361
|
-
2. Update frontmatter format
|
|
362
|
-
3. Move images to GitHub repository
|
|
363
|
-
4. Update image URLs
|
|
364
|
-
|
|
365
|
-
### From Hugo
|
|
366
|
-
|
|
367
|
-
1. Convert content to standard markdown
|
|
368
|
-
2. Update frontmatter dates to ISO format
|
|
369
|
-
3. Migrate static assets
|
|
370
|
-
4. Configure redirects if needed
|
|
371
|
-
|
|
372
|
-
### From Ghost/WordPress
|
|
373
|
-
|
|
374
|
-
1. Export content to markdown
|
|
375
|
-
2. Clean up HTML remnants
|
|
376
|
-
3. Convert featured images
|
|
377
|
-
4. Set up URL redirects
|
|
378
|
-
|
|
379
|
-
## Performance Tips
|
|
380
|
-
|
|
381
|
-
1. **Image Optimization**: Use WebP format when possible
|
|
382
|
-
2. **Caching**: Enable Vercel Edge Caching
|
|
383
|
-
3. **Analytics**: Use minimal tracking for better performance
|
|
384
|
-
4. **Content**: Keep memo count reasonable for faster loading
|
|
385
|
-
|
|
386
|
-
## Security
|
|
387
|
-
|
|
388
|
-
- **Authentication**: GitHub OAuth only
|
|
389
|
-
- **Data Storage**: Your GitHub repository
|
|
390
|
-
- **Privacy**: No external databases
|
|
391
|
-
- **Analytics**: Privacy-first Umami integration
|
|
392
|
-
- **HTTPS**: Required in production
|
|
393
|
-
|
|
394
|
-
---
|
|
395
|
-
|
|
396
|
-
**That's everything!** Cofe is designed to be simple yet powerful. Start with the basics and customize as you grow.
|
|
397
|
-
|
|
398
|
-
Questions? Open an issue or start a discussion. Happy writing! ☕
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 用 iOS 快捷指令 + Numbers 做一套零依赖的记账系统
|
|
3
|
-
date: 2026-05-28T10:00:00.000Z
|
|
4
|
-
latitude: 52.330390529537716
|
|
5
|
-
longitude: 4.940213073274852
|
|
6
|
-
city: Duivendrecht
|
|
7
|
-
street: Kastanjepad
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
[ExpenSee](https://milemile.app/expensee) 上线之前,我用了很久一套土法记账:iOS 自带的**快捷指令** + **Numbers**。一行代码不写,没有服务器,没有 API,也没有第三方账号。每次付完款,按一下手机背面,整个流程跑完,一笔账就写进了 iCloud 上一份普通的 Numbers 表格里。
|
|
11
|
-
|
|
12
|
-
这条快捷指令是 ExpenSee 这款 App 最初的灵感来源。这篇文章把这套流程从头讲一遍,给那些愿意自己折腾 iOS 自动化的人作个参考。
|
|
13
|
-
|
|
14
|
-
> **iCloud 安装链接**:[https://www.icloud.com/shortcuts/c78c745e753541beb6a92e4f311b5c6f](https://www.icloud.com/shortcuts/c78c745e753541beb6a92e4f311b5c6f)
|
|
15
|
-
>
|
|
16
|
-
> **模版下载(备用)**:[https://milemile.app/expensee/static/template.numbers](https://milemile.app/expensee/static/template.numbers)
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## 它到底做了什么
|
|
21
|
-
|
|
22
|
-
每次运行,这条快捷指令做的事情是:
|
|
23
|
-
|
|
24
|
-
1. 算出当前年份,组合出一个文件名 `2026账本.numbers`,去 iCloud 的 *Numbers* 文件夹找它。
|
|
25
|
-
2. 如果文件不存在,就从 [milemile.app/expensee/static/template.numbers](https://milemile.app/expensee/static/template.numbers) 下载一份模版,按当年的年份命名后保存进 iCloud Drive 的 Numbers 文件夹,然后退出。
|
|
26
|
-
3. 如果文件存在,就**截一张屏**(一般是支付宝 / 微信支付的支付完成页),用系统自带的图像识别把所有形如 `[0-9]+\.[0-9]{1,3}` 的数字找出来。
|
|
27
|
-
4. 只识别到一个金额时直接采用;多个金额会跳出列表让你挑选;都没识别到就改为手动输入。
|
|
28
|
-
5. 依次询问:**支出 / 收入** → **分类** → **账户**(支付宝 / 微信 / 银行卡)→ **备注**。
|
|
29
|
-
6. 调用 Numbers 的 *在电子表格中添加值* 系统动作,把这一行写进当月对应的 `M月支出账单` 或 `M月收入明细` 表格里。
|
|
30
|
-
|
|
31
|
-
分类是预设好的:
|
|
32
|
-
|
|
33
|
-
- **支出**:数码电器、餐饮美食、自我提升、服饰装扮、日用百货、车辆交通、娱乐休闲、医疗健康、家庭支出、充值缴费、其他
|
|
34
|
-
- **收入**:主业收入、副业收入、投资理财、红包礼金、其他
|
|
35
|
-
|
|
36
|
-
整个流程没有任何一步要联网到我或者别人的服务器,所有数据都留在你的 iCloud 里。
|
|
37
|
-
|
|
38
|
-
## 一次性设置
|
|
39
|
-
|
|
40
|
-
1. **加入快捷指令**。在 iPhone 上打开 [这条 iCloud 链接](https://www.icloud.com/shortcuts/c78c745e753541beb6a92e4f311b5c6f),点 *添加快捷指令*。这条快捷指令叫 *ExpenSee 自动记账*。
|
|
41
|
-
2. **确认 iCloud 同步开着**:*设置 → 你的姓名 → iCloud → iCloud 云盘*,并确保 Numbers 在同步列表里。
|
|
42
|
-
3. **跑一次快捷指令**。如果你还没有当年的账本文件,它会下载模版并保存为 `{年份}账本.numbers`。看到 *设置成功,重新运行开始记账吧* 的提示就成功了。
|
|
43
|
-
4. **如果第一次卡住不动**(极少数情况下模版下载会很慢),手动从 [milemile.app/expensee/static/template.numbers](https://milemile.app/expensee/static/template.numbers) 下载文件,重命名为 `2026账本.numbers`(把年份换成当前),放到 iCloud 的 Numbers 文件夹里,再运行快捷指令即可。
|
|
44
|
-
|
|
45
|
-
## 怎么用:每天三秒
|
|
46
|
-
|
|
47
|
-
记账这件事最大的成本是从付款到入账之间的几秒钟。这条快捷指令的目标就是把这几秒压到极致:
|
|
48
|
-
|
|
49
|
-
1. 付款后停留在金额完成页;
|
|
50
|
-
2. 按下你绑定的快捷键(见下一节);
|
|
51
|
-
3. 系统自动截屏并识别金额,确认或挑选;
|
|
52
|
-
4. 选支出 / 收入、分类、账户,写一句备注,结束。
|
|
53
|
-
|
|
54
|
-
整个过程从掏出手机到结束大概 5 秒。
|
|
55
|
-
|
|
56
|
-
## 三种触发方式
|
|
57
|
-
|
|
58
|
-
把快捷指令绑到一个"一按就开始"的动作,是这套流程能跑下去的关键。下面三种任选其一:
|
|
59
|
-
|
|
60
|
-
### ① 操作按钮(iPhone 15 Pro 起)
|
|
61
|
-
|
|
62
|
-
> *设置 → 操作按钮 → 选择"快捷指令" → 选择"ExpenSee 自动记账"*
|
|
63
|
-
|
|
64
|
-
绑定之后,长按机身侧面的橙色按钮就启动整套流程。我自己是 15 Pro 用户,这是我用得最顺手的方式——付完款顺手长按一下,相当于把记账的"启动成本"降到了零。
|
|
65
|
-
|
|
66
|
-
### ② 轻点背面(所有支持的 iPhone)
|
|
67
|
-
|
|
68
|
-
> *设置 → 辅助功能 → 触控 → 轻点背面 → 轻点两下(或三下)→ 快捷指令 → ExpenSee 自动记账*
|
|
69
|
-
|
|
70
|
-
用手指轻敲两下手机背面就触发——不需要解锁回到主屏,不需要长按某个固定按钮,连戴着手机壳也照样能识别。这是没有操作按钮的 iPhone(XS、11、12、13、14 系列、所有非 Pro 机型)的最优解。
|
|
71
|
-
|
|
72
|
-
### ③ Siri 语音
|
|
73
|
-
|
|
74
|
-
直接对 Siri 说"ExpenSee 自动记账"。开车、做饭、手不空的时候最好用,但因为后续还需要点击挑选金额、分类等等,并不像前两个那样真的"全程不抬头",所以平时主要是兜底用。
|
|
75
|
-
|
|
76
|
-
## 数据在哪里
|
|
77
|
-
|
|
78
|
-
所有交易都写在 iCloud 上的 Numbers 文件 `{年份}账本.numbers` 里。每一年一份新表,按月分了 12 张工作表(`1月数据库` 到 `12月数据库`),每张工作表里有 *支出* / *收入* 两个表格。
|
|
79
|
-
|
|
80
|
-
因为这是一份普通的 Numbers 文档,你可以在任何 Apple 设备上:
|
|
81
|
-
|
|
82
|
-
- 直接做求和、按分类透视、画图表;
|
|
83
|
-
- 导出 CSV / Excel 给会计或税务;
|
|
84
|
-
- 用 iCloud Drive 备份,或者手动下载一份留底。
|
|
85
|
-
|
|
86
|
-
没有任何数据离开你的 iCloud。如果哪一天我这套生态都消失了,你的账本依然是一份完整、可读的 Numbers 文件。
|
|
87
|
-
|
|
88
|
-
## 局限性,以及为什么我后来做了 ExpenSee
|
|
89
|
-
|
|
90
|
-
用了一年多之后,几个不舒服的地方逐渐放大:
|
|
91
|
-
|
|
92
|
-
- **截屏 OCR 的识别率不稳定**。支付宝的金额数字字体大、对比强,识别没问题;但小红书、B 站、点外卖小票里的金额有时识别不到,就要手动输入。
|
|
93
|
-
- **每年初要手动初始化**——快捷指令是按 `{年份}账本.numbers` 命名的,跨年那天的第一笔会触发模版下载流程,不是无缝的。
|
|
94
|
-
- **多币种很难做**。Numbers 公式可以处理,但快捷指令本身没办法在记账的时候就帮你转换。
|
|
95
|
-
- **分类是写死的**——加一个新分类要改快捷指令,不是普通用户能接受的成本。
|
|
96
|
-
|
|
97
|
-
[ExpenSee](https://apps.apple.com/us/app/expensee-expense-tracking-ai/id6448993636) 把这件事的核心——把记账压到几秒——做成一个独立的 iOS 应用。同样不依赖任何外部服务,但识别准、原生支持多币种、日历视图能让你一眼看清这一个月。如果你想要这条快捷指令的"升级版",可以去 App Store 试试。
|
|
98
|
-
|
|
99
|
-
但如果你像我一样喜欢自己拼装工具,这条快捷指令依然是个不错的起点。它的全部源码就在你的 iPhone 上,可以随便改成你喜欢的样子——加分类、改账户、换币种、接到不同的 Numbers 表格里,都只是几下点击。
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 用 Golang 写一个支持各种编程语言的 serverless 框架
|
|
3
|
-
date: 2017-10-22T17:42:13.233Z
|
|
4
|
-
external_discussions:
|
|
5
|
-
- platform: hackernews
|
|
6
|
-
url: https://news.ycombinator.com/item?id=15686661
|
|
7
|
-
- platform: v2ex
|
|
8
|
-
url: https://v2ex.com/t/406259
|
|
9
|
-
- platform: reddit
|
|
10
|
-
url: https://www.reddit.com/r/programming/comments/7su688/fx_is_a_homemade_faas_tool_like_aws_lambda/
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
## 前言
|
|
18
|
-
|
|
19
|
-
fx 是我在 [Go Hack](http://gohack2017.golangfoundation.org/)的一个小作品,Go Hack 是一个以Go语言为主要编程语言的黑客马拉松比赛。虽然我和我队友两人都是写JavaScript的前端工程师, 以Golang 零基础参加这次比赛,不过很开心我们完成了fx,也喜欢上 Golang 这门语言.
|
|
20
|
-
|
|
21
|
-
读了那么多年书,写了那么久的代码,如果说有什么概念是深入骨髓的,只能说是”函数“了。虽然在数学上和编程上,“函数”这个词有很大的不一样的,但是有一点上它们是类似:
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
接受输入(可能为空值),然后进行处理,最后输出处理结果。
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
我们几乎可以用这个概念来描述所有的行为. 比如我们可以用下面的函数的来描述我们 fx 的诞生过程:
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
函数 f = Go Hack (以 Golang 为项目编程语言的黑客马拉松活动)
|
|
31
|
-
输入 input = [两个Go语言零基础的JavaScript工程师,两台Macbook,很多很多的功能饮料]
|
|
32
|
-
fx = f(input)
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## fx 是什么
|
|
36
|
-
|
|
37
|
-
那么 fx 是什么呢,一句话来说就是 : fx 是一个可以把一个函数变成一个服务的工具. 一个简单的例子来说一下 fx 的功能吧. 比如你写好了很棒的函数 , 它是这样的:
|
|
38
|
-
|
|
39
|
-
func.js
|
|
40
|
-
```javascript
|
|
41
|
-
module.exports = (input) => {
|
|
42
|
-
return parseInt(input.a, 10) + parseInt(input.b, 10)
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
它的作用就是计算两个数的和. 你把这个函数写在 `func.js` 这个文件里面。 这时候你希望可以将这个函数编程一个服务,对外提供一个 url 可以供外界访问. 但是想到 nginx, web server, api gateway…, 你头有点大了。 现在你可以简单的这样做。
|
|
47
|
-
|
|
48
|
-
```shell
|
|
49
|
-
fx up func.js
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
如果一切没有什么问题,你可以得到一个url.
|
|
53
|
-
|
|
54
|
-
```shell
|
|
55
|
-
$ fx list
|
|
56
|
-
|
|
57
|
-
+------------+---------+---------------+
|
|
58
|
-
| ID | STATE | URL |
|
|
59
|
-
+------------+---------+---------------+
|
|
60
|
-
| ce925443d5 | running | 0.0.0.0:40549 |
|
|
61
|
-
+------------+---------+---------------+
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
访问你的服务试试看
|
|
65
|
-
|
|
66
|
-
```shell
|
|
67
|
-
$ curl -X POST 0.0.0.0:40549 -H "Content-Type: application/json" -d '{"a": 1, "b": 1}'
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
你会得到 `2`. 这说明你的函数已经变成了一个服务了。
|
|
71
|
-
|
|
72
|
-
## fx 如何工作
|
|
73
|
-
|
|
74
|
-
fx 有两个部分组成,fx server 和 fx client, 最开始的 client 和 server 基于 websocket 进行通信,所有的交互基于 websocket message 来进行, 当时选择 websocket 的原因是因为其简单,能够快速验证我们的想法。当项目做完了演示了之后放到了 [Github](https://github.com/metrue/fx) 之后, 收到了很多的反馈,有同学提出了可以采用 RPC 架构来做,gRPC 如雷贯耳很长时间,就是没有机会去实践,但是后来工作一直很忙,所以没有能够及时完成迁移,然后社区的力量是强大的,一个就职于意大利FBK的哥们发Email和我说,他想参与维护 fx, 我简单看了他的Github主页了之后,就直接把他放到了 collaborator list 去了,后来他直接发了一个很大的 [Pull Request](https://github.com/metrue/fx/pull/100/files)过来,就是用 gRPC 替换了 websocket 的,我当然就很开心的做了merge.
|
|
75
|
-
|
|
76
|
-
所以现在的 fx 是一个基于 gRPC 框架的工具. 提供三个核心功能:
|
|
77
|
-
|
|
78
|
-
```shell
|
|
79
|
-
Usage:
|
|
80
|
-
$ fx up func1 func2 ... deploy a function or a group of functions
|
|
81
|
-
$ fx down func1 func2 ... destroy a function or a group of functions
|
|
82
|
-
$ fx list list deployed services
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
所以整个架构也很简单,fx up 会将 function 的定义内容传递给 fx server,fx server 接受到 function 的内容了之后,匹配到正确的 Dockerfile 和对应的构建镜像所需的资源, 然后会调用 Docker Engine 的 api 去构建相应的服务,最后把生成的服务的 URL 返回给客户端.
|
|
86
|
-
|
|
87
|
-
```shell
|
|
88
|
-
up/ deploy a function to service
|
|
89
|
-
-------------------------------------->
|
|
90
|
-
<--------------------------------------
|
|
91
|
-
down/ stop functions' services
|
|
92
|
-
-------------------------------------->
|
|
93
|
-
fx client <-------------------------------------- fx server
|
|
94
|
-
|
|
95
|
-
list/ list deployed services
|
|
96
|
-
-------------------------------------->
|
|
97
|
-
<--------------------------------------
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## fx 支持哪些编程语言
|
|
101
|
-
|
|
102
|
-
由于 fx 的一个服务的背后都是一个 Docker Container, 所以 fx 几乎可以支持所有的编程语言,由于精力有限,目前 fx 支持这些编程语言:
|
|
103
|
-
* Golang
|
|
104
|
-
* JavaScript/Node
|
|
105
|
-
* Ruby
|
|
106
|
-
* Python
|
|
107
|
-
* Java
|
|
108
|
-
* PHP
|
|
109
|
-
* Julia
|
|
110
|
-
|
|
111
|
-
## fx 的未来
|
|
112
|
-
|
|
113
|
-
啥未来,就是一个小工具而已。
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: 如何衡量一个团队是否值得加入
|
|
3
|
-
date: 2019-05-21T09:43:38.234Z
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
最近有人在 [Hacker News](https://news.ycombinator.com) 问 ["How do I find a meaningful software engineering job?"](https://news.ycombinator.com/item?id=17332796), 其中有一个人的回复我觉得有点意思, 而且和现在的看法有些些许的类似。
|
|
7
|
-
|
|
8
|
-
> I'm a late-career software developer. 30+ years in the trenches doing this...
|
|
9
|
-
> I've done "meaningful" work at companies that treated my like a consumable resource, and less meaningful work at companies that treated me like a person. I prefer the latter. My suggestion is don't jump at the first interesting work, look more for culture and career opportunity. You can find both, those jobs are not quite as rare as unicorns.
|
|
10
|
-
|
|
11
|
-
最近和常常和 [Jakehao](https://twitter.com/haojianzong) 聊聊工作这个事,什么样子的工作才是好工作,我们不断的跳槽到底在挑什么. 我和 Jake 经过这几年的工作经历,都觉得自己并没有单单为了工资而跳槽,由于我们俩都有过不成功的换工作经历,在一个自己不喜欢的地方和氛围下工作,是一种极其折磨人的状态,一般很难呆太久。在找工作的时候,我们两不时会聊自己的面试情况,自己的心态和感受,经过简单的总结之后,我们得到了这样一个公式
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
WGI = WLB * PV * SL * TA
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
> WGI ( Worth Going Index): 值得去指数
|
|
18
|
-
> WLB (Work Life Balance): 工作生活平衡
|
|
19
|
-
> PV ( Product Value ): 产品价值
|
|
20
|
-
> SL ( Salary Level ): 工资水平
|
|
21
|
-
> TA ( Team Atmosphere ): 团队氛围
|
|
22
|
-
WGI 越高,这个工作机会的价值越高,越值得我们去尝试;反之,WGI 越低则越表明这个工作机会的价值越低,越不值得我们尝试。
|
|
23
|
-
|
|
24
|
-
WGI 的这四个决定因素: 工作生活平衡 ( Work Life Balance, WLB), 产品价值( Product Value, PV ), 工资水平 ( Salary Level, SL), 和团队氛围 ( Team Atmosphere, TA ). 是来源我们两个数次的成功或者失败的换工作经历的总结而来的。
|
|
25
|
-
|
|
26
|
-
## Work Life Balance
|
|
27
|
-
工作生活平衡,966 在很多中国的 IT 公司不知不觉已经常态,这有点让人泄气,对很多人来说,也包含着有些无奈。 我是旗帜鲜明的排斥任何形式的加班的,我不喜欢任何形式的 Push。每一个人都是成年人,成年人就应该知道怎么规划自己的时间,怎么安排自己的工作,怎么去做任务的优先级排序,尽量少的给别人造成障碍和拖累拖累团队。绝大多数的加班都是无意义的,作为 Leader/Boss 让你的团队成员加班,就是赤裸裸用战术的勤奋来掩盖战略的愚蠢,无可争辩。
|
|
28
|
-
|
|
29
|
-
## Product Value
|
|
30
|
-
由于工作占据了我们生活的很大一部分,把自己那么大的时间和精力投入到一个没有太多意义的产品研发中,很难保持长久的激情。 如果参与到一个对自己,对这个社会有意义的产品开发中,每一次的代码的提交,都在让这个世界变得更好一点点,让人们的生活变得更好一点点,会让我们能保持一种充满激情的工作状态,而这种状态也让我们做事情事半功倍,每天的工作都是一种享受,也有助于我们有更多的时间去享受工作之外的生活。
|
|
31
|
-
|
|
32
|
-
## Salary Level
|
|
33
|
-
工资水平,我们都是平凡人,都需要买面包和牛奶。我们不是神,所以不能靠各种画出来的大饼来填饱肚子。
|
|
34
|
-
|
|
35
|
-
## Team Atmosphere
|
|
36
|
-
团队氛围,好的团队让每一个人都工作开心,相处融洽,相互帮助,分享知识,共同成长。好的团队并不是说要每一个人都要成为好朋友,我们都有自己的私人空间,尊重是一个好的团队的前提,尊重个人自由,尊重个人选择,尊重个人独立的想法。互助合作,每一个人都有新手时期,作为一个资深者应该给新人适当的给予帮助。团队中齐心协力才能让团队获得成功,但是团队成功并不意味着必须牺牲个人成功,相反,团队关心以及帮助团队成员获得个人的成功会更加有助于团队的成功。
|
|
37
|
-
|
|
38
|
-
有了这个公式之后,在我们找工作做选择有一个清晰的对比了,我把自己经历过的工作粗略的挨个计算了一下,结果如下:
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
Company WLB PV SL TA WGI
|
|
42
|
-
Synopsys 1 0.7 0.7 0.7 0.343
|
|
43
|
-
Second Spectrum 0.8 0.6 0.8 0.8 0.3072
|
|
44
|
-
Splunk 1 0.6 0.9 0.9 0.486
|
|
45
|
-
设计家 0.5 0.7 0.8 0.8 0.224
|
|
46
|
-
Udacity 1 0.9 0.8 0.9 0.648
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
不妨你也是计算一下你的前任和现任雇主们吧.
|