{"id":10041,"date":"2026-09-11T06:51:25","date_gmt":"2026-09-10T21:51:25","guid":{"rendered":"https:\/\/www.freelifemakers.org\/wordpress\/?p=10041"},"modified":"2026-09-11T10:31:35","modified_gmt":"2026-09-11T01:31:35","slug":"nextjs-sns-server-28","status":"publish","type":"post","link":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/09\/11\/nextjs-sns-server-28\/","title":{"rendered":"[nextjs]SNS Server-28(myapp38)\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 myapp38\uc5d0\uc11c\ub294 \uc54c\ub9bc \uae30\ub2a5\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4.<br>myapp38 implements a notification feature.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \uc54c\ub9bc \uae30\ub2a5\uc740 pinafore.social\uc744 \uae30\uc900\uc73c\ub85c \ud569\ub2c8\ub2e4.<br>The notification feature is based on pinafore.social.<\/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  -> webfinger\n\u2502   \u251c\u2500\u2500 api\/follow\/route.ts    -> Follow API(temporary)\n\u2502   \u251c\u2500\u2500 api\/announce\/route.ts  -> Boost(Announcement)\n\u2502   \u251c\u2500\u2500 api\/like\/route.ts.     -> Like API\n\u2502   \u251c\u2500\u2500 api\/posts\/route.ts     -> Writing API\n\u2502   \u251c\u2500\u2500 api\/timeline\/route.ts  -> 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 -> auth\n\u2502   \u251c\u2500\u2500 api\/v1\/apps\/route.ts.    -> auth\n\u2502   \u251c\u2500\u2500 api\/v1\/accounts\/verify_credentials\/route.ts -> auth\n\u2502   \u251c\u2500\u2500 api\/v1\/statuses\/route.ts -> 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> -> timeline\n\u2502   \u251c\u2500\u2500 <span style=\"background-color: initial; font-size: inherit; text-align: initial; color: initial;\">oauth\/authorize\/route.ts<\/span> -> auth\n\u2502   \u251c\u2500\u2500 <span style=\"background-color: initial; font-size: inherit; text-align: initial; color: initial;\">oauth\/token\/route.ts<\/span> -> 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> -> 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> -> search\n\u2502   \u251c\u2500\u2500 api\/v1\/accounts\/&#91;id]\/followers\/route.ts -> followers\n\u2502   \u251c\u2500\u2500 api\/v1\/accounts\/&#91;id]\/following\/route.ts -> following\n\u2502   \u251c\u2500\u2500 users\/&#91;username]\/\n\u2502   \u2502   \u251c\u2500\u2500 statuses\/&#91;id]\/route.ts -> Indivisual Post\n\u2502   \u2502   \u251c\u2500\u2500 route.ts               -> Acotr Information\n\u2502   \u2502   \u251c\u2500\u2500 followers\/route.ts     -> Followers List\n\u2502   \u2502   \u251c\u2500\u2500 following\/route.ts     -> Following List\n\u2502   \u2502   \u251c\u2500\u2500 inbox\/route.ts         -> Inbox\n\u2502   \u2502   \u2514\u2500\u2500 outbox\/route.ts        -> outbox\n\u2502   \u251c\u2500\u2500 usersui\/&#91;username]\/\n\u2502   \u2502   \u251c\u2500\u2500 page.tsx               -> Timeline UI\n\u2502   \u2502   \u2514\u2500\u2500 _components\/themes\/\n\u2502   \u2502       \u251c\u2500\u2500 themeex\/ThemeexTheme.tsx   -> Example Theme\n\u2502   \u2502       \u251c\u2500\u2500 pinafore\/PinaforeTheme.tsx -> Theme 1\n\u2502   \u2502       \u251c\u2500\u2500 mastodon\/MastodonTheme.tsx -> Theme 2\n\u2502   \u2502       \u2514\u2500\u2500 minimal\/MinimaltTheme.tsx  -> 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              -> Theme Provider\n\u2502   \u251c\u2500\u2500 watchThemes.ts         -> Check real-time theme changes\n\u2502   \u251c\u2500\u2500 auth.ts                -> Authentication, User Management\n\u2502   \u251c\u2500\u2500 ap.ts                  -> Follow,Undo,Create,Likes,Announce\n\u2502   \u2514\u2500\u2500 db.ts                  -> DB connection\n\u251c\u2500\u2500 data\/\n\u2502   \u251c\u2500\u2500 keys\/userIDs\/          -> private.pem, public.pem(New)\n\u2502   \u2514\u2500\u2500 keys\/                  -> private.pem, public.pem(legacy)\n\u251c\u2500\u2500 data.sqlite                -> Database(1\/3)\n\u251c\u2500\u2500 data.sqlite-wal            -> Database(2\/3)\n\u251c\u2500\u2500 data.sqlite-shm            -> Database(3\/3)\n\u251c\u2500\u2500 Caddyfile                  -> https \n\u251c\u2500\u2500 instrumentation.ts         -> 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=\"HFDVEx51uG\"><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=V2Fw8XxJgk#?secret=HFDVEx51uG\" data-secret=\"HFDVEx51uG\" 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 FOLLOWERS,FOLLOWER \ud14c\uc774\ube14 \uad6c\uc870 \ubcc0\uacbd <\/p>\n\n\n\n<p>\u2714\ufe0f \ud14c\uc774\ube14 \/ Table<\/p>\n\n\n\n<p>&#8212; \ud14c\uc774\ube14\uc740 \uc54c\ub9bc \ud655\uc778\uc2dc \ub0a0\uc9dc\uac00 \uc800\uc7a5\ub418\uc9c0 \uc54a\uc544 \ubb34\uc870\uac74 now\ub85c \ud45c\uc2dc\ub418\uc5b4 followers\ud14c\uc774\ube14 \ud544\ub4dc\uc5d0 \ub0a0\uc9dc\uc785\ub825 \ucd94\uac00<br>The table always displays &#8216;now&#8217; because the date is not saved when a notification is checked, so date input was added to the followers table field.<\/p>\n\n\n\n<p>&#8212; \ud14c\uc774\ube14 \uad6c\uc870\ub97c \uc218\uc815\ud558\uba74 \ud544\ub4dc\uac00 \uae30\uc874 \ud544\ub4dc\ub9c8\uc9c0\ub9c9\uc5d0 \ucd94\uac00\ub418\ubbc0\ub85c \uad00\ub9ac\uc640 \uc77c\uad00\uc131\ubb38\uc81c\ub85c \ud14c\uc774\ube14 \uc0c8\ub85c \uc0dd\uc131<br>Since modifying the table structure adds fields to the end of existing fields, a new table is created due to management and consistency issues.<\/p>\n\n\n\n<p>&#8212; \ud55c\uc904\uc529 \uc2e4\ud589\uc744 \ucd94\ucc9c\ud569\ub2c8\ub2e4. \ud55c\ubc88\uc5d0 \uc2e4\ud589\ud558\uba74 \ub370\uc774\ud130 \uc0ad\uc81c \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br>It is recommended to execute the commands one line at a time. Executing them all at once could result in data loss.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- 1. \ubc31\uc5c5 \/ backup \nCREATE TABLE followers_backup AS SELECT * FROM followers;\nCREATE TABLE following_backup AS SELECT * FROM following;\n\nSELECT * FROM followers_backup LIMIT 2;\nSELECT * FROM following_backup LIMIT 2;\n\n-- 2. \uae30\uc874 \ud14c\uc774\ube14 \uc0ad\uc81c \/ Delete existing table\nDROP TABLE followers;\nDROP TABLE following;\n\n-- 3. \ub3d9\uc77c\ud55c \uc2a4\ud0a4\ub9c8\ub85c \uc0c8\ub85c \uc0dd\uc131 (\ud544\ub4dc\uc21c\uc11c \ub3d9\uc77c\ud558\uac8c \ub9de\ucda4)\n-- Create new with the same schema (matching field order)\nCREATE TABLE followers (\n    id TEXT PRIMARY KEY,\n    actor TEXT NOT NULL,\n    inbox TEXT NOT NULL,\n    username TEXT NOT NULL,\n    created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE following (\n    id TEXT PRIMARY KEY,\n    actor TEXT NOT NULL,\n    inbox TEXT NOT NULL,\n    username TEXT NOT NULL,\n    created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\n-- 4. \uc778\ub371\uc2a4\ub294 \uae30\uc874\uacfc \ub3d9\uc77c\ud568 \/ The index is the same as before.\nCREATE INDEX idx_followers_username ON followers(username);\nCREATE INDEX idx_followers_actor ON followers(actor);\nCREATE INDEX idx_followers_created ON followers(created_at DESC);\nCREATE UNIQUE INDEX idx_followers_actor_username ON followers(actor, username);\n\nCREATE INDEX idx_following_username ON following(username);\nCREATE INDEX idx_following_actor ON following(actor);\nCREATE INDEX idx_following_inbox ON following(inbox);\nCREATE INDEX idx_following_created ON following(created_at DESC);\nCREATE UNIQUE INDEX idx_following_actor_username ON following(actor, username);\n\n-- 5. \ub370\uc774\ud130 \ubcf5\uad6c (inbox \uc5c6\uc73c\uba74! actor + \/inbox\ub85c! \ucd94\uc815!)\n-- Data recovery! (If there's no 'inbox', assume it's 'actor' + '\/inbox'!)\nINSERT INTO followers (id, actor, inbox, username, created_at)\nSELECT \n  id,\n  actor,\n  COALESCE(inbox, actor || '\/inbox'),\n  username,\n  COALESCE(created_at, CURRENT_TIMESTAMP)\nFROM followers_backup;\n\nINSERT INTO following (id, actor, inbox, username, created_at)\nSELECT \n  id,\n  actor,\n  COALESCE(inbox, actor || '\/inbox'),\n  username,\n  COALESCE(created_at, CURRENT_TIMESTAMP)\nFROM following_backup;\n\n-- 6. \ud655\uc778 \/ check\nSELECT * FROM followers;\nSELECT * FROM following;\n.schema followers\n.schema following\n\n-- 7. \ubc31\uc5c5 \ud14c\uc774\ube14 \uc0ad\uc81c(\ud655\uc778 \ud6c4)\n-- Delete backup table (after verification)\nDROP TABLE followers_backup;\nDROP TABLE following_backup;<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \uc778\ub371\uc2a4 \ucd94\uac00 \/ Add Index<\/p>\n\n\n\n<p>&#8212; \ud14c\uc774\ube14 \uad6c\uc870\ubcc0\uacbd\uc73c\ub85c \uc778\ub371\uc2a4\ub3c4 \ub3d9\uc77c\ud558\uac8c \ub9de\ucd94\uae30<br>Adjusting indexes to match table structure changes<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE INDEX IF NOT EXISTS idx_followers_inbox ON followers(inbox);<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \ucf54\ub4dc\uc218\uc815 \/ Code Modification<\/p>\n\n\n\n<p>\u2714\ufe0f \ud14c\uc774\ube14\uc218\uc815\uc73c\ub85c \ucf54\ub4dc \uc218\uc815\ud55c \ubd80\ubd84<br>Parts of the code modified due to table changes<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app\/api\/v1\/accounts\/&#91;id]\/following\/route.ts\napp\/api\/v1\/accounts\/&#91;id]\/followers\/route.ts\napp\/users\/&#91;username]\/inbox\/route.ts\nlib\/db.ts<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \uc54c\ub9bc\uae30\ub2a5 \/ Notification feature<\/p>\n\n\n\n<p>&#8212; app\/api\/v1\/notifications\/route.ts<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u2705 myapp38 - app\/api\/v1\/notifications\/route.ts \n\nimport { NextResponse } from 'next\/server';\nimport db from '@\/lib\/db';\n\nconst DOMAIN = process.env.DOMAIN || 'aloy-horizon.duckdns.org';\n\nfunction parseActor(actor: string, idx: number) { ... }\nfunction makeAccount(parsed: ReturnType&lt;typeof parseActor&gt;, idx: number, createdAt?: string) { ... }\nexport async function GET(req: Request) { ...\n\/\/ 1. Follow \uc54c\ub9bc \/ Follow Notification\ntry { ... } catch(e){ console.error('follow', e); }\n\n\/\/ 2. Like \uc54c\ub9bc \/ Like Notification\ntry { ... } catch(e){ console.error('likes notif', e); }\n\n\/\/ 3. Reblog \uc54c\ub9bc \/ Reblog(boost) Notification\ntry { ... }catch(e){}\n}\n... ...<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \ud14c\uc2a4\ud2b8 \/ Test<\/p>\n\n\n\n<p>\u2714\ufe0f \uc54c\ub9bc \ub77c\uc6b0\ud2b8 \ud130\ubbf8\ub110 \ud14c\uc2a4\ud2b8 \/ Notification Route Terminal Test<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl \"https:\/\/aloy-horizon.duckdns.org\/api\/v1\/notifications?limit=20\"<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># \ud130\ubbf8\ub110 \/ Terminal\n% curl \"https:\/\/aloy-horizon.duckdns.org\/api\/v1\/notifications?limit=20\"\n\n# \uc751\ub2f5 \/ Response\n\n&#91;{\"id\":\"follow_0_https:\/\/mastodon.social\/b7cc4c41-b22a-43b6-9df8-5bb46b2222fd\",\"type\":\"follow\",\"created_at\":\"2026-09-10T23:25:07.353Z\",\"account\":{\"id\":\"notif_acct_mastodon_social_117193449750714993_0\",\"username\":\"117193449750714993\",\"acct\":\"117193449750714993@mastodon.social\",\"display_name\":\"117193449750714993\",\"avatar\":\"https:\/\/aloy-horizon.duckdns.org\/icon.png\", ... ... }]<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \ud314\ub85c\uc6cc \uc54c\ub9bc \/ Followers Notification<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"495\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-follower-jpg.png\" alt=\"\" class=\"wp-image-10089\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-follower-jpg.png 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-follower-jpg-300x186.png 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-follower-jpg-768x475.png 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-follower-jpg-400x248.png 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p>\u2714\ufe0f \ubd80\uc2a4\ud2b8 \uc54c\ub9bc \/ Boost Notification<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"737\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-boosted-jpg.jpg\" alt=\"\" class=\"wp-image-10090\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-boosted-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-boosted-jpg-300x276.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-boosted-jpg-768x708.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-boosted-jpg-400x369.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Boost<\/figcaption><\/figure>\n\n\n\n<p>\u2714\ufe0f \uc88b\uc544\uc694 \uc54c\ub9bc \/ Likes Notification<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"830\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-favorite-jpg.jpg\" alt=\"\" class=\"wp-image-10092\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-favorite-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-favorite-jpg-289x300.jpg 289w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-favorite-jpg-768x797.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/09\/myapp38-favorite-jpg-400x415.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">likes<\/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 myapp38\uc5d0\uc11c\ub294 \uc54c\ub9bc \uae30\ub2a5\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4.myapp38 implements a notification feature. \ud83d\udc49\ud83c\udffb \uc54c\ub9bc \uae30\ub2a5\uc740 pinafore.social\uc744 \uae30\uc900\uc73c\ub85c \ud569\ub2c8\ub2e4.The notification feature is based on pinafore.social. \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 full code on GitHub. https:\/\/github.com\/gideonslife01\/flm-nextjs \ud83d\udcc1 \uc804\uccb4 \ud504\ub85c\uc81d\ud2b8 \uad6c\uc870 \/ [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":10089,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28,27,1,7],"tags":[],"class_list":["post-10041","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\/10041","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=10041"}],"version-history":[{"count":38,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/10041\/revisions"}],"predecessor-version":[{"id":10094,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/10041\/revisions\/10094"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media\/10089"}],"wp:attachment":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=10041"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=10041"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=10041"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}