{"id":9168,"date":"2026-09-01T09:52:25","date_gmt":"2026-09-01T00:52:25","guid":{"rendered":"https:\/\/www.freelifemakers.org\/wordpress\/?p=9168"},"modified":"2026-09-01T15:25:34","modified_gmt":"2026-09-01T06:25:34","slug":"nextjs-sns-server-19","status":"publish","type":"post","link":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/09\/01\/nextjs-sns-server-19\/","title":{"rendered":"[nextjs]SNS Server-19(myapp29)"},"content":{"rendered":"\n<p>\ud83d\udc49\ud83c\udffb myapp29\uc5d0\ub294 \uc88b\uc544\uc694 \ubc84\ud2bc\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4.<br>Add a &#8220;Like&#8221; button to myapp29.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \uae30\uc874\uc758 \ubd80\uc2a4\ud2b8\uc640 \uc88b\uc544\uc694 \ubd80\ubd84\uc758 \ubc84\ud2bc \uc624\ub958\ub85c \ubc84\ud2bc \uc2e4\ud589\uc815\ubcf4\ub97c DB\uac80\uc0c9\uc815\ubcf4\ub97c \ud65c\uc6a9\ud558\ub3c4\ub85d \ubc14\uafe8\uc2b5\ub2c8\ub2e4.<br>To resolve button errors in the existing &#8220;Boost&#8221; and &#8220;Like&#8221; features, I modified the implementation to utilize database search information for button actions.<\/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>myapp29\/  \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 ap.ts                  -&gt; Follow Accept\n\u2502   \u2514\u2500\u2500 db.ts                  -&gt; DB connection\n\u251c\u2500\u2500 data\/\n\u2502   \u2514\u2500\u2500 keys\/                  -&gt; private.pem, public.pem\n\u251c\u2500\u2500 data.sqlite                -&gt; Database\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(myapp29)<br>Project Start (myapp29)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npx create-next-app@latest<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 SQLite\uc124\uce58 \/ Installing SQLite<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ~\/myapp29\nnpm install better-sqlite3\nnpm install -D @types\/better-sqlite3<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 chokidar \uc124\uce58 \/ Installing chokidar<\/p>\n\n\n\n<p>&#8212; \uc2e4\uc2dc\uac04 \ud30c\uc77c \ubc0f \ud3f4\ub354\ubcc0\uacbd \uac10\uc2dc\uae30\ub2a5<br>Real-time file and folder change monitoring function<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install -D chokidar<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 DDNS,https\uc124\uc815 \/ DDNS,https settings<\/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=\"KlTCrwYxY2\"><a href=\"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/08\/10\/nextjs-dns-caddy\/\">[nextjs]nextjs+domain(ddns)+https(caddy)<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;[nextjs]nextjs+domain(ddns)+https(caddy)&#8221; &#8212; freelifemakers.org\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/08\/10\/nextjs-dns-caddy\/embed\/#?secret=SkLG9MgnFu#?secret=KlTCrwYxY2\" data-secret=\"KlTCrwYxY2\" width=\"560\" height=\"315\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>\ud83d\udcc1 \ub3c4\uba54\uc778\ud5c8\uc6a9, @userid \uc0ac\uc6a9\ud558\uae30<br>Allowing domains, using @userid<\/p>\n\n\n\n<p>&#8212; next.config.ts<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import type { NextConfig } from \"next\";\n\nconst nextConfig: NextConfig = {\n  \/* allow domain*\/\n  allowedDevOrigins: &#91;'aloy-horizon.duckdns.org', '*.duckdns.org'],\n\n  \/* host.domain.org\/@userid *\/\n<strong>  async rewrites() {\n    return &#91;\n      {\n        source: '\/@:username',\n        destination: '\/usersui\/:username',\n      },\n    ]\n  }<\/strong>\n};\n\n\nexport default nextConfig;\n<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \uc774\uc804 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uc2e0\uaddc \ud504\ub85c\uc81d\ud2b8\ub85c \ubcf5\uc0ac\ud560 \ud30c\uc77c<br>Files to copy from the previous project to the new project<\/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\/                  -&gt; API\n\u2502   \u251c\u2500\u2500 users\/                -&gt; Inbox,Outbox,Post,Actor\n\u2502   \u251c\u2500\u2500 usersui\/              -&gt; Timeline UI,Theme\n\u2502   \u251c\u2500\u2500 layout.tsx            -&gt; Privoder\n\u251c\u2500\u2500 lib\/\n\u251c\u2500\u2500 data\/                     -&gt; Key\n\u251c\u2500\u2500 data.sqlite               -&gt; Database\n\u251c\u2500\u2500 Caddyfile                 -&gt; https \n\u251c\u2500\u2500 next.config.ts            -&gt; DDNS,@\n\u2514\u2500\u2500 instrumentation.ts        -&gt; Background Server<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\ud83d\udcc1 \ud14c\uc774\ube14 \uc218\uc815 \/ Modify Table<\/p>\n\n\n\n<p>\u2714\ufe0f announces \ud14c\uc774\ube14\uc5d0 actor\ud544\ub4dc\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<br>Add an &#8216;actor&#8217; field to the &#8216;announces&#8217; table.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ALTER TABLE announces ADD COLUMN actor TEXT;\nCREATE INDEX IF NOT EXISTS idx_announces_actor ON announces(actor);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_announces_actor_object ON announces(actor, object);<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \ucf54\ub4dc \uc218\uc815 \/ Code Modification<\/p>\n\n\n\n<p>\u2714\ufe0f lib\/db.ts<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>... ...\ndb.exec(`\n... ...\n  CREATE TABLE IF NOT EXISTS users (  \n-- myapp29 \u2705  Boost(Announcement)\n  CREATE TABLE IF NOT EXISTS announces (\n    id TEXT PRIMARY KEY, \n    username TEXT, \n    object TEXT, \n    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n    actor TEXT\n  );\n`);\ndb.exec(`\n  ... ...\n    -- myapp29 \u2705\n  CREATE INDEX IF NOT EXISTS idx_announces_actor ON announces(actor);\n  CREATE UNIQUE INDEX IF NOT EXISTS idx_announces_actor_object ON announces(actor, object);\n`);<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f app\/api\/timeline\/route.ts <\/p>\n\n\n\n<p>&#8212; boost\ub294\uae30\uc874 \ucf54\ub4dc\uc720\uc9c0, \uc544\ub798\ucf54\ub4dc\ub294 \uc88b\uc544\uc694 \ubd80\ubd84 \ucf54\ub4dc \uc218\uc815<br>The &#8216;boost&#8217; option preserves the existing code, while the code below modifies the &#8216;like&#8217; section.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export async function GET(req: Request) {\n... ...  \n\/\/ \ub0b4 Like - actor \uc815\ud655\ud788 \/ Accurate actor for my Like\n  const myActor = `https:\/\/${DOMAIN}\/users\/${username}`;\n  const myLikes = db.prepare(`SELECT object FROM likes WHERE actor =?`).all(myActor) as any&#91;];\n... ...\n    \/\/ \u2705 shortId \uc548\uc804\ud558\uac8c! \/ shortId safely!\n    const shortId = getShortId(fullId);\n    if (!shortId) {\n      return {...p, fullId, isMyBoost: false, boostCount: 0, isMyLike: false, likeCount: 0 };\n    }\n... ...\n   \/\/ \u2705 \uc88b\uc544\uc694 - shortId \uae30\ubc18 \/ Like - based on shortId\n    const isMyLike = likedSet.has(shortId);\n\n    const likeCount = (db.prepare(\n      `SELECT COUNT(*) as c FROM likes WHERE object LIKE '%' ||? || '%'`\n    ).get(shortId) as any)?.c || 0;\n}\n\n<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f app\/api\/like\/route.ts<\/p>\n\n\n\n<p>&#8212; \uc88b\uc544\uc694 \ubc84\ud2bc \ub204\ub97c\ub54c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ub41c \uac12\uc744 \uae30\uc874\uc73c\ub85c \uc124\uc815<br>Set the initial value based on the data stored in the database when the &#8220;Like&#8221; button is clicked.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  \/\/ \u2705 DB \uccb4\ud06c: \ub0b4\uac00 \uc774\ubbf8 \ub20c\ub800\uc73c\uba74 1 \ub354\ud558\uc9c0 \uc54a\uc74c! \/ DB check: If I already liked, do not add 1!\n  const existing = db.prepare(`SELECT id FROM likes WHERE actor =? AND object LIKE '%' ||? || '%'`).get(myActor, shortId) as any;\n  if (existing) {\n    const likeCount = (db.prepare(`SELECT COUNT(*) as c FROM likes WHERE object LIKE '%' ||? || '%'`).get(shortId) as any).c;\n    return NextResponse.json({ ok: true, alreadyLiked: true, isMyLike: true, likeCount });\n  }<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f usersui\/[username]\/page.tsx<\/p>\n\n\n\n<p>&#8212;  \uc804\uccb4 DB \uae30\uc900\uc73c\ub85c \uc218\uc815<br>Modified based on the entire database<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const handleBoost = async (post: any) =&gt; { ... ... }  \nconst handleLike = async (post: any) =&gt; { ... ...}<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0fapp\/api\/inbox\/route.ts<\/p>\n\n\n\n<p>&#8212; act\ud544\ub4dc \ube60\uc9c4\uac83 \ucd94\uac00, Undo \ub450\uac1c \uc788\ub294\uac83 \uc218\uc815,actor + shortId\ub85c \uc0ad\uc81c \ud558\ub3c4\ub85d \uc218\uc815<br>Added the missing &#8216;act&#8217; field, fixed the duplicate &#8216;Undo&#8217; entry, and modified the deletion logic to use &#8216;actor&#8217; + &#8216;shortId&#8217;.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export async function POST(req: Request, { params }: { params: Promise&lt;{ username: string }&gt; }) {\n\n... ...\nif (body.type === 'Undo') { ... ...}\nif (body.type === 'Create') { ... ... }\nif (body.type === 'Like') { ... ... }\nif (body.type === 'Announce') { ... ...\n\n            db.prepare(`INSERT OR IGNORE INTO inbox_posts (id, actor, content, username, original_id, created_at) VALUES (?,?,?,?,?,?)`)\n              .run(shortId, actorId, content, username, longId, body.published || new Date().toISOString());\n          }\nif (body.type === 'Follow') { ... ... }\n... ...\n }\n\n}<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f usersui\/[username]\/theme\/pinafore\/PinaforeTheme.tsx<\/p>\n\n\n\n<p>&#8212; \ubc84\ud2bc \ubc0f \uce74\uc6b4\ud130 \ucd94\uac00 \/ Add buttons and counters<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;button onClick={() =&gt; onBoost(p)} className={p.isMyBoost? 'boosted' : ''}&gt;\ud83d\udd01 {p.boostCount || ''}&lt;\/button&gt;\n&lt;button onClick={() =&gt; onLike(p)} className={p.isMyLike? 'liked' : ''}&gt;\u2b50 {p.likeCount || ''}&lt;\/button&gt;<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \ud14c\uc2a4\ud2b8 \/ Test<\/p>\n\n\n\n<p>\u2714\ufe0f \ud14c\uc2a4\ud2b8\ub294 \ub9c8\uc2a4\ud1a0\ub3c8 \uc11c\ubc84\uc5d0\uc11c \uacc4\uc815\uc0dd\uc131\ud574\uc11c \ud14c\uc2a4\ud2b8\ud588\uc2b5\ub2c8\ub2e4.<br>The testing was conducted by creating an account on a Mastodon server.<\/p>\n\n\n\n<p>\u2714\ufe0f \ub77c\uc6b0\ud2b8 \/ route<\/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=\"F4x7xLCcMV\"><a href=\"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/08\/27\/nextjs-sns-server-14\/\">[nextjs]SNS Server-14(myapp24)<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;[nextjs]SNS Server-14(myapp24)&#8221; &#8212; freelifemakers.org\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/08\/27\/nextjs-sns-server-14\/embed\/#?secret=cdHnKfv90d#?secret=F4x7xLCcMV\" data-secret=\"F4x7xLCcMV\" width=\"560\" height=\"315\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>\u2714\ufe0f \ub9c8\uc2a4\ud1a0\ub3c8 \uacc4\uc815 \uc8fc\uc18c<\/p>\n\n\n\n<p><a href=\"https:\/\/mastodon.social\/@freelifemakers\">https:\/\/mastodon.social\/@freelifemakers<\/a><\/p>\n\n\n\n<p>\u2714\ufe0f pinafore<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"575\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-pinafore-jpg.jpg\" alt=\"\" class=\"wp-image-9206\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-pinafore-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-pinafore-jpg-300x216.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-pinafore-jpg-768x552.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-pinafore-jpg-400x288.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">likes<\/figcaption><\/figure>\n\n\n\n<p>\u2714\ufe0f mastodon<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"844\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-mastodon-boost-likes-jpg.jpg\" alt=\"\" class=\"wp-image-9207\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-mastodon-boost-likes-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-mastodon-boost-likes-jpg-284x300.jpg 284w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-mastodon-boost-likes-jpg-768x810.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-mastodon-boost-likes-jpg-400x422.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Mastodon<\/figcaption><\/figure>\n\n\n\n<p>\u2714\ufe0f aloy-horizon.duckdns.org<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"963\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-aloy-boost-likes-jpg.jpg\" alt=\"\" class=\"wp-image-9209\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-aloy-boost-likes-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-aloy-boost-likes-jpg-249x300.jpg 249w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-aloy-boost-likes-jpg-768x924.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-aloy-boost-likes-jpg-400x482.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">@user1@aloy-horizon.duckdns.org<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"866\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-aloy-boost-likes2-jpg.jpg\" alt=\"\" class=\"wp-image-9210\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-aloy-boost-likes2-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-aloy-boost-likes2-jpg-277x300.jpg 277w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-aloy-boost-likes2-jpg-768x831.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp29-aloy-boost-likes2-jpg-400x433.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">@user1@aloy-horizon.duckdns.org<\/figcaption><\/figure>\n\n\n\n<p><\/p>\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\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udc49\ud83c\udffb myapp29\uc5d0\ub294 \uc88b\uc544\uc694 \ubc84\ud2bc\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4.Add a &#8220;Like&#8221; button to myapp29. \ud83d\udc49\ud83c\udffb \uae30\uc874\uc758 \ubd80\uc2a4\ud2b8\uc640 \uc88b\uc544\uc694 \ubd80\ubd84\uc758 \ubc84\ud2bc \uc624\ub958\ub85c \ubc84\ud2bc \uc2e4\ud589\uc815\ubcf4\ub97c DB\uac80\uc0c9\uc815\ubcf4\ub97c \ud65c\uc6a9\ud558\ub3c4\ub85d \ubc14\uafe8\uc2b5\ub2c8\ub2e4.To resolve button errors in the existing &#8220;Boost&#8221; and &#8220;Like&#8221; features, I modified the implementation to utilize database search information for button actions. \ud83d\udc49\ud83c\udffb \uc804\uccb4 \ucf54\ub4dc\ub294 \uae43\ud5c8\ube0c\uc5d0\uc11c \ud655\uc778 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.You can find the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28,27,1,7],"tags":[],"class_list":["post-9168","post","type-post","status-publish","format-standard","hentry","category-news","category-nextjs","category-uncategorized","category-website","missing-thumbnail"],"_links":{"self":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/9168","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=9168"}],"version-history":[{"count":41,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/9168\/revisions"}],"predecessor-version":[{"id":9215,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/9168\/revisions\/9215"}],"wp:attachment":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=9168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=9168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=9168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}