{"id":9492,"date":"2026-09-04T11:55:28","date_gmt":"2026-09-04T02:55:28","guid":{"rendered":"https:\/\/www.freelifemakers.org\/wordpress\/?p=9492"},"modified":"2026-09-05T13:52:09","modified_gmt":"2026-09-05T04:52:09","slug":"nextjs-sns-server-22","status":"publish","type":"post","link":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/09\/04\/nextjs-sns-server-22\/","title":{"rendered":"[nextjs]SNS Server-22(myapp32)\u00a0"},"content":{"rendered":"\n<p>\ud83d\udc49\ud83c\udffb \ud68c\uc6d0\uac00\uc785 \ubc0f \ub85c\uadf8\uc778 \uae30\ub2a5 \uad6c\ud604 \uc911 \uc785\ub2c8\ub2e4.<br>We are currently implementing the sign-up and login functions.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb public key \uac80\uc99d \ub85c\uc9c1\uc744 \uacc4\uc18d \uc9c4\ud589\ud569\ub2c8\ub2e4.<br>We will proceed with the public key verification logic.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb Inbox\ub97c public key\ub85c \uac80\uc99d\ud569\ub2c8\ub2e4.<br>Verify the Inbox using the public key.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb inbox\uc5d0 \uc11c\ubc84\uc758 \uc18d\ub3c4 \ud5a5\uc0c1\uc744 \uc704\ud574\uc11c \uce90\uc2dc \uae30\ub2a5\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4.<br>A caching feature is being added to the inbox to improve server speed.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb outbox\ub294 \uce90\uc2dc\uae30\ub2a5\uc744 \uc801\uc6a9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<br>The outbox does not utilize caching.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb pinafore\uc5d0\uc11c \uae00 \uc791\uc131\uc774 \uac00\ub2a5\ud558\ub3c4\ub85d outbox\/route.ts\uc5d0 POST\ud568\uc218\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<br>Add a POST function to <code>outbox\/route.ts<\/code> to enable writing posts in Pinafore.<\/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 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<strong> <\/strong>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=\"VUbgaw5L4h\"><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=HruwrmdlTq#?secret=VUbgaw5L4h\" data-secret=\"VUbgaw5L4h\" 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 Inbox Public Key Cache<\/p>\n\n\n\n<p>\u2714\ufe0f \uc11c\ubc84 \uc18d\ub3c4 \ud5a5\uc0c1\uc744 \uc704\ud574\uc11c inbox\uc5d0 \uce90\uc2dc\uae30\ub2a5\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4.<br>A caching function is being added to the inbox to improve server speed.<\/p>\n\n\n\n<p>\u2714\ufe0f \ub2e4\ub978 \uc11c\ubc84 \uae00\uc744 \ube68\ub9ac \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br>You can quickly receive posts from other servers.<\/p>\n\n\n\n<p>&#8212;  myapp32\/lib\/ap.ts<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>... ...\n\n\/\/ \u2705 myapp32 - \uacf5\uac1c\ud0a4 \uce90\uc2f1 \/ Public key caching\nconst publicKeyCache = new Map&lt;string, { key: string, cachedAt: number }&gt;();\nconst CACHE_TTL = 1000 * 60 * 60 * 1; \/\/ 1\uc2dc\uac04! (\ube60\ub974\uba74\uc11c \ucd5c\uc2e0!) \/ 1 hour! (fast and up-to-date!)\n\n... ...\nexport async function fetchActorPublicKeyCached(actorUrl: string, username: string): Promise&lt;string&gt; { ... }\n\nexport async function fetchActorPublicKeyWithRetry(\n  actorUrl: string, \n  username: string, \n  verifyReq: Request\n): Promise&lt;{ publicKey: string, isValid: boolean }&gt; { ... }<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f inbox\uc5d0 \uce90\uc2dc \uc801\uc6a9<br>Apply caching to the inbox.<\/p>\n\n\n\n<p>&#8212; myapp32\/app\/users\/[username]\/inbox\/route.ts<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { sendAccept, verifyHttpSignature, fetchActorPublicKey, fetchActorPublicKeyWithRetry } from '@\/lib\/ap';\nexport async function POST(req: Request, { params }: { params: Promise&lt;{ username: string }&gt; }) { \n ... ...\n        if (body.type === 'Delete') {\n        console.log(`\ud83d\uddd1 Delete\ub294 \uac80\uc99d \uc2a4\ud0b5! \/ Skip validation for Delete! ${actorIdForVerify}`);\n      } \n      else if (!actorIdForVerify) {\n        console.error('\u274c actor \uc5c6\uc74c! \uac80\uc99d \uc2a4\ud0b5!\/ No actor! Skip verification!', body);\n      } else {\n... ...\n          const verifyReq = new Request(req.url, {\n            method: req.method,\n            headers: req.headers,\n            body: rawBody\n          });\n... ...          \n        \n      \/\/ \u2757\ufe0f fetchActorPublicKeyWithRetry\uc5d0 \ud3ec\ud568\ub428 \/ Included in fetchActorPublicKeyWithRetry\n        \/\/ const isValid = await verifyHttpSignature(verifyReq, publicKeyPem); \n\n        \/\/ \u2705 myapp32 - \uce90\uc2f1 + \uc7ac\uc2dc\ub3c4! \/ Caching + Retry!\n        const { isValid } = await fetchActorPublicKeyWithRetry(\n            actorIdForVerify, \n            username, \n            verifyReq\n        );\n... ...        \n      }\n}<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 Outbox Public Key \uac80\uc99d<br>Outbox Public Key Verification<\/p>\n\n\n\n<p>\u2714\ufe0f Outbox\ub294 \uce90\uc2dc\ub97c \uc801\uc6a9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<br>The Outbox does not use caching.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ud83d\udca1 inbox\ub294 \ub0b4 \uc11c\ubc84\uc5d0 \uae00\uc774 \ub4e4\uc5b4\uc62c \ub54c \uc0c1\ub300\ubc29 \uc11c\ubc84\uac00 \ubcf8\uc778\uc758 private key\ub85c \uc11c\uba85\ud574\uc11c \ubcf4\ub0b4\uba74 \ub0b4 \uc11c\ubc84\uac00 \uae00 \ubcf4\ub0b4\ub294 \uc11c\ubc84\uc5d0 public key\ub97c \uc694\uccad\ud569\ub2c8\ub2e4. \ub450 \ud0a4\uac00 \ub9de\uc73c\uba74 \uae00 \ubc1b\uae30\ub97c \ud5c8\uc6a9\ud569\ub2c8\ub2e4.\n\nWith the inbox mechanism, when a message arrives at my server\u2014signed by the sender's server using its private key\u2014my server requests the public key from the sending server. If the keys match, the message is accepted.\n\n\ud83d\udca1 \uce90\uc2dc\ub97c \uc801\uc6a9\ud558\uba74 \ub0b4 \uc11c\ubc84\uc5d0 \uc0c1\ub300\ubc29 \uc11c\ubc84\uc758 publick key\uac00 \uc800\uc7a5\ub418\uc5b4 \uc788\uc73c\ubbc0\ub85c \uc0c1\ub300\ubc29 \uc11c\ubc84\uc5d0 public key \uc694\uccad \ud69f\uc218\uac00 \uc904\uc5b4\ub4ed\ub2c8\ub2e4. \uadf8\ub798\uc11c \uae00 \ubc1b\uae30 \uc18d\ub3c4\uac00 \ud5a5\uc0c1\ub429\ub2c8\ub2e4.\n\nImplementing caching stores the other server's public key on your server, thereby reducing the number of requests made to the other server for that key. This results in faster content retrieval speeds.\n\n\ud83d\udca1 outbox\uc5d0\uc11c POST\ub294 \ubc18\ub300\ub85c \ub0b4\uac00 \uc791\uc131\ud55c \uae00\uc744 \uc0c1\ub300\ubc29 \uc11c\ubc84\uc5d0 \ubcf4\ub0b4\ub294 \uae30\ub2a5\uc744 \uc218\ud589\ud569\ub2c8\ub2e4.\n\nIn the outbox, the POST method performs the function of sending a message I have written to the recipient's server.\n\n\ud83d\udca1 \uae00\uc744 \ubcf4\ub0b4\ub294\uac74 \ub0b4 \uc11c\ubc84\uc758 \uc18d\ub3c4\uc640 \uad00\ub828 \uc5c6\uc73c\ub2c8 \uce90\uc2dc\ub97c \uc801\uc6a9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n\nSending the content is unrelated to my server's speed, so caching is not applied.\n<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f POST \ud568\uc218\ucd94\uac00 \/ Add POST function<\/p>\n\n\n\n<p>&#8212; myapp32\/app\/users\/[username]\/outbox\/route.ts<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u2705 POST \ucd94\uac00! Pinafore\uac00 \uc5ec\uae30\ub85c \uae00 \uc500! \/ Added POST! Pinafore writes here!\nexport async function POST(req: Request, { params }: { params: Promise&lt;{ username: string }&gt; }) { ... }<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f GET\ud568\uc218\uc5d0 username \ud544\ud130 \ucd94\uac00<br>Add a username filter to the GET function.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export async function GET(_req: Request, { params }: { params: Promise&lt;{ username: string }&gt; }) {\n  const { username } = await params;\n    \/\/ \u2705 myap32 - username \ud544\ud130 \ucd94\uac00 \/ Added username filter\n<strong>    const posts = db.prepare('SELECT * FROM posts WHERE username = ? ORDER BY created_at DESC LIMIT 20').all(username) as any&#91;];<\/strong>\n    \n  try {\n} catch (e) { }<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\ud83d\udcc1 \ud14c\uc2a4\ud2b8 \/ Test<\/p>\n\n\n\n<p>\u2714\ufe0f \/api\/posts \ub77c\uc6b0\ud130\ub294 \ub0b4 UI\uc804\uc6a9 \uae00\uc4f0\uae30 \ub77c\uc6b0\ud2b8<br>The <code>\/api\/posts<\/code> router is the route dedicated to post creation for my UI.<\/p>\n\n\n\n<p>&#8212; \uae00\uc744 \uc791\uc131\ud560\ub54c \uc544\ub798\uc758 \ub77c\uc6b0\ud2b8\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<br>Use the route below when writing a post.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -X POST https:\/\/aloy-horizon.duckdns.org\/api\/posts \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\"username\":\"user1\",\"content\":\"Hello local UI #apiposts\"}'<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \/users\/[username]\/outbox \ub77c\uc6b0\ud130\ub294 activityPub \ud45c\uc900\ub77c\uc6b0\ud2b8\ub85c \uae00 \uc791\uc131 \ud560 \ub54c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<br>The <code>\/users\/[username]\/outbox<\/code> route handles post creation in accordance with the ActivityPub standard.<\/p>\n\n\n\n<p>&#8212; pinafore\ub4f1\uc5d0\uc11c \uae00 \uc791\uc131 \ud560\ub54c \uc0ac\uc6a9\ud568.<br>Used when writing posts on platforms like Pinafore.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -X POST https:\/\/aloy-horizon.duckdns.org\/users\/user1\/outbox \\\n  -H \"Content-Type: application\/activity+json\" \\\n  -d '{\"type\":\"Create\",\"object\":{\"content\":\"Hello Activity UI #activityposts \"}}'<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \ub0b4\uac00 \uc791\uc131\ud55c \uae00 \ubaa9\ub85d<br>List of posts I&#8217;ve written<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;aloy-horizon.duckdns.org\/users\/user1\/outbox<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \ud130\ubbf8\ub110 \ud14c\uc2a4\ud2b8 \/ Terminal test<\/p>\n\n\n\n<p>&#8212; \ub85c\uceec UI,pinafore\uc5d0\uc11c \uae00 \uc791\uc131 \ud560 \ub54c \uc0ac\uc6a9\ud560 \ub77c\uc6b0\ud2b8<br>Route to be used when composing a post in the local UI, Pinafore.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># api\/posts POST \ud130\ubbf8\ub110\uc5d0\uc11c \uc2e4\ud589 (\ub85c\uceec UI \uc804\uc6a9)\n# Execute api\/posts POST request in the terminal (local UI only)\n\n% curl -X POST https:\/\/aloy-horizon.duckdns.org\/api\/posts \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\"username\":\"user1\",\"content\":\"Hello local UI #apiposts\"}'\n\n# \uc751\ub2f5 \/ response\n\n{\"id\":\"aefc7ff8-5b38-4fb7-829d-9b14343cec6a\",\"content\":\"Hello local UI #apiposts\",\"created_at\":\"2026-09-05 03:39:37\",\"username\":\"user1\"}%\n\n% \n% \n\n# users\/&#91;username]\/outbox POST \ud130\ubbf8\ub110\uc5d0\uc11c \uc2e4\ud589(ActivityPub \uc804\uc6a9)\n# Execute POST to users\/&#91;username]\/outbox in the terminal (ActivityPub only)\n\n% curl -X POST https:\/\/aloy-horizon.duckdns.org\/users\/user1\/outbox \\\n  -H \"Content-Type: application\/activity+json\" \\\n  -d '{\"type\":\"Create\",\"object\":{\"content\":\"Hello Activity UI #activityposts\"}}'\n\n# \uc751\ub2f5 \/ response\n\n{\"@context\":\"https:\/\/www.w3.org\/ns\/activitystreams\",\"id\":\"https:\/\/aloy-horizon.duckdns.org\/users\/user1\/posts\/4ace7a75-3a40-494f-8dea-bf3f688b6cfb#activity\",\"type\":\"Create\",\"actor\":\"https:\/\/aloy-horizon.duckdns.org\/users\/user1\",\"object\":{\"id\":\"https:\/\/aloy-horizon.duckdns.org\/users\/user1\/posts\/4ace7a75-3a40-494f-8dea-bf3f688b6cfb\",\"type\":\"Note\",\"attributedTo\":\"https:\/\/aloy-horizon.duckdns.org\/users\/user1\",\"content\":\"Hello Activity UI #activityposts\",\"published\":\"2026-09-05T03:39:48.980Z\",\"to\":&#91;\"https:\/\/www.w3.org\/ns\/activitystreams#Public\"],\"cc\":&#91;\"https:\/\/aloy-horizon.duckdns.org\/users\/user1\/followers\"]}}\n\n%    <\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \ub9c8\uc2a4\ud2b8\ub3c8\uc5d0 \uae00 \ub3c4\ucc29 \ud655\uc778<br>Confirmed receipt of post on Mastodon.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"695\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-mastodon-jpg.jpg\" alt=\"\" class=\"wp-image-9616\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-mastodon-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-mastodon-jpg-300x261.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-mastodon-jpg-768x667.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-mastodon-jpg-400x348.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">mastodon.social<\/figcaption><\/figure>\n\n\n\n<p>\u2714\ufe0f gotosocial\uc5d0 \uae00 \ub3c4\ucc29 \ud655\uc778<br>Confirming receipt of post on GoToSocial<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"617\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-gotosocial-jpg.jpg\" alt=\"\" class=\"wp-image-9617\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-gotosocial-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-gotosocial-jpg-300x231.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-gotosocial-jpg-768x592.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-gotosocial-jpg-400x309.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">gotosocial<\/figcaption><\/figure>\n\n\n\n<p>\u2714\ufe0f \uc11c\ubc84 \ub85c\uadf8 \/ Server Log<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"487\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-serverlog-jpg.jpg\" alt=\"\" class=\"wp-image-9619\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-serverlog-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-serverlog-jpg-300x183.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-serverlog-jpg-768x468.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp32-serverlog-jpg-400x244.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Server Log<\/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 \uae30\ub2a5 \uad6c\ud604 \uc911 \uc785\ub2c8\ub2e4.We are currently implementing the sign-up and login functions. \ud83d\udc49\ud83c\udffb public key \uac80\uc99d \ub85c\uc9c1\uc744 \uacc4\uc18d \uc9c4\ud589\ud569\ub2c8\ub2e4.We will proceed with the public key verification logic. \ud83d\udc49\ud83c\udffb Inbox\ub97c public key\ub85c \uac80\uc99d\ud569\ub2c8\ub2e4.Verify the Inbox using the public key. \ud83d\udc49\ud83c\udffb inbox\uc5d0 \uc11c\ubc84\uc758 \uc18d\ub3c4 \ud5a5\uc0c1\uc744 \uc704\ud574\uc11c \uce90\uc2dc \uae30\ub2a5\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4.A caching feature is being [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":9616,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28,27,1,7],"tags":[],"class_list":["post-9492","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\/9492","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=9492"}],"version-history":[{"count":63,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/9492\/revisions"}],"predecessor-version":[{"id":9625,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/9492\/revisions\/9625"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media\/9616"}],"wp:attachment":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=9492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=9492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=9492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}