{"id":11435,"date":"2026-10-02T13:39:57","date_gmt":"2026-10-02T04:39:57","guid":{"rendered":"https:\/\/www.freelifemakers.org\/wordpress\/?p=11435"},"modified":"2026-10-02T14:34:48","modified_gmt":"2026-10-02T05:34:48","slug":"nextjssns-server-44myapp54","status":"publish","type":"post","link":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/10\/02\/nextjssns-server-44myapp54\/","title":{"rendered":"[nextjs]SNS Server-44(myapp54)\u00a0"},"content":{"rendered":"\n<p>\ud83d\udc49\ud83c\udffb myapp44\uc5d0\uc11c\ub294 \ud0c0\uc784\ub77c\uc778 \ubd80\ubd84\uc744 \ub2e4\ub978 \ud30c\uc77c\ub85c \ubd84\ub9ac\ud569\ub2c8\ub2e4.<br>In myapp44, the timeline section is separated into a different file.<\/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\" style=\"font-size:14px\"><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(deprecated)\n\u2502   \u251c\u2500\u2500 api\/timeline\/route.ts  -&gt; Timeline API\n\u2502   \u251c\u2500\u2500 api\/followinglist\/route.ts  -&gt; followinglist API\n\u2502   \u251c\u2500\u2500 api\/followerslist\/route.ts  -&gt; followerslist 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 api\/v1\/media\/route.ts -&gt; Image upload\n\u2502   \u251c\u2500\u2500 api\/v1\/media\/&#91;id]\/route.ts  -&gt; Image Delete \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 api\/v1\/accounts\/&#91;id]\/followers\/route.ts -&gt; followers\n\u2502   \u251c\u2500\u2500 api\/v1\/accounts\/&#91;id]\/following\/route.ts -&gt; following\n\u2502   \u251c\u2500\u2500 api\/v1\/statuses\/&#91;id]\/route.ts -&gt; -&gt; Post delete(pinafore)\n\u2502   \u251c\u2500\u2500 api\/auth\/signup\/route.ts        -&gt; Signup\n\u2502   \u251c\u2500\u2500 api\/auth\/login\/route.ts         -&gt; Login\n\u2502   \u251c\u2500\u2500<strong> <\/strong>api\/auth\/logout\/route.ts        -&gt; Logout\n\u2502   \u251c\u2500\u2500<strong> <\/strong>api\/auth\/refresh\/route.ts       -&gt; Refresh Token\n\u2502   \u251c\u2500\u2500<strong> <\/strong>api\/cleanup-orphan\/route.ts     -&gt; post,outbox clean up\n\u2502   \u251c\u2500\u2500<strong> <\/strong>api\/auth\/me\/route.tsx           -&gt; Login Check<strong>\n<\/strong>\u2502   \u251c\u2500\u2500 auth\/signup\/page.tsx            -&gt; Signup UI\n\u2502   \u251c\u2500\u2500 auth\/signup\/page.tsx            -&gt; Login UI\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(Server, 404)\n\u2502   \u2502   \u251c\u2500\u2500 ClientPage.tsx.        -&gt; Timeline UI(Client,Call Active Themes)\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 pinafore\/FollowersList.tsx -&gt; Theme 1, FollowersList\n\u2502   \u2502       \u251c\u2500\u2500 pinafore\/FollowingList.tsx -&gt; Theme 1, FollowingList\n\u2502   \u2502       \u251c\u2500\u2500 pinafore\/NotificationsList.tsx -&gt; Theme 1, NotificationsList\n\u2502   \u2502       \u251c\u2500\u2500 <strong>pinafore\/TimelineList.tsx  -&gt; Theme 1, TimelineList<\/strong>\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   \u251c\u2500\u2500 visibility.ts          -&gt; Visibility(Public,Unlisted,Private,Direct)\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=\"Ttbxd21jUa\"><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=tekBPNtIyw#?secret=Ttbxd21jUa\" data-secret=\"Ttbxd21jUa\" 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 \ubc84\uadf8\uc218\uc815 \/ Bug fix<\/p>\n\n\n\n<p>&#8212; \uc774\uc804 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \ucee4\uba58\ud2b8 \ucc98\ub9ac\uc2dc application\/json\uae4c\uc9c0 \ucf54\uba58\ud2b8\ucc98\ub9ac \ub41c\ubd80\ubd84 \ucf54\uba58\ud2b8 \ucc98\ub9ac\ud574\uc81c<br>Uncomment the part up to application\/json that was commented out in the previous project<\/p>\n\n\n\n<p>&#8212; app\/usersui\/[username]\/_components\/themes\/pinafore\/PinaforeTheme.tsx<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:14px\"><code>const handlePost = async () =&gt; {\n  ... ...\n    const res = await fetch('\/api\/v1\/statuses', {\n      method: 'POST',\n      \/\/ headers: {\n      \/\/   'Content-Type': 'application\/json',\n      \/\/    ...(token? { Authorization: `Bearer ${token}` } : {})\n      \/\/ },\n<strong>      headers: {\n        'Content-Type': 'application\/json' \/\/ \u2705 myapp54 edit: add Content-Type header for JSON\n      },<\/strong>\n      credentials: 'include',\n      body: JSON.stringify({ \n        status: composeText, \n        visibility: composeVis, \n        media_ids: mediaIds \/\/ \u2705 myapp51 - add media_ids\n      })\n    });\n... ...\n  \n};<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\ud83d\udcc1 \ud14c\ub9c8 \ud30c\uc77c \ubd84\ub9ac \/ Separating theme files<\/p>\n\n\n\n<p>&#8212; \uae30\uc874\uc758 PinaforeTheme.tsx\ud30c\uc77c\uc758 \ucf54\ub4dc\ub77c\uc778\uc774 \ub108\ubb34\uae38\uc5b4\uc11c \ucf54\ub4dc\ub97c \ubd84\ub9ac\ud568.<br>Split the code because the lines in the existing <code>PinaforeTheme.tsx<\/code> file were too long.<\/p>\n\n\n\n<p>&#8212; app\/usersui\/[username]\/_components\/themes\/pinafore\/PinaforeTheme.tsx <\/p>\n\n\n\n<p>1)\ucf54\ub4dc \uc218\uc815 \/ Code Modification<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:14px\"><code>          {view === 'timeline' &amp;&amp; (\n            &lt;TimelineList\n              timeline={timeline}\n              currentUser={currentUser}\n              onDelete={handleDelete}\n              onBoost={handleBoostClick}\n              onLike={handleLikeClick}\n              onShare={onShare}\n            \/&gt;\n          )}<\/code><\/pre>\n\n\n\n<p>&#8212; app\/usersui\/[username]\/_components\/themes\/pinafore\/TimelineList.tsx<\/p>\n\n\n\n<p>1) \ud30c\uc77c \uc0dd\uc131 \/ Create file<\/p>\n\n\n\n<p>A.\uc774 \ubd80\ubd84\uc740 \uae30\uc874\uc758 \ud0c0\uc784\ub77c\uc778\uc5d0\uc11c \ubd84\ub9ac\ub41c \ucf54\ub4dc\uc785\ub2c8\ub2e4.<br>This part is code that has been separated from the existing timeline.<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:14px\"><code>\/\/ app\/usersui\/&#91;username]\/_components\/themes\/pinafore\/TimelineList.tsx\n\/\/ \u2705 myapp54 - \ud0c0\uc784\ub77c\uc778 \ubd84\ub9ac\n'use client';\n\nconst DOMAIN = process.env.DOMAIN || 'aloy-horizon.duckdns.org';\n\nconst toAbsolute = (u: string) =&gt; {\n  if (!u) return '';\n  return u.startsWith('http') ? u : `https:\/\/${DOMAIN}${u}`;\n};\n\nfunction Avatar({ actor, username, size = 46 }: { actor: string, username: string, size?: number }) {\n  const seed = actor?.startsWith('https:\/\/')\n    ? (() =&gt; { try { return new URL(actor).pathname.split('\/').pop() || username } catch { return username } })()\n    : actor || username;\n  const initial = (seed?.&#91;0] || 'U').toUpperCase();\n  return (\n    &lt;div style={{\n      width: size, height: size, borderRadius: '50%',\n      background: '#6364ff', color: 'white',\n      display: 'flex', alignItems: 'center', justifyContent: 'center',\n      fontWeight: 'bold', fontSize: size * 0.4, flexShrink: 0\n    }}&gt;{initial}&lt;\/div&gt;\n  );\n}\n\nfunction getDisplayName(actorOrUsername: string) {\n  if (!actorOrUsername) return 'unknown';\n  if (actorOrUsername.startsWith('https:\/\/')) {\n    try {\n      const url = new URL(actorOrUsername);\n      const username = url.pathname.split('\/').pop() || 'user';\n      return `${username}@${url.hostname}`;\n    } catch { return actorOrUsername.split('\/').pop() || actorOrUsername; }\n  }\n  return actorOrUsername;\n}\n\ntype Props = {\n  timeline: any&#91;];\n  currentUser: string | null;\n  onDelete: (id: string) =&gt; void;\n  onBoost: (p: any) =&gt; void;\n  onLike: (p: any) =&gt; void;\n  onShare: (p: any) =&gt; void;\n};\n\nexport default function TimelineList({ timeline, currentUser, onDelete, onBoost, onLike, onShare }: Props) {\n  if (timeline.length === 0) {\n    return &lt;div style={{ padding: 20, color: '#999' }}&gt;\ud0c0\uc784\ub77c\uc778\uc774 \ube44\uc5b4\uc788\uc2b5\ub2c8\ub2e4 \/ No posts&lt;\/div&gt;;\n  }\n\n  return (\n    &lt;&gt;\n      {timeline.map((p: any) =&gt; (\n        &lt;article key={`${p.source}-${p.id}`} className=\"pinafore-status\"&gt;\n          &lt;Avatar actor={p.actor} username={p.username} \/&gt;\n          &lt;div className=\"status-content\"&gt;\n            &lt;div className=\"status-header\"&gt;\n              &lt;b&gt;{getDisplayName(p.actor)}&lt;\/b&gt;\n              &lt;span className=\"status-time\"&gt;{new Date(p.created_at).toLocaleString()}&lt;\/span&gt;\n              {p.isBoostedPost &amp;&amp; &lt;span className=\"boost-label\"&gt;\ud83d\udd01 {getDisplayName(p.actor)}&lt;\/span&gt;}\n              {currentUser &amp;&amp; p.isMine &amp;&amp; (\n                &lt;button onClick={() =&gt; onDelete(p.id)} style={{ color: '#e0245e', marginLeft: 'auto' }}&gt;\n                  \ud83d\uddd1 Delete\n                &lt;\/button&gt;\n              )}\n            &lt;\/div&gt;\n            &lt;div className=\"status-text\" dangerouslySetInnerHTML={{ __html: p.content }} \/&gt;\n            {p.media_attachments &amp;&amp; p.media_attachments.length &gt; 0 &amp;&amp; (\n              &lt;div className={`status-media ${p.media_attachments.length === 1 ? 'single' : ''}`}&gt;\n                {p.media_attachments.map((m: any) =&gt; (\n                  &lt;img key={m.id} src={toAbsolute(m.preview_url || m.url)} alt=\"media\" loading=\"lazy\" \/&gt;\n                ))}\n              &lt;\/div&gt;\n            )}\n            &lt;div className=\"status-actions\"&gt;\n              &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;\n              &lt;button onClick={() =&gt; onShare(p)}&gt;\u2708&lt;\/button&gt;\n              &lt;button&gt;\ud83d\udcac&lt;\/button&gt;\n            &lt;\/div&gt;\n          &lt;\/div&gt;\n        &lt;\/article&gt;\n      ))}\n    &lt;\/&gt;\n  );\n}\n<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \ud14c\uc2a4\ud2b8 \/ Test<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"530\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/myapp54-TimelineList-jpg.jpg\" alt=\"\" class=\"wp-image-11461\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/myapp54-TimelineList-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/myapp54-TimelineList-jpg-300x199.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/myapp54-TimelineList-jpg-768x509.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/10\/myapp54-TimelineList-jpg-400x265.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Screenshot<\/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\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udc49\ud83c\udffb myapp44\uc5d0\uc11c\ub294 \ud0c0\uc784\ub77c\uc778 \ubd80\ubd84\uc744 \ub2e4\ub978 \ud30c\uc77c\ub85c \ubd84\ub9ac\ud569\ub2c8\ub2e4.In myapp44, the timeline section is separated into a different file. \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 \/ Overall Project Structure \ud83d\udcc1 \ud504\ub85c\uc81d\ud2b8 \uc2dc\uc791 \/ Project Start \ud83d\udcc1 \ucf54\ub4dc\uc218\uc815 \/ Code Modification \u2714\ufe0f \ubc84\uadf8\uc218\uc815 \/ [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":11461,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28,27,1,7],"tags":[],"class_list":["post-11435","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\/11435","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=11435"}],"version-history":[{"count":18,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/11435\/revisions"}],"predecessor-version":[{"id":11462,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/11435\/revisions\/11462"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media\/11461"}],"wp:attachment":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=11435"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=11435"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=11435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}