https://cloud.google.com/apis/design/\u003C/a>\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Microsoft REST API Guidelines\u003C/b>\u003Ca href=https://github.com/microsoft/api-guidelines/blob/vNext/azure/Guidelines.md>https://github.com/microsoft/api-guidelines/blob/vNext/azure/Guidelines.md\u003C/a>\u003C/li>\u003C/ul>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">\u003Ca href=\"/tag/restapi\" target=\"_blank\" rel=\"noopener noreferrer ugc\">#restapi\u003C/a> \u003Ca href=\"/tag/systemdesign\" target=\"_blank\" rel=\"noopener noreferrer ugc\">#systemdesign\u003C/a>\u003C/p>\u003C/div>\u003C/div>",{"time":287,"blocks":288,"version":260},1759999343023,[289,295,299,303,307,311,328,332,335,339,343,348,352,356,381,385,388,392,397,401,405,410,414,418,422,426,430,434,438,442,446,450,454,458,462,466,470,483,487,490,493,496,499,502,505,508,524,526,529,532,536,539,542,545,548,564,567,570,582,585,588,604,607,610,613,616,619,622,642,645,648,651,653,656,659,675,679,682,698,701,704,707,710,713,716,719,722,725,727,730,733,736,739,741,744,747,749,752,756,759,762,765,768,770,773,775,778,794],{"id":290,"type":291,"data":292},"e4a2b1c8d","image",{"caption":35,"withBorder":271,"withBackground":271,"stretched":271,"file":293},{"url":294},"https://media.suddo.io/file/2f3af38f-ffaf-465d-b6b8-b927250a64dc/4b327ca9-1572-4bd5-a7dc-de7ff364483b/1184.webp",{"id":296,"type":38,"data":297},"a9f8e7d6c",{"text":298,"level":41},"A Practical Guide to Designing CRUD APIs",{"id":300,"type":27,"data":301},"b5c4d3e2a",{"text":302},"Every time I created a new endpoint, I'd ask myself: \"How should I name this route?\" It felt like there had to be a set of rules for building consistent APIs. After exploring design diagrams, reading JJ Geewax's \u003Ci>API Design Patterns\u003C/i>, and studying guidelines from major tech companies, I realized a crucial point:",{"id":304,"type":32,"data":305},"f1e2d3c4b",{"quoteText":306,"authorText":35},"API design is a distinct discipline with its own principles and standards.",{"id":308,"type":27,"data":309},"c7b6a5f4e",{"text":310},"Following established design patterns delivers tangible results:",{"id":312,"type":69,"data":313},"d9e8f7a6b",{"style":71,"meta":314,"items":315},{},[316,320,324],{"content":317,"meta":318,"items":319},"\u003Cb>Developer-Friendly APIs:\u003C/b> Uniform patterns and web standards make your API intuitive to use.",{},[],{"content":321,"meta":322,"items":323},"\u003Cb>Reusability:\u003C/b> Both the business logic and the API itself become easier to reuse across projects.",{},[],{"content":325,"meta":326,"items":327},"\u003Cb>Predictability:\u003C/b> The interface remains clear and predictable for external clients and integrations.",{},[],{"id":329,"type":27,"data":330},"a3b2c1d0f",{"text":331},"The main challenge is that while standards exist, they often vary. Many look great on paper but are hard to apply to a simple CRUD application without complex business logic. \u003Cb>This article provides a concise cheat sheet for designing APIs for CRUD services\u003C/b>, showing a deliberate and consistent thought process.",{"id":333,"type":250,"data":334},"e9f8d7c6b",{},{"id":336,"type":38,"data":337},"b1a0f9e8d",{"text":338,"level":62},"Part 1: It All Starts with the Domain",{"id":340,"type":27,"data":341},"c2b1a0f9e",{"text":342},"A well-designed API begins with clearly defined \u003Cb>resources\u003C/b> and their interactions. When your domain model and its operations are clear, the HTTP layer becomes simple and predictable.",{"id":344,"type":291,"data":345},"d3c2b1a0f",{"caption":35,"withBorder":271,"withBackground":271,"stretched":271,"file":346},{"url":347},"https://media.suddo.io/file/2f3af38f-ffaf-465d-b6b8-b927250a64dc/a8449571-c31d-4e69-8dfd-3b720864ba91/1184.webp",{"id":349,"type":38,"data":350},"e4d3c2b1a",{"text":351,"level":41},"The Core Action Vocabulary",{"id":353,"type":27,"data":354},"f5e4d3c2b",{"text":355},"To achieve consistency, rely on five fundamental operations in your business logic:",{"id":357,"type":69,"data":358},"a6f5e4d3c",{"style":71,"meta":359,"items":360},{},[361,365,369,373,377],{"content":362,"meta":363,"items":364},"\u003Cb>GetResource:\u003C/b> Retrieve a specific resource.",{},[],{"content":366,"meta":367,"items":368},"\u003Cb>ListResources:\u003C/b> Retrieve a collection of resources (with filtering, sorting, and pagination).",{},[],{"content":370,"meta":371,"items":372},"\u003Cb>CreateResource:\u003C/b> Create a new resource.",{},[],{"content":374,"meta":375,"items":376},"\u003Cb>UpdateResource:\u003C/b> Modify a resource (partially or fully).",{},[],{"content":378,"meta":379,"items":380},"\u003Cb>DeleteResource:\u003C/b> Remove a resource.",{},[],{"id":382,"type":27,"data":383},"b7a6f5e4d",{"text":384},"Avoid method names like \u003Ccode>GetByOrganization\u003C/code>, \u003Ccode>Insert\u003C/code>, \u003Ccode>Upsert\u003C/code>, \u003Ccode>DeleteAll\u003C/code>, or \u003Ccode>FindOrCreate\u003C/code>. All variability should be handled through \u003Cb>parameters\u003C/b>, not by creating new method names.",{"id":386,"type":250,"data":387},"c8b7a6f5e",{},{"id":389,"type":38,"data":390},"d9c8b7a6f",{"text":391,"level":62},"Part 2: Standard API Methods",{"id":393,"type":291,"data":394},"e0d9c8b7a",{"caption":35,"withBorder":271,"withBackground":271,"stretched":271,"file":395},{"url":396},"https://media.suddo.io/file/2f3af38f-ffaf-465d-b6b8-b927250a64dc/dc815f98-5935-4941-8cae-461534673d1e/1184.webp",{"id":398,"type":38,"data":399},"f1e0d9c8b",{"text":400,"level":41},"The Resource Model",{"id":402,"type":27,"data":403},"a2f1e0d9c",{"text":404},"Here is an example model we'll use:",{"id":406,"type":407,"data":408},"b3a2f1e0d","code",{"code":409},"{\n \"id\": \"guid\",\n \"title\": \"string\",\n \"status\": \"active|archived|draft\"\n}",{"id":411,"type":38,"data":412},"c4b3a2f1e",{"text":413,"level":62},"1. Create a Resource",{"id":415,"type":27,"data":416},"d5c4b3a2f",{"text":417},"\u003Cb>POST \u003C/b>\u003Ccode>\u003Cb>/v1/resources\u003C/b>\u003C/code>\u003Cbr>Request Body:",{"id":419,"type":407,"data":420},"e6d5c4b3a",{"code":421},"{ \"title\": \"New resource\", \"status\": \"draft\" }",{"id":423,"type":27,"data":424},"f7e6d5c4b",{"text":425},"Response: \u003Cb>201 Created\u003C/b> with the newly created resource:",{"id":427,"type":407,"data":428},"a8f7e6d5c",{"code":429},"{ \"id\": \"guid\", \"title\": \"New resource\", \"status\": \"draft\" }",{"id":431,"type":38,"data":432},"b9a8f7e6d",{"text":433,"level":62},"2. Get a Specific Resource",{"id":435,"type":27,"data":436},"c0b9a8f7e",{"text":437},"\u003Cb>GET \u003C/b>\u003Ccode>\u003Cb>/v1/resources/{id}\u003C/b>\u003C/code>\u003Cbr>Response: \u003Cb>200 OK\u003C/b> with the resource, or \u003Cb>404 Not Found\u003C/b>.",{"id":439,"type":38,"data":440},"d1c0b9a8f",{"text":441,"level":62},"3. Get a Collection of Resources",{"id":443,"type":27,"data":444},"e2d1c0b9a",{"text":445},"\u003Cb>GET \u003C/b>\u003Ccode>\u003Cb>/v1/resources\u003C/b>\u003C/code>\u003Cbr>Response: \u003Cb>200 OK\u003C/b>:",{"id":447,"type":407,"data":448},"f3e2d1c0b",{"code":449},"{\n \"resources\": [\n { \"id\": \"guid\", \"title\": \"New resource\", \"status\": \"draft\" }\n ]\n}",{"id":451,"type":27,"data":452},"a4f3e2d1c",{"text":453},"Always return an \u003Cb>object instead of a raw array\u003C/b>. This makes it easier to extend the contract later with metadata or pagination. If no resources are found, return a \u003Cb>200 OK\u003C/b> with an empty collection.",{"id":455,"type":38,"data":456},"b5a4f3e2d",{"text":457,"level":62},"4. Replace a Resource (PUT)",{"id":459,"type":27,"data":460},"c6b5a4f3e",{"text":461},"\u003Cb>PUT \u003C/b>\u003Ccode>\u003Cb>/v1/resources/{id}\u003C/b>\u003C/code>\u003Cbr>The request body must contain the full representation of the resource.",{"id":463,"type":407,"data":464},"d7c6b5a4f",{"code":465},"{ \"title\": \"Updated\", \"status\": \"active\" }",{"id":467,"type":27,"data":468},"e8d7c6b5a",{"text":469},"Response Codes:",{"id":471,"type":69,"data":472},"f9e8d7c6b",{"style":71,"meta":473,"items":474},{},[475,479],{"content":476,"meta":477,"items":478},"\u003Cb>201 Created:\u003C/b> If the resource was created (if you allow client-specified IDs).",{},[],{"content":480,"meta":481,"items":482},"\u003Cb>200 OK:\u003C/b> If the resource existed and was replaced. Return the updated resource.",{},[],{"id":484,"type":27,"data":485},"a0f9e8d7c",{"text":486},"If a field is omitted from the request, it should be reset to its default value.",{"id":336,"type":38,"data":488},{"text":489,"level":62},"5. Partially Update a Resource (PATCH)",{"id":340,"type":27,"data":491},{"text":492},"\u003Cb>PATCH \u003C/b>\u003Ccode>\u003Cb>/v1/resources/{id}\u003C/b>\u003C/code>\u003Cbr>The request body should only contain the fields to be changed:",{"id":344,"type":407,"data":494},{"code":495},"{ \"status\": \"archived\" }",{"id":349,"type":27,"data":497},{"text":498},"Response: \u003Cb>200 OK\u003C/b> with the updated resource, or \u003Cb>404 Not Found\u003C/b>.",{"id":353,"type":38,"data":500},{"text":501,"level":62},"6. Delete a Resource",{"id":357,"type":27,"data":503},{"text":504},"\u003Cb>DELETE \u003C/b>\u003Ccode>\u003Cb>/v1/resources/{id}\u003C/b>\u003C/code>\u003Cbr>Response: \u003Cb>204 No Content\u003C/b> (with an empty body).",{"id":382,"type":38,"data":506},{"text":507,"level":41},"Key Takeaways",{"id":386,"type":69,"data":509},{"style":71,"meta":510,"items":511},{},[512,516,520],{"content":513,"meta":514,"items":515},"Always use \u003Cb>plural nouns\u003C/b> for resource collections in paths (e.g., \u003Ccode>/resources\u003C/code>).",{},[],{"content":517,"meta":518,"items":519},"For standard operations, the resource ID should \u003Cb>only be in the path\u003C/b> (e.g., \u003Ccode>/resources/{id}\u003C/code>).",{},[],{"content":521,"meta":522,"items":523},"Return the \u003Cb>full resource\u003C/b> on POST, PUT, and PATCH requests to simplify debugging and testing.",{},[],{"id":389,"type":250,"data":525},{},{"id":393,"type":38,"data":527},{"text":528,"level":62},"Part 3: Extending Standard Methods",{"id":398,"type":27,"data":530},{"text":531},"Now, let's enhance our basic operations without creating a messy explosion of new endpoints.",{"id":402,"type":291,"data":533},{"caption":35,"withBorder":271,"withBackground":271,"stretched":271,"file":534},{"url":535},"https://media.suddo.io/file/2f3af38f-ffaf-465d-b6b8-b927250a64dc/5ffa948b-bd53-41f7-b528-3cc78843a8da/1184.webp",{"id":406,"type":38,"data":537},{"text":538,"level":41},"Pagination",{"id":411,"type":27,"data":540},{"text":541},"The simplest and most common method is \u003Cb>offset-based pagination\u003C/b> using \u003Ccode>skip\u003C/code> and \u003Ccode>take\u003C/code> parameters (or \u003Ccode>offset\u003C/code> and \u003Ccode>limit\u003C/code>).",{"id":415,"type":27,"data":543},{"text":544},"\u003Cb>GET\u003C/b> \u003Ccode>/v1/resources?skip=20&take=10\u003C/code> — Skips the first 20 resources and retrieves the next 10.\u003Cbr>Response:",{"id":419,"type":407,"data":546},{"code":547},"{\n \"resources\": [\n { \"id\": \"guid\", \"title\": \"...\" }\n ],\n \"total\": 350\n}",{"id":423,"type":69,"data":549},{"style":71,"meta":550,"items":551},{},[552,556,560],{"content":553,"meta":554,"items":555},"Including \u003Ccode>total\u003C/code> in the response helps the client understand if there are more pages to fetch.",{},[],{"content":557,"meta":558,"items":559},"Always sort results by a default key (like creation date) to ensure \u003Cb>deterministic\u003C/b> responses.",{},[],{"content":561,"meta":562,"items":563},"Set a hard \u003Cb>maximum limit\u003C/b> for the \u003Ccode>take\u003C/code> parameter to prevent performance issues.",{},[],{"id":427,"type":38,"data":565},{"text":566,"level":41},"Filtering",{"id":431,"type":27,"data":568},{"text":569},"The most straightforward approach is to use \u003Cb>explicit query parameters\u003C/b> for each filter. Use operator suffixes for more complex queries:",{"id":435,"type":69,"data":571},{"style":71,"meta":572,"items":573},{},[574,578],{"content":575,"meta":576,"items":577},"\u003Ccode>_eq\u003C/code> (default, can be omitted), \u003Ccode>_ne\u003C/code>, \u003Ccode>_lt\u003C/code>, \u003Ccode>_gt\u003C/code>, \u003Ccode>_lte\u003C/code>, \u003Ccode>_gte\u003C/code>",{},[],{"content":579,"meta":580,"items":581},"\u003Ccode>_in\u003C/code>, \u003Ccode>_nin\u003C/code> for multiple values",{},[],{"id":439,"type":27,"data":583},{"text":584},"Examples:",{"id":443,"type":407,"data":586},{"code":587},"GET /v1/resources?status_in=active,draft\nGET /v1/resources?title_eq=Design\nGET /v1/resources?meta_created_at_gte=2023-01-01",{"id":447,"type":69,"data":589},{"style":71,"meta":590,"items":591},{},[592,596,600],{"content":593,"meta":594,"items":595},"For complex filtering (e.g., on nested arrays), consider a dedicated search endpoint that accepts a \u003Cb>POST\u003C/b> request with a body.",{},[],{"content":597,"meta":598,"items":599},"\u003Cb>Ignore\u003C/b> unknown query parameters by default.",{},[],{"content":601,"meta":602,"items":603},"Use a dedicated \u003Ccode>search\u003C/code> parameter for full-text search.",{},[],{"id":451,"type":38,"data":605},{"text":606,"level":41},"Sorting",{"id":455,"type":27,"data":608},{"text":609},"Similar to filtering, use explicit parameters like \u003Ccode>created_at_sort=asc|desc\u003C/code>. If the parameter is absent, the field is not used for sorting.",{"id":459,"type":407,"data":611},{"code":612},"GET /v1/resources?created_at_sort=asc\nGET /v1/resources?created_at_sort=asc&title_sort=desc",{"id":463,"type":32,"data":614},{"quoteText":615,"authorText":35},"Using generic `orderby` or `filter` parameters often leads to parsing headaches and tightly couples the API to the internal data model. Explicit parameters make the contract clearer and simplify implementation.",{"id":467,"type":38,"data":617},{"text":618,"level":41},"Soft Delete",{"id":471,"type":27,"data":620},{"text":621},"Instead of permanently deleting data, mark it as deleted. Add a nullable \u003Ccode>deleted_at\u003C/code> field to your model.",{"id":484,"type":69,"data":623},{"style":71,"meta":624,"items":625},{},[626,630,634,638],{"content":627,"meta":628,"items":629},"\u003Cb>Archive:\u003C/b> \u003Ccode>DELETE /v1/resources/{id}\u003C/code> returns \u003Cb>204\u003C/b> and sets the \u003Ccode>deleted_at\u003C/code> timestamp.",{},[],{"content":631,"meta":632,"items":633},"\u003Cb>Restore:\u003C/b> \u003Ccode>PATCH /v1/resources/{id}/restore\u003C/code> returns \u003Cb>200\u003C/b>, sets \u003Ccode>deleted_at\u003C/code> to \u003Ccode>null\u003C/code>, and returns the resource.",{},[],{"content":635,"meta":636,"items":637},"\u003Cb>List with deleted:\u003C/b> \u003Ccode>GET /v1/resources?include_deleted=true\u003C/code>.",{},[],{"content":639,"meta":640,"items":641},"\u003Cb>Permanently delete:\u003C/b> \u003Ccode>DELETE /v1/resources/{id}?force=true\u003C/code> returns \u003Cb>204\u003C/b>.",{},[],{"id":336,"type":38,"data":643},{"text":644,"level":41},"Putting It All Together",{"id":340,"type":27,"data":646},{"text":647},"Here's a request combining pagination, filtering, and sorting:",{"id":344,"type":407,"data":649},{"code":650},"GET /v1/resources?skip=10&take=5&status_in=active,draft&created_at_sort=desc&include_deleted=false",{"id":349,"type":250,"data":652},{},{"id":353,"type":38,"data":654},{"text":655,"level":62},"Part 4: Custom Methods and Batch Operations",{"id":357,"type":27,"data":657},{"text":658},"Standard GET, POST, PUT, PATCH, and DELETE methods cover about 80% of CRUD needs. The remaining 20% involve custom domain actions that:",{"id":382,"type":69,"data":660},{"style":71,"meta":661,"items":662},{},[663,667,671],{"content":664,"meta":665,"items":666},"Change a resource's state in a way that isn't a simple update (e.g., \"approve\", \"cancel\", \"apply discount\").",{},[],{"content":668,"meta":669,"items":670},"Trigger a calculation (e.g., \"calculate shipping rate\").",{},[],{"content":672,"meta":673,"items":674},"Have side effects without creating a resource directly (e.g., \"view resource\").",{},[],{"id":386,"type":291,"data":676},{"caption":35,"withBorder":271,"withBackground":271,"stretched":271,"file":677},{"url":678},"https://media.suddo.io/file/2f3af38f-ffaf-465d-b6b8-b927250a64dc/f2ec9543-603b-4340-94b6-c297c55a911d/1184.webp",{"id":389,"type":38,"data":680},{"text":681,"level":41},"Guiding Principles for Custom Methods",{"id":393,"type":69,"data":683},{"style":71,"meta":684,"items":685},{},[686,690,694],{"content":687,"meta":688,"items":689},"Place a \u003Cb>verb\u003C/b> after the resource ID: \u003Ccode>POST /v1/resources/{id}/apply-discount\u003C/code>.",{},[],{"content":691,"meta":692,"items":693},"Use \u003Cb>POST\u003C/b> for actions that have side effects.",{},[],{"content":695,"meta":696,"items":697},"Use \u003Cb>GET\u003C/b> for read-only actions like calculations that don't change state.",{},[],{"id":398,"type":38,"data":699},{"text":700,"level":62},"Batch Operations",{"id":402,"type":27,"data":702},{"text":703},"Batch operations reduce the number of API calls, allow for atomic changes to multiple resources, and simplify client-side logic.",{"id":406,"type":38,"data":705},{"text":706,"level":41},"Batch Read",{"id":411,"type":27,"data":708},{"text":709},"Avoid passing IDs in the query string, as you risk exceeding URL length limits. Instead, use a POST request.",{"id":415,"type":407,"data":711},{"code":712},"POST /v1/resources/batch-get",{"id":419,"type":27,"data":714},{"text":715},"Request Body:",{"id":423,"type":407,"data":717},{"code":718},"{ \"ids\": [\"guid-1\", \"guid-2\"] }",{"id":427,"type":38,"data":720},{"text":721,"level":41},"Batch Create",{"id":431,"type":407,"data":723},{"code":724},"POST /v1/resources/batch",{"id":435,"type":27,"data":726},{"text":715},{"id":439,"type":407,"data":728},{"code":729},"{\n \"resources\": [\n { \"title\": \"A\", \"status\": \"draft\" },\n { \"title\": \"B\", \"status\": \"active\" }\n ]\n}",{"id":443,"type":27,"data":731},{"text":732},"Response: \u003Cb>201 Created\u003C/b> with an array of the newly created resources.",{"id":447,"type":38,"data":734},{"text":735,"level":41},"Batch Delete",{"id":451,"type":407,"data":737},{"code":738},"POST /v1/resources/batch-delete",{"id":455,"type":27,"data":740},{"text":715},{"id":459,"type":407,"data":742},{"code":743},"{\n \"ids\": [\"guid-1\", \"guid-2\"],\n \"force\": false\n}",{"id":463,"type":27,"data":745},{"text":746},"Response: \u003Cb>200 OK\u003C/b>. According to \u003Cb>RFC 9110\u003C/b>, it's recommended to use \u003Cb>POST with a body\u003C/b> for this operation instead of a DELETE method.",{"id":467,"type":250,"data":748},{},{"id":471,"type":38,"data":750},{"text":751,"level":62},"Part 5: Frequently Asked Questions",{"id":484,"type":291,"data":753},{"caption":35,"withBorder":271,"withBackground":271,"stretched":271,"file":754},{"url":755},"https://media.suddo.io/file/2f3af38f-ffaf-465d-b6b8-b927250a64dc/02891b5f-34f9-471c-8e89-9adf6dc2f17a/1184.webp",{"id":336,"type":38,"data":757},{"text":758,"level":41},"Should I always return the full resource on POST/PUT/PATCH?",{"id":340,"type":27,"data":760},{"text":761},"Yes. For typical CRUD services, this simplifies development by reducing the need for extra requests. It also makes debugging and testing much easier.",{"id":344,"type":38,"data":763},{"text":764,"level":41},"Won't I hit query parameter limits with complex filtering?",{"id":349,"type":27,"data":766},{"text":767},"For most CRUD applications with a dozen or so explicit filters, this isn't an issue. When you have a large number of criteria, use a dedicated search endpoint that accepts a \u003Cb>POST\u003C/b> request with the filter parameters in the body.",{"id":353,"type":250,"data":769},{},{"id":382,"type":27,"data":771},{"text":772},"This guide intentionally omits topics like idempotency, ETags, and versioning, which are well-covered in official guidelines. The goal was to demonstrate that a small, clear set of rules can solve 80% of common API design challenges. By sticking to these principles, you reduce duplication, simplify maintenance, and leave room for future expansion. The other 20% of cases will require thoughtful decisions, and that's when you should consult industry standards.",{"id":386,"type":250,"data":774},{},{"id":389,"type":38,"data":776},{"text":777,"level":62},"Useful Links",{"id":393,"type":69,"data":779},{"style":71,"meta":780,"items":781},{},[782,786,790],{"content":783,"meta":784,"items":785},"\u003Cb>RFC 9110 — HTTP Semantics (methods, codes, headers)\u003C/b>\u003Ca href=\"https://datatracker.ietf.org/doc/html/rfc9110\">https://datatracker.ietf.org/doc/html/rfc9110\u003C/a>",{},[],{"content":787,"meta":788,"items":789},"\u003Cb>Google API Design Guide\u003C/b>\u003Ca href=\"https://cloud.google.com/apis/design/\">https://cloud.google.com/apis/design/\u003C/a>",{},[],{"content":791,"meta":792,"items":793},"\u003Cb>Microsoft REST API Guidelines\u003C/b>\u003Ca href=\"https://github.com/microsoft/api-guidelines/blob/vNext/azure/Guidelines.md\">https://github.com/microsoft/api-guidelines/blob/vNext/azure/Guidelines.md\u003C/a>",{},[],{"id":795,"type":27,"data":796},"v-L6i8yKBh",{"text":797},"#restapi #systemdesign",{"authorId":799,"name":800,"avatar":801,"username":802},"bje9Vrx386VzjYXPjj8t2UsYtDv1","Gloria Mazzi","https://media.suddo.io/file/2f3af38f-ffaf-465d-b6b8-b927250a64dc/900f4bde-d2bc-4a20-9ae9-4c5d48996901/1184.webp","id191722913817",[804],{"emojiId":270,"count":62,"reactedByUser":271},{"comments":274,"favorites":41,"views":806,"hits":807},30,342,"2025-10-09T08:39:16.61","2025-10-09T20:19:56.18",{"postId":811,"title":812,"slug":813,"preview":814,"html":815,"content":816,"author":1060,"authorUsername":1064,"topic":8,"status":266,"reactions":1065,"counters":1067,"createdAt":1070,"updatedAt":1071,"publishedPostId":279,"favorite":271},"6019c7cb-f22e-407c-bd1e-3a032d8b0e3c","System Design: A Checklist for Gathering and Documenting Requirements for All Occasions","512636-system-design-checklist-gathering-documenting-requirements","\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">Gathering and defining requirements is the foundational first step in any system design process. It's not a step you can skip, as the quality of your final solution — whether in an interview or a real-world project — depends entirely on how well you establish these initial requirements.\u003C/p>\u003C/div>","\u003Cdiv class=\"content-wrapper break-words\">\u003Cdiv class=\"block-wrapper--default\">\u003Ch2 class=\"block-content\">Why Are Requirements So Important?\u003C/h2>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">Gathering and defining requirements is the foundational first step in any system design process. It's not a step you can skip, as the quality of your final solution — whether in an interview or a real-world project — depends entirely on how well you establish these initial requirements.\u003C/p>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">Think of requirements as the blueprint for your system. They dictate what the system must do, how it should perform, and under what constraints. Without a clear blueprint, the design process becomes chaotic, which can lead to:\u003C/p>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cul class=\"block-content content-block-list-unordered\">\u003Cli class=\"content-block-list-item\">\u003Cb>A non-functional architecture\u003C/b> that can't handle the load or meet business needs.\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Wasted resources\u003C/b> from unnecessary complexity and expensive, unjustified technology choices.\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Failure to meet business goals\u003C/b> because the system doesn't solve the right problems.\u003C/li>\u003C/ul>\u003C/div>\u003Cfigure class=\"block-wrapper block-wrapper--media\">\u003Cdiv class=\"block-wrapper__content\">\u003Cblockquote class=\"block-quote block-quote--text-small block-quote--has-author\">\u003Cdiv class=\"block-quote__line\">\u003C/div>\u003Cdiv class=\"block-quote__text\">A startup built a monolith, but a year later, it needed to scale. They spent two months urgently breaking it down into microservices—a costly and time-consuming fix that could have been avoided.\u003C/div>\u003Cdiv class=\"block-quote__author\">Real-world example\u003C/div>\u003C/blockquote>\u003C/div>\u003C/figure>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">In essence, requirements connect business goals with technical implementation. Neglecting them in a system design interview is a near-guaranteed path to failure, even if your technical solution is brilliant.\u003C/p>\u003C/div>\u003Cfigure class=\"block-wrapper block-wrapper--media\">\u003Cdiv class=\"block-wrapper__content\">\u003Cblockquote class=\"block-quote block-quote--text-small block-quote--has-author\">\u003Cdiv class=\"block-quote__line\">\u003C/div>\u003Cdiv class=\"block-quote__text\">The interviewer asks, \"Design a URL shortening service.\" You immediately start drawing a sharded database, a global CDN, and redundant data centers. But what if the service is only for internal use with a load of 100 RPS? Your solution is overkill and expensive. The interviewer will ask, \"Why do you need six servers when one would suffice?\" and you'll lose points for an inadequate assessment.\u003C/div>\u003Cdiv class=\"block-quote__author\">Interview scenario\u003C/div>\u003C/blockquote>\u003C/div>\u003C/figure>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">Don't rush into drawing diagrams. System design is about finding unique solutions, not applying generic templates. Without clarifying requirements, you're navigating a dark forest at night with your eyes closed, hoping to find a way out.\u003C/p>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Ch2 class=\"block-content\">A Framework for Clarifying Requirements\u003C/h2>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">Let's imagine you're in an interview, and the prompt is to design a marketplace. Instead of jumping to solutions, use a structured approach to ask targeted questions. Here's a checklist to guide you.\u003C/p>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Ch3 class=\"block-content\">1. Functional Requirements\u003C/h3>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cul class=\"block-content content-block-list-unordered\">\u003Cli class=\"content-block-list-item\">What are the core features the system must support?\u003C/li>\u003Cli class=\"content-block-list-item\">Which use cases are the highest priority?\u003C/li>\u003Cli class=\"content-block-list-item\">Are there any specific data constraints, like maximum file upload sizes?\u003C/li>\u003C/ul>\u003C/div>\u003Cfigure class=\"block-wrapper block-wrapper--media\">\u003Cdiv class=\"block-wrapper__content\">\u003Cblockquote class=\"block-quote block-quote--text-small block-quote--has-author\">\u003Cdiv class=\"block-quote__line\">\u003C/div>\u003Cdiv class=\"block-quote__text\">Is a full-text search for products required, or is filtering by category sufficient? Is the system more read-heavy (browsing products) or write-heavy (placing orders)?\u003C/div>\u003Cdiv class=\"block-quote__author\">Example questions\u003C/div>\u003C/blockquote>\u003C/div>\u003C/figure>\u003Cdiv class=\"block-wrapper--default\">\u003Ch3 class=\"block-content\">2. Non-Functional Requirements\u003C/h3>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cul class=\"block-content content-block-list-unordered\">\u003Cli class=\"content-block-list-item\">\u003Cb>Scalability:\u003C/b> What is the expected peak user load? What is the projected growth over the next year?\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Availability:\u003C/b> What is the required uptime (e.g., 99.9%)? Which components must be fault-tolerant?\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Consistency:\u003C/b> Is strong consistency required, or is eventual consistency acceptable for some data?\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Performance:\u003C/b> What is the acceptable response time for key APIs, like search? Is real-time support needed?\u003C/li>\u003C/ul>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Ch3 class=\"block-content\">3. Data Characteristics\u003C/h3>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cul class=\"block-content content-block-list-unordered\">\u003Cli class=\"content-block-list-item\">\u003Cb>Volume:\u003C/b> How many new orders are expected per day? What is the average size of a product record in the database?\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Access Patterns:\u003C/b> How often is product data updated? Are there any hot records that are accessed frequently?\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Storage:\u003C/b> Do old orders need to be archived? What is the data retention policy for logs?\u003C/li>\u003C/ul>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Ch3 class=\"block-content\">4. Integrations and Security\u003C/h3>\u003C/div>\u003Cfigure class=\"block-wrapper block-wrapper--media\">\u003Cdiv class=\"block-wrapper__content\">\u003Cblockquote class=\"block-quote block-quote--text-small block-quote--has-author\">\u003Cdiv class=\"block-quote__line\">\u003C/div>\u003Cdiv class=\"block-quote__text\">Will the system integrate with external services like a payment processor or CRM? What are their API rate limits? Does data need to be encrypted? Is authentication required for all endpoints?\u003C/div>\u003Cdiv class=\"block-quote__author\">Example questions\u003C/div>\u003C/blockquote>\u003C/div>\u003C/figure>\u003Cdiv class=\"block-wrapper--default\">\u003Ch3 class=\"block-content\">5. Constraints and Assumptions\u003C/h3>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cul class=\"block-content content-block-list-unordered\">\u003Cli class=\"content-block-list-item\">\u003Cb>Infrastructure:\u003C/b> Can we use cloud services (AWS/GCP), or are we limited to on-premise hardware?\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Technology Stack:\u003C/b> Are there restrictions on the database (e.g., only relational, or can we use NoSQL)?\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Scope:\u003C/b> Are we designing only the backend, or should the design include the CDN and caching layers?\u003C/li>\u003C/ul>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Ch3 class=\"block-content\">Quick Interview Checklist\u003C/h3>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Col class=\"block-content content-block-list-ordered\">\u003Cli class=\"content-block-list-item\">\u003Cb>Functions:\u003C/b> What are the MUST-HAVE vs. NICE-TO-HAVE features?\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Scale:\u003C/b> What are the peak loads, data growth projections, and geo-distribution needs?\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Reliability:\u003C/b> What is the SLA? What is the acceptable downtime? Are backups required?\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Data:\u003C/b> Clarify the volume, update frequency, and read/write patterns.\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Integrations:\u003C/b> Identify dependencies on external services.\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Constraints:\u003C/b> Are there any budget, timeline, or technology stack limitations?\u003C/li>\u003Cli class=\"content-block-list-item\">\u003Cb>Future:\u003C/b> How might user traffic or feature needs evolve over time?\u003C/li>\u003C/ol>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Ch3 class=\"block-content\">Final Tips\u003C/h3>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">\u003Cb>1. Think Aloud\u003C/b>\u003C/p>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">Verbalize your assumptions. This gives the interviewer a chance to correct you and shows your thought process.\u003C/p>\u003C/div>\u003Cfigure class=\"block-wrapper block-wrapper--media\">\u003Cdiv class=\"block-wrapper__content\">\u003Cblockquote class=\"block-quote block-quote--text-small\">\u003Cdiv class=\"block-quote__line\">\u003C/div>\u003Cdiv class=\"block-quote__text\">\"I'm assuming that product search will account for 80% of the load, so I propose using a dedicated Elasticsearch index for it.\"\u003C/div>\u003C/blockquote>\u003C/div>\u003C/figure>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">\u003Cb>2. Use the 5W Method\u003C/b>\u003C/p>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">Frame your questions around \u003Cb>Who\u003C/b> (users?), \u003Cb>What\u003C/b> (data?), \u003Cb>Where\u003C/b> (geo-distribution?), \u003Cb>When\u003C/b> (peak hours?), and \u003Cb>Why\u003C/b> (the system's core purpose?).\u003C/p>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Ch3 class=\"block-content\">Sample Interview Dialogue\u003C/h3>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">\u003Cb>Candidate:\u003C/b> \"You mentioned that the system must display an up-to-date inventory. Does this mean we need strong consistency for inventory updates, or is a small window of inconsistency—say, 1-2 seconds—acceptable?\"\u003C/p>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">\u003Cb>Interviewer:\u003C/b> \"Eventual consistency with a delay of up to 5 seconds is acceptable.\"\u003C/p>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">\u003Cb>Candidate:\u003C/b> \"Great. In that case, I propose using Cassandra for the inventory, with a Redis cache, to balance performance and consistency.\"\u003C/p>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">Thanks and good luck on interview!\u003C/p>\u003C/div>\u003Cdiv class=\"block-wrapper--default\">\u003Cp class=\"block-content\">\u003Ca href=\"/tag/systemdesign\" target=\"_blank\" rel=\"noopener noreferrer ugc\">#systemdesign\u003C/a>\u003C/p>\u003C/div>\u003C/div>",{"time":817,"blocks":818,"version":260},1759947395807,[819,823,827,831,848,853,857,862,866,870,874,878,895,900,904,925,929,946,950,954,958,975,979,1012,1016,1020,1024,1028,1032,1036,1040,1044,1048,1052,1056],{"id":820,"type":38,"data":821},"why_req_h2",{"text":822,"level":41},"Why Are Requirements So Important?",{"id":824,"type":27,"data":825},"why_req_p1",{"text":826},"Gathering and defining requirements is the foundational first step in any system design process. It's not a step you can skip, as the quality of your final solution — whether in an interview or a real-world project — depends entirely on how well you establish these initial requirements.",{"id":828,"type":27,"data":829},"why_req_p2",{"text":830},"Think of requirements as the blueprint for your system. They dictate what the system must do, how it should perform, and under what constraints. Without a clear blueprint, the design process becomes chaotic, which can lead to:",{"id":832,"type":69,"data":833},"why_req_list",{"style":71,"meta":834,"items":835},{},[836,840,844],{"content":837,"meta":838,"items":839},"\u003Cb>A non-functional architecture\u003C/b> that can't handle the load or meet business needs.",{},[],{"content":841,"meta":842,"items":843},"\u003Cb>Wasted resources\u003C/b> from unnecessary complexity and expensive, unjustified technology choices.",{},[],{"content":845,"meta":846,"items":847},"\u003Cb>Failure to meet business goals\u003C/b> because the system doesn't solve the right problems.",{},[],{"id":849,"type":32,"data":850},"why_req_quote",{"quoteText":851,"authorText":852},"A startup built a monolith, but a year later, it needed to scale. They spent two months urgently breaking it down into microservices—a costly and time-consuming fix that could have been avoided.","Real-world example",{"id":854,"type":27,"data":855},"what_req_do_p1",{"text":856},"In essence, requirements connect business goals with technical implementation. Neglecting them in a system design interview is a near-guaranteed path to failure, even if your technical solution is brilliant.",{"id":858,"type":32,"data":859},"what_req_do_quote",{"quoteText":860,"authorText":861},"The interviewer asks, \"Design a URL shortening service.\" You immediately start drawing a sharded database, a global CDN, and redundant data centers. But what if the service is only for internal use with a load of 100 RPS? Your solution is overkill and expensive. The interviewer will ask, \"Why do you need six servers when one would suffice?\" and you'll lose points for an inadequate assessment.","Interview scenario",{"id":863,"type":27,"data":864},"what_req_do_p2",{"text":865},"Don't rush into drawing diagrams. System design is about finding unique solutions, not applying generic templates. Without clarifying requirements, you're navigating a dark forest at night with your eyes closed, hoping to find a way out.",{"id":867,"type":38,"data":868},"algo_h2",{"text":869,"level":41},"A Framework for Clarifying Requirements",{"id":871,"type":27,"data":872},"algo_p1",{"text":873},"Let's imagine you're in an interview, and the prompt is to design a marketplace. Instead of jumping to solutions, use a structured approach to ask targeted questions. Here's a checklist to guide you.",{"id":875,"type":38,"data":876},"func_req_h3",{"text":877,"level":62},"1. Functional Requirements",{"id":879,"type":69,"data":880},"func_req_list",{"style":71,"meta":881,"items":882},{},[883,887,891],{"content":884,"meta":885,"items":886},"What are the core features the system must support?",{},[],{"content":888,"meta":889,"items":890},"Which use cases are the highest priority?",{},[],{"content":892,"meta":893,"items":894},"Are there any specific data constraints, like maximum file upload sizes?",{},[],{"id":896,"type":32,"data":897},"func_req_quote",{"quoteText":898,"authorText":899},"Is a full-text search for products required, or is filtering by category sufficient? Is the system more read-heavy (browsing products) or write-heavy (placing orders)?","Example questions",{"id":901,"type":38,"data":902},"non_func_req_h3",{"text":903,"level":62},"2. Non-Functional Requirements",{"id":905,"type":69,"data":906},"non_func_req_list",{"style":71,"meta":907,"items":908},{},[909,913,917,921],{"content":910,"meta":911,"items":912},"\u003Cb>Scalability:\u003C/b> What is the expected peak user load? What is the projected growth over the next year?",{},[],{"content":914,"meta":915,"items":916},"\u003Cb>Availability:\u003C/b> What is the required uptime (e.g., 99.9%)? Which components must be fault-tolerant?",{},[],{"content":918,"meta":919,"items":920},"\u003Cb>Consistency:\u003C/b> Is strong consistency required, or is eventual consistency acceptable for some data?",{},[],{"content":922,"meta":923,"items":924},"\u003Cb>Performance:\u003C/b> What is the acceptable response time for key APIs, like search? Is real-time support needed?",{},[],{"id":926,"type":38,"data":927},"data_h3",{"text":928,"level":62},"3. Data Characteristics",{"id":930,"type":69,"data":931},"data_list",{"style":71,"meta":932,"items":933},{},[934,938,942],{"content":935,"meta":936,"items":937},"\u003Cb>Volume:\u003C/b> How many new orders are expected per day? What is the average size of a product record in the database?",{},[],{"content":939,"meta":940,"items":941},"\u003Cb>Access Patterns:\u003C/b> How often is product data updated? Are there any \"hot\" records that are accessed frequently?",{},[],{"content":943,"meta":944,"items":945},"\u003Cb>Storage:\u003C/b> Do old orders need to be archived? What is the data retention policy for logs?",{},[],{"id":947,"type":38,"data":948},"integrations_h3",{"text":949,"level":62},"4. Integrations and Security",{"id":951,"type":32,"data":952},"integrations_quote",{"quoteText":953,"authorText":899},"Will the system integrate with external services like a payment processor or CRM? What are their API rate limits? Does data need to be encrypted? Is authentication required for all endpoints?",{"id":955,"type":38,"data":956},"constraints_h3",{"text":957,"level":62},"5. Constraints and Assumptions",{"id":959,"type":69,"data":960},"constraints_list",{"style":71,"meta":961,"items":962},{},[963,967,971],{"content":964,"meta":965,"items":966},"\u003Cb>Infrastructure:\u003C/b> Can we use cloud services (AWS/GCP), or are we limited to on-premise hardware?",{},[],{"content":968,"meta":969,"items":970},"\u003Cb>Technology Stack:\u003C/b> Are there restrictions on the database (e.g., only relational, or can we use NoSQL)?",{},[],{"content":972,"meta":973,"items":974},"\u003Cb>Scope:\u003C/b> Are we designing only the backend, or should the design include the CDN and caching layers?",{},[],{"id":976,"type":38,"data":977},"checklist_h3",{"text":978,"level":62},"Quick Interview Checklist",{"id":980,"type":69,"data":981},"checklist_list",{"style":199,"meta":982,"items":983},{"counterType":201},[984,988,992,996,1000,1004,1008],{"content":985,"meta":986,"items":987},"\u003Cb>Functions:\u003C/b> What are the MUST-HAVE vs. NICE-TO-HAVE features?",{},[],{"content":989,"meta":990,"items":991},"\u003Cb>Scale:\u003C/b> What are the peak loads, data growth projections, and geo-distribution needs?",{},[],{"content":993,"meta":994,"items":995},"\u003Cb>Reliability:\u003C/b> What is the SLA? What is the acceptable downtime? Are backups required?",{},[],{"content":997,"meta":998,"items":999},"\u003Cb>Data:\u003C/b> Clarify the volume, update frequency, and read/write patterns.",{},[],{"content":1001,"meta":1002,"items":1003},"\u003Cb>Integrations:\u003C/b> Identify dependencies on external services.",{},[],{"content":1005,"meta":1006,"items":1007},"\u003Cb>Constraints:\u003C/b> Are there any budget, timeline, or technology stack limitations?",{},[],{"content":1009,"meta":1010,"items":1011},"\u003Cb>Future:\u003C/b> How might user traffic or feature needs evolve over time?",{},[],{"id":1013,"type":38,"data":1014},"final_tips_h3",{"text":1015,"level":62},"Final Tips",{"id":1017,"type":27,"data":1018},"tip_1_p1",{"text":1019},"\u003Cb>1. Think Aloud\u003C/b>",{"id":1021,"type":27,"data":1022},"tip_1_p2",{"text":1023},"Verbalize your assumptions. This gives the interviewer a chance to correct you and shows your thought process.",{"id":1025,"type":32,"data":1026},"tip_1_quote",{"quoteText":1027,"authorText":35},"\"I'm assuming that product search will account for 80% of the load, so I propose using a dedicated Elasticsearch index for it.\"",{"id":1029,"type":27,"data":1030},"tip_2_p1",{"text":1031},"\u003Cb>2. Use the 5W Method\u003C/b>",{"id":1033,"type":27,"data":1034},"tip_2_p2",{"text":1035},"Frame your questions around \u003Cb>Who\u003C/b> (users?), \u003Cb>What\u003C/b> (data?), \u003Cb>Where\u003C/b> (geo-distribution?), \u003Cb>When\u003C/b> (peak hours?), and \u003Cb>Why\u003C/b> (the system's core purpose?).",{"id":1037,"type":38,"data":1038},"dialogue_h3",{"text":1039,"level":62},"Sample Interview Dialogue",{"id":1041,"type":27,"data":1042},"dialogue_p1",{"text":1043},"\u003Cb>Candidate:\u003C/b> \"You mentioned that the system must display an up-to-date inventory. Does this mean we need strong consistency for inventory updates, or is a small window of inconsistency—say, 1-2 seconds—acceptable?\"",{"id":1045,"type":27,"data":1046},"dialogue_p2",{"text":1047},"\u003Cb>Interviewer:\u003C/b> \"Eventual consistency with a delay of up to 5 seconds is acceptable.\"",{"id":1049,"type":27,"data":1050},"dialogue_p3",{"text":1051},"\u003Cb>Candidate:\u003C/b> \"Great. In that case, I propose using Cassandra for the inventory, with a Redis cache, to balance performance and consistency.\"",{"id":1053,"type":27,"data":1054},"learning_p2",{"text":1055},"Thanks and good luck on interview!",{"id":1057,"type":27,"data":1058},"zR0z7iTNCX",{"text":1059},"#systemdesign",{"authorId":1061,"name":1062,"avatar":1063,"username":1064},"js9nOXdaWKhIGloRqskbZDY1WnL2","Leonid Herasimau","https://media.suddo.io/file/2f3af38f-ffaf-465d-b6b8-b927250a64dc/60fdf5c8-13ea-41de-b2e9-566870b67fc2/592.webp","id357938428487",[1066],{"emojiId":270,"count":41,"reactedByUser":271},{"comments":274,"favorites":41,"views":1068,"hits":1069},18,309,"2025-10-08T18:12:57.246","2025-10-08T20:48:47.624",["Reactive",1073],{"$si18n:cached-locale-configs":1074,"$si18n:resolved-locale":35,"$sshowLoginModal":271},{},["Set"],["ShallowReactive",1077],{"resolver-system-design":-1,"feed-topic-system_design-none-latest-none-0":-1},true,"/system-design",{"auth":1081,"app":1082,"theme":1083,"main":1172,"i18n":1174,"ui":1178},{"logged":271,"user":279,"authReady":271},{"lastUpdatedPostId":279,"lastUpdateTime":279},{"layout":1084,"themeName":1085,"routerTransition":1086,"routerTransitionDuration":274,"rtl":271,"boxed":1087,"sidebar":1089,"footer":1095,"responsive":1096,"toolbarHeight":1103,"viewPadding":1100,"headerBarHeight":1105,"colors":1106,"borderRadius":1134,"lineHeight":1137,"fontSize":1139,"fontWeight":1142,"fontFamily":1145,"typography":1147,"isThemeSetByUser":271},"VerticalNav","light","fade-up",{"enabled":1078,"toolbar":1078,"width":1088},1600,{"autoClose":1078,"collapsed":271,"autoCloseBreakpoint":1090,"animEase":1091,"animDuration":1092,"openWidth":1093,"closeWidth":1094},1000,"ease-in-out",0.3,300,64,{"show":1078},{"breakpoint":1097,"override":1098},700,{"viewPadding":1099,"toolbarHeight":1102},{"desk":1100,"mobile":1101},40,20,{"desk":1103,"mobile":1104},80,70,60,{"light":1107,"dark":1122},{"sidebarBackground":1108,"bodyBackground":1109,"background":1108,"backgroundSecondary":1110,"text":1111,"textSecondary":1112,"textTertiary":1113,"border":1114,"hover":1115,"primary":1116,"info":1117,"success":1118,"warning":1119,"error":1120,"extra1":1117,"extra2":1121,"extra3":1119,"extra4":1120},"rgb(255, 255, 255)","rgb(245, 247, 249)","#F2F2F2","rgb(0, 0, 0)","#000","rgb(114, 115, 115)","rgb(226, 230, 233)","rgba(221, 224, 225, 0.5)","hsl(221.2, 83.2%, 53.3%)","rgb(97, 102, 255)","rgb(0, 179, 122)","rgb(255, 183, 0)","rgb(255, 0, 85)","rgb(255, 97, 200)",{"sidebarBackground":1123,"bodyBackground":1124,"background":1123,"backgroundSecondary":1125,"text":1126,"textSecondary":1127,"textTertiary":1128,"border":1129,"hover":1130,"primary":1131,"info":1117,"success":1132,"warning":1119,"error":1133,"extra1":1117,"extra2":1121,"extra3":1119,"extra4":1120},"rgb(35, 35, 36)","rgb(22, 22, 23)","rgb(44, 44, 45)","rgb(201, 204, 207)","#c9cccf","rgb(150, 157, 160)","rgb(53, 52, 54)","rgb(58, 58, 58)","rgb(65, 138, 244)","rgb(51, 160, 62)","rgb(214, 51, 62)",{"default":1135,"small":1136},"8px","4px",{"default":1138},"1.25",{"default":1140,"cardTitle":1141},"16px","18px",{"default":1143,"strong":1144,"cardTitle":1144},"400","600",{"default":1146,"display":1146,"mono":1146},"Roboto, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif",{"h1":1148,"h2":1153,"h3":1156,"h4":1159,"h5":1162,"h6":1165,"p":1169},{"fontFamily":1149,"fontSize":1150,"fontWeight":1151,"lineHeight":1152},"{fontFamily.display}","30px","700","38",{"fontFamily":1149,"fontSize":1154,"fontWeight":1151,"lineHeight":1155},"26px","33",{"fontFamily":1149,"fontSize":1157,"fontWeight":1151,"lineHeight":1158},"22px","28",{"fontFamily":1149,"fontSize":1141,"fontWeight":1160,"lineHeight":1161},"500","23",{"fontFamily":1149,"fontSize":1163,"fontWeight":1151,"lineHeight":1164},"14px","18",{"fontFamily":1166,"fontSize":1167,"fontWeight":1160,"lineHeight":1168},"{fontFamily.default}","12px","15",{"fontFamily":1166,"fontSize":1170,"lineHeight":1171},"{fontSize.default}","20",{"API_URL":-1,"forceRefresh":1173,"loadingBar":279},1760440699975,{"locale":1175,"availableLocales":1177},["Ref",1176],"en",[1176],{"feedRefreshKey":274}]