{"id":9877,"date":"2026-09-08T08:15:03","date_gmt":"2026-09-07T23:15:03","guid":{"rendered":"https:\/\/www.freelifemakers.org\/wordpress\/?p=9877"},"modified":"2026-09-08T11:45:02","modified_gmt":"2026-09-08T02:45:02","slug":"nextjs-sns-server-25","status":"publish","type":"post","link":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/09\/08\/nextjs-sns-server-25\/","title":{"rendered":"[nextjs]SNS Server-25(myapp35)\u00a0"},"content":{"rendered":"\n<p>\ud83d\udc49\ud83c\udffb \ud68c\uc6d0\uac00\uc785 \ubc0f \ub85c\uadf8\uc778\uacfc \uad00\ub828\ub41c \uae30\ub2a5\uc785\ub2c8\ub2e4.<br>These are features related to sign-up and login.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb pinafore\uc5d0\uc11c \uac80\uc0c9\ub41c \uacc4\uc815\uc758 \ud504\ub85c\ud544\uc5d0\uc11c \uc784\uc2dc\ub370\uc774\ud130\ub97c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub370\uc774\ud130\ub85c \ubc14\uafc9\ub2c8\ub2e4.(\ud504\ub85c\ud544 + \uc791\uc131\ud55c\uae00)<br>Replace the temporary data with database data in the profile of the account found on Pinafore (including the profile and posts).<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb FOLLOW\uc640 FOLLOWERS\uac12\uc740 gotosocial\uacfc mastodon\uc5d0\uc11c \uc8fc\uc9c0 \uc54a\ub294 \uac12\uc73c\ub85c \ub0b4 \ub85c\uceec \uc11c\ubc84(aloy)\uc5d0\uc11c \uac00\uc838\uc654\uc2b5\ub2c8\ub2e4.<br>The &#8220;FOLLOW&#8221; and &#8220;FOLLOWERS&#8221; values \u200b\u200bare not provided by GoToSocial or Mastodon; I retrieved them from my local server (aloy).<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb user1\uc73c\ub85c \ub85c\uadf8\uc778\ud558\uba74 user1\uc758 FOLLOW\uc640 FOLLOWERS\uac12\uc774 pinafore.social\uc5d0\uc11c \ud655\uc778 \ub429\ub2c8\ub2e4.<br>When you log in as user1, the &#8220;Following&#8221; and &#8220;Followers&#8221; counts for user1 are displayed on pinafore.social.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \uadf8\ub798\uc11c pinafore.social\uc5d0\uc11c \ud655\uc778\ud558\ub294\uac70\ub791 \ud574\ub2f9 sns\uc6f9\uc0ac\uc774\ud2b8 \uac12\uacfc \ub2e4\ub97c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br>Therefore, the values \u200b\u200bshown on pinafore.social may differ from those on the actual social media website.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \uc804\uccb4 \ucf54\ub4dc\ub294 \uae43\ud5c8\ube0c\uc5d0\uc11c \ud655\uc778 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br>You can find the full code on GitHub.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/gideonslife01\/flm-nextjs\">https:\/\/github.com\/gideonslife01\/flm-nextjs<\/a><\/p>\n\n\n\n<p>\ud83d\udcc1 \uc804\uccb4 \ud504\ub85c\uc81d\ud2b8 \uad6c\uc870 \/ Overall Project Structure<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>myapp project\/  \n\u251c\u2500\u2500 app\/  (Next.js App Router)\n\u2502   \u251c\u2500\u2500 .well-known\/webfinger\/route.ts  -&gt; webfinger\n\u2502   \u251c\u2500\u2500 api\/follow\/route.ts    -&gt; Follow API(temporary)\n\u2502   \u251c\u2500\u2500 api\/announce\/route.ts  -&gt; Boost(Announcement)\n\u2502   \u251c\u2500\u2500 api\/like\/route.ts.     -&gt; Like API\n\u2502   \u251c\u2500\u2500 api\/posts\/route.ts     -&gt; Writing API\n\u2502   \u251c\u2500\u2500 api\/timeline\/route.ts  -&gt; Timeline API\n\u2502   \u251c\u2500\u2500 <span style=\"background-color: initial; font-size: inherit; text-align: initial; color: initial;\">api\/v1\/instance<\/span>\/route.ts -&gt; auth\n\u2502   \u251c\u2500\u2500 api\/v1\/apps\/route.ts.    -&gt; auth\n\u2502   \u251c\u2500\u2500 api\/v1\/accounts\/verify_credentials\/route.ts -&gt; auth\n\u2502   \u251c\u2500\u2500 api\/v1\/statuses\/route.ts -&gt; Write Post\n\u2502   \u251c\u2500\u2500 <span style=\"background-color: initial; font-size: inherit; text-align: initial; color: initial;\">api\/v1\/timelines\/home\/route.ts<\/span> -&gt; timeline\n\u2502   \u251c\u2500\u2500 <span style=\"background-color: initial; font-size: inherit; text-align: initial; color: initial;\">oauth\/authorize\/route.ts<\/span> -&gt; auth\n\u2502   \u251c\u2500\u2500 <span style=\"background-color: initial; font-size: inherit; text-align: initial; color: initial;\">oauth\/token\/route.ts<\/span> -&gt; auth\n\u2502   \u251c\u2500\u2500 <span style=\"background-color: initial; font-size: inherit; text-align: initial; color: initial;\">api\/v1\/search\/home\/route.ts<\/span> -&gt; search\n\u2502   \u251c\u2500\u2500 <span style=\"background-color: initial; font-size: inherit; text-align: initial; color: initial;\">api\/v2\/search\/home\/route.ts<\/span> -&gt; search\n\u2502   \u251c\u2500\u2500 users\/&#91;username]\/\n\u2502   \u2502   \u251c\u2500\u2500 statuses\/&#91;id]\/route.ts -&gt; Indivisual Post\n\u2502   \u2502   \u251c\u2500\u2500 route.ts               -&gt; Acotr Information\n\u2502   \u2502   \u251c\u2500\u2500 followers\/route.ts     -&gt; Followers List\n\u2502   \u2502   \u251c\u2500\u2500 following\/route.ts     -&gt; Following List\n\u2502   \u2502   \u251c\u2500\u2500 inbox\/route.ts         -&gt; Inbox\n\u2502   \u2502   \u2514\u2500\u2500 outbox\/route.ts        -&gt; outbox\n\u2502   \u251c\u2500\u2500 usersui\/&#91;username]\/\n\u2502   \u2502   \u251c\u2500\u2500 page.tsx               -&gt; Timeline UI\n\u2502   \u2502   \u2514\u2500\u2500 _components\/themes\/\n\u2502   \u2502       \u251c\u2500\u2500 themeex\/ThemeexTheme.tsx   -&gt; Example Theme\n\u2502   \u2502       \u251c\u2500\u2500 pinafore\/PinaforeTheme.tsx -&gt; Theme 1\n\u2502   \u2502       \u251c\u2500\u2500 mastodon\/MastodonTheme.tsx -&gt; Theme 2\n\u2502   \u2502       \u2514\u2500\u2500 minimal\/MinimaltTheme.tsx  -&gt; Theme 3\n\u2502   \u251c\u2500\u2500 layout.tsx, page.tsx, globals.css\n\u2502   \u2514\u2500\u2500 favicon.ico\n\u251c\u2500\u2500 lib\/\n\u2502   \u251c\u2500\u2500 theme.tsx              -&gt; Theme Provider\n\u2502   \u251c\u2500\u2500 watchThemes.ts         -&gt; Check real-time theme changes\n\u2502   \u251c\u2500\u2500 auth.ts                -&gt; Authentication, User Management\n\u2502   \u251c\u2500\u2500 ap.ts                  -&gt; Follow,Undo,Create,Likes,Announce\n\u2502   \u2514\u2500\u2500 db.ts                  -&gt; DB connection\n\u251c\u2500\u2500 data\/\n\u2502   \u251c\u2500\u2500 keys\/userIDs\/          -&gt; private.pem, public.pem(New)\n\u2502   \u2514\u2500\u2500 keys\/                  -&gt; private.pem, public.pem(legacy)\n\u251c\u2500\u2500 data.sqlite                -&gt; Database(1\/3)\n\u251c\u2500\u2500 data.sqlite-wal            -&gt; Database(2\/3)\n\u251c\u2500\u2500 data.sqlite-shm            -&gt; Database(3\/3)\n\u251c\u2500\u2500 Caddyfile                  -&gt; https \n\u251c\u2500\u2500 instrumentation.ts         -&gt; Background Server\n\u2514\u2500\u2500 package.json<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \ud504\ub85c\uc81d\ud2b8 \uc2dc\uc791 \/ Project Start<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-freelifemakers-org wp-block-embed-freelifemakers-org\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"gPPzlhqDfg\"><a href=\"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/09\/03\/nextjs-project-summary\/\">[nextjs]\ud504\ub85c\uc81d\ud2b8\uc694\uc57d\/project summary(myapp30+)<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;[nextjs]\ud504\ub85c\uc81d\ud2b8\uc694\uc57d\/project summary(myapp30+)&#8221; &#8212; freelifemakers.org\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/09\/03\/nextjs-project-summary\/embed\/#?secret=ruJqnwILii#?secret=gPPzlhqDfg\" data-secret=\"gPPzlhqDfg\" width=\"560\" height=\"315\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\ud83d\udcc1 \ucf54\ub4dc \uc218\uc815 \/ Code Modification<\/p>\n\n\n\n<p>\u2714\ufe0f app\/api\/v1\/accounts\/[id]\/route.ts<\/p>\n\n\n\n<p>&#8212; \uac80\uc0c9 \ud6c4 \uc0c1\uc138\ud398\uc774\uc9c0 \ud504\ub85c\ud544 \uc601\uc5ed<br>Profile section on the detail page after search<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u2705 myapp35 - app\/api\/v1\/accounts\/&#91;id]\/route.ts \n\/\/ - Profile info.\n\nimport { NextResponse } from 'next\/server';\nimport db from '@\/lib\/db';\n\nconst DOMAIN = process.env.DOMAIN || 'aloy-horizon.duckdns.org';\n\nexport async function GET(req: Request, { params }: { params: Promise&lt;{ id: string }&gt; }) { ... ...}\n\nexport async function OPTIONS() {\n  return new NextResponse(null, { status: 204, headers: { 'Access-Control-Allow-Origin': '*' } });\n}<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f app\/api\/v1\/accounts\/[id]\/statuses\/route.ts<\/p>\n\n\n\n<p>&#8212; \uac80\uc0c9 \ud6c4 \uc0c1\uc138\ud398\uc774\uc9c0 \uae00 \uc601\uc5ed<br>Content area of \u200b\u200bthe details page after search<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u2705 myapp35 - app\/api\/v1\/accounts\/&#91;id]\/statuses\/route.ts\n\/\/ - pinafore s\n\nimport { NextResponse } from 'next\/server';\nimport db from '@\/lib\/db';\n\nconst DOMAIN = process.env.DOMAIN || 'aloy-horizon.duckdns.org';\n\nexport async function GET(req: Request, { params }: { params: Promise&lt;{ id: string }&gt; }) { ... ... }\n\nexport async function OPTIONS() {\n  return new NextResponse(null, { status: 204, headers: { 'Access-Control-Allow-Origin': '*' } });\n}<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \ud14c\uc2a4\ud2b8 \/ Test<\/p>\n\n\n\n<p>\u2714\ufe0f \ub9ac\ubaa8\ud2b8 \uc11c\ubc84 \/ Remote Server<\/p>\n\n\n\n<p>&#8212; \ub9c8\uc2a4\ud1a0\ub3c8 \/ Mastodon<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"794\" height=\"1024\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-mastodon-pi-jpg-794x1024.jpg\" alt=\"\" class=\"wp-image-9893\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-mastodon-pi-jpg-794x1024.jpg 794w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-mastodon-pi-jpg-233x300.jpg 233w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-mastodon-pi-jpg-768x991.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-mastodon-pi-jpg-400x516.jpg 400w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-mastodon-pi-jpg.jpg 800w\" sizes=\"auto, (max-width: 794px) 100vw, 794px\" \/><figcaption class=\"wp-element-caption\">Mastodon<\/figcaption><\/figure>\n\n\n\n<p>&#8212; \uace0\ud22c\uc18c\uc15c \/ Gotosocial<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"763\" height=\"1024\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-gts-pi-jpg-763x1024.jpg\" alt=\"\" class=\"wp-image-9895\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-gts-pi-jpg-763x1024.jpg 763w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-gts-pi-jpg-223x300.jpg 223w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-gts-pi-jpg-768x1031.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-gts-pi-jpg-400x537.jpg 400w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-gts-pi-jpg.jpg 800w\" sizes=\"auto, (max-width: 763px) 100vw, 763px\" \/><figcaption class=\"wp-element-caption\">Gotosocial<\/figcaption><\/figure>\n\n\n\n<p>\u2714\ufe0f \ub85c\uceec\uc11c\ubc84 \/ Local Server<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"903\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-aloy-pi-jpg.jpg\" alt=\"\" class=\"wp-image-9898\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-aloy-pi-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-aloy-pi-jpg-266x300.jpg 266w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-aloy-pi-jpg-768x867.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp35-aloy-pi-jpg-400x452.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Local Server<\/figcaption><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\uc694\ud55c\ubcf5\uc74c 8\uc7a5 32\uc808 \/ John 8:32<\/p>\n\n\n\n<p>&#8220;\uadf8\ub9ac\uace0 \ub108\ud76c\ub294 \uc9c4\ub9ac\ub97c \uc54c\uac8c \ub420 \uac83\uc774\uba70, \uc9c4\ub9ac\uac00 \ub108\ud76c\ub97c \uc790\uc720\ub86d\uac8c \ud560 \uac83\uc774\ub2e4.&#8221;<\/p>\n\n\n\n<p>&#8220;Then you will know the truth ,and the truth will set you free&#8221;<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udc49\ud83c\udffb \ud68c\uc6d0\uac00\uc785 \ubc0f \ub85c\uadf8\uc778\uacfc \uad00\ub828\ub41c \uae30\ub2a5\uc785\ub2c8\ub2e4.These are features related to sign-up and login. \ud83d\udc49\ud83c\udffb pinafore\uc5d0\uc11c \uac80\uc0c9\ub41c \uacc4\uc815\uc758 \ud504\ub85c\ud544\uc5d0\uc11c \uc784\uc2dc\ub370\uc774\ud130\ub97c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub370\uc774\ud130\ub85c \ubc14\uafc9\ub2c8\ub2e4.(\ud504\ub85c\ud544 + \uc791\uc131\ud55c\uae00)Replace the temporary data with database data in the profile of the account found on Pinafore (including the profile and posts). \ud83d\udc49\ud83c\udffb FOLLOW\uc640 FOLLOWERS\uac12\uc740 gotosocial\uacfc mastodon\uc5d0\uc11c \uc8fc\uc9c0 \uc54a\ub294 \uac12\uc73c\ub85c \ub0b4 \ub85c\uceec \uc11c\ubc84(aloy)\uc5d0\uc11c \uac00\uc838\uc654\uc2b5\ub2c8\ub2e4.The [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":9898,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28,27,1,7],"tags":[],"class_list":["post-9877","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","category-nextjs","category-uncategorized","category-website","has-thumbnail"],"_links":{"self":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/9877","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=9877"}],"version-history":[{"count":19,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/9877\/revisions"}],"predecessor-version":[{"id":9901,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/9877\/revisions\/9901"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media\/9898"}],"wp:attachment":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=9877"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=9877"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=9877"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}