{"id":12322,"date":"2025-11-14T11:29:18","date_gmt":"2025-11-14T02:29:18","guid":{"rendered":"https:\/\/sreake.com\/?p=12322"},"modified":"2026-02-10T16:15:08","modified_gmt":"2026-02-10T07:15:08","slug":"layer-based-directory-structure-good-practice-2","status":"publish","type":"post","link":"https:\/\/sreake.com\/en\/blog\/layer-based-directory-structure-good-practice-2\/","title":{"rendered":"Best Practices for Structuring your Projects &#8211; 3. Layer Based Structure"},"content":{"rendered":"\n<p><em>This blog post is a translation of\u00a0<\/em><a href=\"https:\/\/sreake.com\/blog\/layer-based-directory-structure-good-practice\/\">a Japanese article<\/a><em>\u00a0posted on September 26th, 2025.<\/em><\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_75 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/sreake.com\/en\/blog\/layer-based-directory-structure-good-practice-2\/#Introduction\" >Introduction<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/sreake.com\/en\/blog\/layer-based-directory-structure-good-practice-2\/#Structural_Policy\" >Structural Policy<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/sreake.com\/en\/blog\/layer-based-directory-structure-good-practice-2\/#Advantages\" >Advantages<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/sreake.com\/en\/blog\/layer-based-directory-structure-good-practice-2\/#Disadvantages\" >Disadvantages<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/sreake.com\/en\/blog\/layer-based-directory-structure-good-practice-2\/#Criteria_for_Separating_Layers\" >Criteria for Separating Layers<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/sreake.com\/en\/blog\/layer-based-directory-structure-good-practice-2\/#Example_Directory_Structure\" >Example Directory Structure<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/sreake.com\/en\/blog\/layer-based-directory-structure-good-practice-2\/#Frontend\" >Frontend<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/sreake.com\/en\/blog\/layer-based-directory-structure-good-practice-2\/#UI_Assembly_Example\" >UI Assembly Example<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/sreake.com\/en\/blog\/layer-based-directory-structure-good-practice-2\/#Backend\" >Backend<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/sreake.com\/en\/blog\/layer-based-directory-structure-good-practice-2\/#API_Assembly_Example\" >API Assembly Example<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/sreake.com\/en\/blog\/layer-based-directory-structure-good-practice-2\/#Routing_Combination_Example\" >Routing Combination Example<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/sreake.com\/en\/blog\/layer-based-directory-structure-good-practice-2\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Introduction\"><\/span>Introduction<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>In application development, <strong>directory structure is a design element that directly impacts maintainability, scalability, and development efficiency.<\/strong><\/p>\n\n\n\n<p>This article introduces a <strong>simple and intuitive layer-based structure<\/strong> for teams struggling with the following kinds of issues.<\/p>\n\n\n\n<div class=\"wp-block-group has-gray-200-background-color has-background is-vertical is-layout-flex wp-container-core-group-is-layout-8cf370e7 wp-block-group-is-layout-flex\">\n<p>\u26a0\ufe0f <strong>This structure is not the only correct one!<\/strong><\/p>\n\n\n\n<p class=\"has-text-align-left\">This article is just one example of a structural pattern that I have found to be relatively easy to handle, based on my experience in actual projects and team development.<br><strong>Please customize and adapt the structure as appropriate<\/strong> based on your team&#8217;s size, technical level, and the nature of the project.<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Structural_Policy\"><\/span>Structural Policy<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Separate directories by role (layer).<\/strong><\/li><li>Clearly separate the responsibilities of each layer (e.g., <code>controllers\/<\/code>, <code>services\/<\/code>, <code>models\/<\/code>)<\/li><li><strong>Ensure readability and flexibility by building the business logic flow hierarchically.<\/strong><\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Advantages\"><\/span>Advantages<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Simple and intuitive:<\/strong> It&#8217;s easy for new participants to learn because each layer is clearly separated.<\/li><li><strong>Easy to separate code by responsibility:<\/strong> the dependencies between modules are organized, making it easy to limit the scope of impact when making changes.<\/li><li><strong>Well-suited for small to medium-sized projects:<\/strong> for simple projects, a layer-based structure is easy to manage.<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Disadvantages\"><\/span>Disadvantages<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Folder structure can easily become bloated in large-scale projects: a<\/strong>s features increase, managing each layer becomes complicated.<\/li><li><strong>Dependencies between features can become complex:<\/strong> If processes that cross multiple layers increase, the scope of impact during changes can widen.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Criteria_for_Separating_Layers\"><\/span>Criteria for Separating Layers<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>&#8220;How to separate layers&#8221; significantly impacts the overall clarity and maintainability of the structure. Let\u2019s design based on criteria like the following:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><strong>Classification Criterion<\/strong><\/th><th><strong>Details<\/strong><\/th><\/tr><\/thead><tbody><tr><td><strong>Clarity of Responsibility<\/strong><\/td><td>Separate different concerns, such as display, state manipulation, business logic, and data access.<\/td><\/tr><tr><td><strong>Difference in Change Frequency<\/strong><\/td><td>Separate layers like <code>components\/<\/code> (frequent UI changes) and <code>usecases\/<\/code> (logic-centric, stable) to limit the scope of impact.<\/td><\/tr><tr><td><strong>Reusability<\/strong><\/td><td>Make processes that are easy to share (hooks, utils, middleware, etc.) independent layers.<\/td><\/tr><tr><td><strong>Testing Units<\/strong><\/td><td>Carve out layers at a granularity that is easy to unit test (usecase, repository, etc.).<\/td><\/tr><tr><td><strong>Development Setup \/ Skill Separation<\/strong><\/td><td>Also effective when dividing work between UI-centric development and domain-logic-centric development.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div class=\"wp-block-group has-gray-100-background-color has-background is-vertical is-layout-flex wp-container-core-group-is-layout-8cf370e7 wp-block-group-is-layout-flex\">\n<p>\ud83d\udca1 The basic goal is to hierarchically separate UI, logic, and data retrieval.<\/p>\n\n\n\n<p class=\"has-text-align-left\">For parts where it&#8217;s difficult to draw a clear boundary, tightly couple them first and then gradually separate them as the scale or responsibility increases.<\/p>\n\n\n\n<p class=\"has-text-align-left\">For example, you might start by writing the UI, logic, and data retrieval code in <code>pages\/user.tsx<\/code>. Later, you could create <code>components\/UserList.tsx<\/code> to separate the user list UI, and then create <code>repository\/userRepository.ts<\/code> and write the data retrieval processing there.<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Example_Directory_Structure\"><\/span>Example Directory Structure<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Frontend\"><\/span>Frontend<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code code-block\"><code>src\/\n\u251c\u2500\u2500 core\/               \/\/ Core foundation for the entire app\n\u251c\u2500\u2500 pages\/              \/\/ Page-level composition (UI)\n\u2502   \u251c\u2500\u2500 dashboard.tsx\n\u2502   \u2514\u2500\u2500 user.tsx\n\u251c\u2500\u2500 components\/         \/\/ UI parts (uses usecases and hooks)\n\u2502   \u251c\u2500\u2500 UserList.tsx\n\u2502   \u2514\u2500\u2500 DashboardCard.tsx\n\u251c\u2500\u2500 hooks\/              \/\/ State manipulation, side-effect abstraction\n\u2502   \u251c\u2500\u2500 useUser.ts\n\u2502   \u2514\u2500\u2500 useProduct.ts\n\u251c\u2500\u2500 usecases\/           \/\/ Application logic\n\u2502   \u251c\u2500\u2500 userUsecase.ts\n\u2502   \u2514\u2500\u2500 productUsecase.ts\n\u251c\u2500\u2500 repository\/         \/\/ Data retrieval processing (API access, etc.)\n\u2502   \u251c\u2500\u2500 userRepository.ts\n\u2502   \u2514\u2500\u2500 productRepository.ts\n\u251c\u2500\u2500 store\/              \/\/ State management like Zustand or Redux\n\u2502   \u2514\u2500\u2500 userStore.ts\n\u251c\u2500\u2500 utils\/              \/\/ General-purpose functions\n\u2502   \u2514\u2500\u2500 format.ts\n\u2514\u2500\u2500 tsconfig.json<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Place all UI components in <code>components\/<\/code>, which <strong>handle the responsibility of display only<\/strong>.<\/li><li>Separate state manipulation and side-effect logic into <code>hooks\/<\/code> to <strong>decouple them from the UI and increase reusability<\/strong>.<\/li><li>Consolidate application operation units (use cases) in <code>usecases\/<\/code>, and <strong>handle the UI-specific combinations in <code>pages\/<\/code><\/strong>.<\/li><\/ul>\n\n\n\n<div class=\"wp-block-group has-gray-200-background-color has-background is-vertical is-content-justification-left is-layout-flex wp-container-core-group-is-layout-adc7e0b5 wp-block-group-is-layout-flex\">\n<p>\ud83d\udca1 <strong>Key Design Points<\/strong><\/p>\n\n\n\n<p class=\"has-text-align-left\">\u2192 By <strong>clearly separating single responsibilities<\/strong> for each layer, each layer becomes easier to change and test.<br>\u2192 In <code>pages\/<\/code>, construct the UI by <strong>freely combining hooks, usecases, and components<\/strong>.<br>\u2192 It&#8217;s easier to maintain loose coupling if you <strong>call state management and data retrieval processes together via a usecase<\/strong>.<br>\u2192 <code>core\/<\/code> handles <strong>app-wide initialization, configuration, and common API client processing<\/strong>.<\/p>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"UI_Assembly_Example\"><\/span>UI Assembly Example<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code code-block\"><code>\/\/ pages\/user.tsx\nimport { UserList } from '@\/components\/UserList';\nimport { useUser } from '@\/hooks\/useUser';\n\nexport const UserPage = () =&gt; {\n  const { users } = useUser();\n  return &lt;UserList users={users} \/&gt;;\n};\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code code-block\"><code>\/\/ pages\/dashboard.tsx\nimport { UserCard } from '@\/components\/UserCard';\nimport { ProductCard } from '@\/components\/ProductCard';\nimport { useUser } from '@\/hooks\/useUser';\nimport { useProduct } from '@\/hooks\/useProduct';\n\nexport const Dashboard = () => {\n  const { currentUser } = useUser();\n  const { featuredProduct } = useProduct();\n\n  return (\n    &lt;>\n      &lt;UserCard name={currentUser.name} \/>\n      &lt;ProductCard product={featuredProduct} \/>\n    &lt;\/>\n  );\n};<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Backend\"><\/span>Backend<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code code-block\"><code>src\/\n\u251c\u2500\u2500 routers\/              \/\/ Routing definitions per endpoint\n\u2502   \u251c\u2500\u2500 user\/route.ts\n\u2502   \u2514\u2500\u2500 dashboard\/route.ts\n\u251c\u2500\u2500 usecases\/             \/\/ Application logic\n\u2502   \u251c\u2500\u2500 userUsecase.ts\n\u2502   \u251c\u2500\u2500 orderUsecase.ts\n\u2502   \u2514\u2500\u2500 productUsecase.ts\n\u251c\u2500\u2500 repository\/           \/\/ Connection to DB or external APIs\n\u2502   \u251c\u2500\u2500 userRepository.ts\n\u2502   \u251c\u2500\u2500 orderRepository.ts\n\u2502   \u2514\u2500\u2500 productRepository.ts\n\u251c\u2500\u2500 middleware\/           \/\/ Common processing (e.g., auth, errorHandler)\n\u2502   \u2514\u2500\u2500 errorHandler.ts\n\u251c\u2500\u2500 types\/                \/\/ Common type definitions\n\u2502   \u2514\u2500\u2500 user.ts\n\u251c\u2500\u2500 utils\/                \/\/ Common functions\n\u2502   \u2514\u2500\u2500 logger.ts\n\u2514\u2500\u2500 tsconfig.json<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Place each endpoint in <code>routers\/<\/code>, which is <strong>responsible for handling HTTP requests\/responses<\/strong>.<\/li><li>Implement application operation units (use cases) in <code>usecases\/<\/code>, with a <strong>structure where they are called from the router<\/strong>.<\/li><li>Consolidate persistence processing and interaction with external APIs in <code>repository\/<\/code> to <strong>separate them from domain logic<\/strong>.<\/li><li>Define common error handling and authentication in <code>middleware\/<\/code> to <strong>ensure separation of concerns and reusability<\/strong>.<\/li><\/ul>\n\n\n\n<div class=\"wp-block-group has-gray-200-background-color has-background is-vertical is-content-justification-left is-layout-flex wp-container-core-group-is-layout-adc7e0b5 wp-block-group-is-layout-flex\">\n<p>\ud83d\udca1 <strong>Key Design Points<\/strong><\/p>\n\n\n\n<p class=\"has-text-align-left\">\u2192 Structure each layer to have clear responsibilities and a clear dependency direction (top-down).<br>\u2192 Consolidate endpoint processing in <code>routes\/*\/route.ts<\/code>.<br>\u2192 Design flexibly by combining return values so that the <strong>response structure can be configured freely<\/strong>.<br>\u2192 Explicitly mount all routes in <code>main.ts<\/code> to centrally manage the app&#8217;s starting point.<\/p>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"API_Assembly_Example\"><\/span>API Assembly Example<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code code-block\"><code>\/\/ routers\/user\/route.ts\nimport { Router } from 'express';\nimport { getUserById } from '@\/usecases\/userUsecase';\n\nconst router = Router();\n\nrouter.get('\/:userId', async (req, res) => {\n  const user = await getUserById(req.params.userId);\n  res.json(user);\n});\n\nexport default router;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code code-block\"><code>\/\/ routers\/dashboard\/route.ts\nimport { Router } from 'express';\nimport { getUserById } from '@\/usecases\/userUsecase';\nimport { getOrdersByUserId } from '@\/usecases\/orderUsecase';\nimport { getProductsByIds } from '@\/usecases\/productUsecase';\n\nconst router = Router();\n\nrouter.get('\/:userId', async (req, res) => {\n  const userId = req.params.userId;\n\n  const user = await getUserById(userId);\n  const orders = await getOrdersByUserId(userId);\n  const productIds = orders.flatMap((o) => o.productIds);\n  const products = await getProductsByIds(productIds);\n\n  res.json({\n    user: {\n      name: user.name,\n      email: user.email,\n    },\n    orderSummary: {\n      count: orders.length,\n      products,\n    },\n  });\n});\n\nexport default router;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Routing_Combination_Example\"><\/span>Routing Combination Example<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code code-block\"><code>\/\/ main.ts\nimport express from 'express';\nimport dashboardRoute from '.\/routes\/dashboard\/route';\nimport userRoute from '.\/routes\/user\/route';\n\nconst app = express();\napp.use(express.json());\n\napp.use('\/api\/dashboard', dashboardRoute);\napp.use('\/api\/users', userRoute);\n\napp.listen(3000, () => {\n  console.log('Server is running on &lt;http:\/\/localhost:3000>');\n});<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>This structure is a good fit for the following development styles:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Small teams or development setups that include less experienced members.<\/li><li>Projects with complex domains where readability and organization of logic are important.<\/li><li>An approach where you start small and add features incrementally.<\/li><\/ul>\n\n\n\n<div class=\"wp-block-group has-gray-200-background-color has-background is-vertical is-layout-flex wp-container-core-group-is-layout-8cf370e7 wp-block-group-is-layout-flex\">\n<p>A structure isn&#8217;t something you decide on once and are done with; it&#8217;s something you keep iterating on.<\/p>\n\n\n\n<p>You should continue reviewing your structure as the team grows and the project changes.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Hello from the Sreake team! Learn what a layer-based directory structure is, and how you can use it in your very own project.<\/p>\n","protected":false},"author":45,"featured_media":12324,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_locale":"en_US","_original_post":"https:\/\/sreake.com\/?p=11871","footnotes":""},"categories":[17],"tags":[23],"class_list":["post-12322","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-enginner-blog","en-US"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/posts\/12322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/users\/45"}],"replies":[{"embeddable":true,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/comments?post=12322"}],"version-history":[{"count":1,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/posts\/12322\/revisions"}],"predecessor-version":[{"id":13505,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/posts\/12322\/revisions\/13505"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/media\/12324"}],"wp:attachment":[{"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/media?parent=12322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/categories?post=12322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/tags?post=12322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}