{"id":21434354,"url":"https://github.com/z1skgr/fullopenstack2023","last_synced_at":"2025-07-14T14:31:27.996Z","repository":{"id":163130783,"uuid":"599662894","full_name":"z1skgr/FullOpenStack2023","owner":"z1skgr","description":"Modern JavaScript-based web development. Building single page applications with ReactJS that use REST APIs built with Node.js.","archived":false,"fork":false,"pushed_at":"2024-10-21T11:48:19.000Z","size":2869,"stargazers_count":2,"open_issues_count":3,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-21T16:49:41.941Z","etag":null,"topics":["apollo-server","axios-react","express","flux-architecture","full-stack","full-stack-open","graphql","mongodb","mongoose","nodejs","nodemon","proxy","react-query","react-router","reactjs","redux-toolkit","rest-api","rest-client","typescript"],"latest_commit_sha":null,"homepage":"https://fullstackopen.com/en/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/z1skgr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-02-09T16:08:15.000Z","updated_at":"2024-10-21T11:48:23.000Z","dependencies_parsed_at":null,"dependency_job_id":"b3480acd-54cd-47ec-8523-a297abb1696b","html_url":"https://github.com/z1skgr/FullOpenStack2023","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/z1skgr%2FFullOpenStack2023","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/z1skgr%2FFullOpenStack2023/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/z1skgr%2FFullOpenStack2023/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/z1skgr%2FFullOpenStack2023/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/z1skgr","download_url":"https://codeload.github.com/z1skgr/FullOpenStack2023/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225980897,"owners_count":17554919,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apollo-server","axios-react","express","flux-architecture","full-stack","full-stack-open","graphql","mongodb","mongoose","nodejs","nodemon","proxy","react-query","react-router","reactjs","redux-toolkit","rest-api","rest-client","typescript"],"created_at":"2024-11-22T23:34:53.344Z","updated_at":"2024-11-22T23:34:54.056Z","avatar_url":"https://github.com/z1skgr.png","language":"JavaScript","readme":"# [FullOpenStack2023](https://fullstackopen.com/en/)\nCourses developed for Web Development from Helsinki University focusing on building single page applications\n\n\n\u003ctable class=\"tg\"\u003e\n\u003cthead\u003e\n  \u003ctr\u003e\n    \u003cth class=\"tg-c3ow\" colspan=\"4\"\u003e\u003ca href=\"https://fullstackopen.com/en/\"\u003eFull Stack Open 2023\u003c/th\u003e\n  \u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-0pky\"\u003e\u003ca href=\"https://fullstackopen.com/en/part0\"\u003ePart 0\u003c/a\u003e\u003cbr\u003e\u003ca href=\"https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%200\"\u003eFundamentals of Web apps\u003c/a\u003e\u003c/td\u003e\n    \u003ctd class=\"tg-0pky\"\u003e\u003ca href=\"https://fullstackopen.com/en/part1\"\u003ePart 1\u003c/a\u003e\u003cbr\u003e\u003ca href=\"https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%201\"\u003eIntroduction to React\u003c/td\u003e\n    \u003ctd class=\"tg-0pky\"\u003e\u003ca href=\"https://fullstackopen.com/en/part2\"\u003ePart 2\u003c/a\u003e\u003cbr\u003e\u003ca href=\"https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%202\"\u003eCommunicating with server\u003c/td\u003e\n    \u003ctd class=\"tg-0pky\"\u003e\u003ca href=\"https://fullstackopen.com/en/part3\"\u003ePart 3\u003c/a\u003e\u003cbr\u003e\u003ca href=\"https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%203\"\u003eProgramming a server with NodeJS and Express\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-0pky\"\u003e\u003ca href=\"https://fullstackopen.com/en/part4\"\u003ePart 4\u003c/a\u003e\u003ca href=\"https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%204\"\u003e\u003cbr\u003eTesting Express servers, user administration\u003c/td\u003e\n    \u003ctd class=\"tg-0pky\"\u003e\u003ca href=\"https://fullstackopen.com/en/part5\"\u003ePart 5\u003c/a\u003e\u003ca href=\"https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%205\"\u003e\u003cbr\u003eTesting React apps\u003c/td\u003e\n    \u003ctd class=\"tg-0pky\"\u003e\u003ca href=\"https://fullstackopen.com/en/part6\"\u003ePart 6\u003c/a\u003e\u003ca href=\"https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%206\"\u003e\u003cbr\u003eAdvanced state management\u003c/td\u003e\n    \u003ctd class=\"tg-0pky\"\u003e\u003ca href=\"https://fullstackopen.com/en/part7\"\u003ePart 7\u003c/a\u003e\u003ca href=\"https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%207\"\u003e\u003cbr\u003eReact router, custom hooks, styling app with CSS and webpack\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-0pky\"\u003e\u003ca href=\"https://fullstackopen.com/en/part8\"\u003ePart 8\u003c/a\u003e\u003ca href=\"https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%208\"\u003e\u003cbr\u003eGraphQL\u003c/td\u003e\n    \u003ctd class=\"tg-0pky\"\u003e\u003ca href=\"https://fullstackopen.com/en/part9\"\u003ePart 9\u003c/a\u003e\u003ca href=\"https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%209\"\u003e\u003cbr\u003eTypeScript\u003c/td\u003e\n  \u003c/tr\u003e\n\n\u003c/tbody\u003e\n\u003c/table\u003e\n\nLearn \n1. React \n2. Redux \n3. Node.js \n4. MongoDB \n5. GraphQL\n6. TypeScript\n\nover several interactive courses and examples\n\n## Table of Contents\n\n* [Funtamentals of WebApps](#funtamentals)\n* [Introduction to React](#introduction-to-react)\n* [Communicating with server](#communication-with-react)\n* [Programming a server with Node.js](#programming-a-server-with-node)\n* [Testing server User administration](#testing-server-user-administration)\n* [Testing React App](#testing-react-app)\n* [Advanced state management](#advanced-state-management)\n* [React router](#react-rooter)\n* [GraphQL](#graphql)\n* [Typescript](#typescript)\n\n\n\n## [Funtamentals](https://fullstackopen.com/en/part0)\nBasics of web development [here](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%200)\n\n* [4](https://github.com/z1skgr/FullOpenStack2023/blob/main/Part%200/Ex0.4/4.md) \n* [5](https://github.com/z1skgr/FullOpenStack2023/blob/main/Part%200/Ex0.4/5.md) \n* [6](https://github.com/z1skgr/FullOpenStack2023/blob/main/Part%200/Ex0.4/6.md)\n\n## [Introduction to React](https://fullstackopen.com/en/part1)\n\n1. [Introduction to React](https://fullstackopen.com/en/part1/introduction_to_react)  \n2. [JavaScript](https://fullstackopen.com/en/part1/java_script)  \n3. [Component state, event handlers](https://fullstackopen.com/en/part1/component_state_event_handlers)\n4. [Debugging React apps](https://fullstackopen.com/en/part1/a_more_complex_state_debugging_react_apps)\n\nThere are four main topics to study in this part. First thing is familiarization with React-library for browser display using functions. Javascript mechanisms and event handlers contribute to app development\n\n- [courseinfo](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%201/courseinfo) -  Course information web page with react basics\n\n- [unicafe](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%201/unicafe) -  Statistic App demonstating event handling\n\n- [anecdotes](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%201/anecdotes) - Anecdote generator with complex components/functions\n\n[Solutions](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%201)\n\n\n## [Communication with React](https://fullstackopen.com/en/part2)\n\n1. [Rendering a collection, modules](https://fullstackopen.com/en/part2/rendering_a_collection_modules)  \n2. [Forms](https://fullstackopen.com/en/part2/forms)  \n3. [Getting data from server](https://fullstackopen.com/en/part2/getting_data_from_server)\n4. [Altering data in server](https://fullstackopen.com/en/part2/altering_data_in_server)\n5. [Adding styles to React](https://fullstackopen.com/en/part2/adding_styles_to_react_app)\n\nReact code structured apps using styles and communication with a backend api (REST)\n\n- [courseinfo](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%202/courseinfo) - Extension of [part 1](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%201/courseinfo) with modifications and new features\n- [phonebook](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%202/phonebook) - Phonebook app with design mechanisms in React \n- [countries](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%202/countries) - React app displaying information from [REST countries API](https://restcountries.eu) \n\n[Solutions](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%202)\n\n## [Programming a server with Node](https://fullstackopen.com/en/part3)\n\n1. [Node.js and Express](https://fullstackopen.com/en/part3/node_js_and_express)  \n2. [Deploying App to Internet](https://fullstackopen.com/en/part3/deploying_app_to_internet)  \n3. [Saving data to MongoDB](https://fullstackopen.com/en/part3/saving_data_to_mongo_db)\n4. [Validation and ESLint](https://fullstackopen.com/en/part3/validation_and_es_lint)\n\nSimple REST API in Node.js using the Express library. The application's data is stored in a MongoDB database. The application is deployed to the internet.\n\n- [phonebook](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%203/phonebook-backend) - Full stack App Phonebook \n\n\n[Solutions](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%203)\n\n## [Testing server User administration](https://fullstackopen.com/en/part4)\n\n1. [Structure of backend application, introduction to testing](https://fullstackopen.com/en/part4/structure_of_backend_application_introduction_to_testing) \n2. [Testing the backend](https://fullstackopen.com/en/part4/testing_the_backend)  \n3. [User administration](https://fullstackopen.com/en/part4/user_administration)\n4. [Token authentication](https://fullstackopen.com/en/part4/token_authentication)\n\nExtended REST API in Node.js using the Express library for user authentication-authorization from server side (backend). The application's data is stored in a MongoDB database. Integrated test for \nfunctionality verification. The application is deployed to the internet.\n\n- [bloglist](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%204/bloglist-backend) - Backend App bloglist \n\n\n[Solutions](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%205)\n\n## [Testing React App](https://fullstackopen.com/en/part5)\n\n1. [Login in frontend](https://fullstackopen.com/en/part5/login_in_frontend)  \n2. [props.children and proptypes](https://fullstackopen.com/en/part5/props_children_and_proptypes)  \n3. [Testing React apps](https://fullstackopen.com/en/part5/testing_react_apps)\n4. [End to end testing](https://fullstackopen.com/en/part5/end_to_end_testing)\n\nUser authentication-authorization from client side (frontend). The application's data is stored in a MongoDB database. Integrated test for \nfunctionality verification and real-time tests with component rendering.\n\n- [frontend](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%205/bloglist-backend) - Front App bloglist \n\n\n[Solutions](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%205)\n\n\n## [Advanced state management](https://fullstackopen.com/en/part6)\n\n1. [Flux-architecture and Redux](https://fullstackopen.com/en/part6/flux_architecture_and_redux)  \n2. [Many Reducers](https://fullstackopen.com/en/part6/many_reducers)  \n3. [Communicating with server in Redux application](https://fullstackopen.com/en/part6/communicating_with_server_in_a_redux_application)\n4. [React Query, useReducer and the context](https://fullstackopen.com/en/part6/react_query_use_reducer_and_the_context)\n\nRedux library and React Query, for managing the state of React applications.\n\n- [redux anecdote](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%206/redux-anecdotes) - Redux App anecdote \n- [redux unicafe](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%206/unicafe-redux) - Redux App unicafe \n- [react query anecdote](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%206/query-anecdotes) - React query App anecdote\n\n[Solutions](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%206)\n\n## [React Router](https://fullstackopen.com/en/part7)\n\n1. [React Router](https://fullstackopen.com/en/part7/react_router)  \n2. [Custom hooks](https://fullstackopen.com/en/part7/custom_hooks)  \n3. [More about styles](https://fullstackopen.com/en/part7/more_about_styles)\n4. [Webpack](https://fullstackopen.com/en/part7/webpack)\n5. [Class components, Miscellaneous](https://fullstackopen.com/en/part7/class_components_miscellaneous)\n\n\nReact Router, CSS styles, Webpack configuration \u0026 Hook functions for React applications.\n\n\n- [bloglist](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%207/bloglist) - React query App anecdote\n\n[Solutions](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%207)\n\n## [GraphQL](https://fullstackopen.com/en/part8)\n\n1. [GraphQL-server](https://fullstackopen.com/en/part8/graph_ql_server)  \n2. [React and GraphQL](https://fullstackopen.com/en/part8/react_and_graph_ql)  \n3. [Database and User Administration](https://fullstackopen.com/en/part8/database_and_user_administration)\n4. [Login and Updating Cache](https://fullstackopen.com/en/part8/login_and_updating_the_cache)\n5. [Fragments and Subscriptions](https://fullstackopen.com/en/part8/fragments_and_subscriptions)\n\n## [TypeScript](https://fullstackopen.com/en/part9)\n\n1. [Background and Introduction](https://fullstackopen.com/en/part9/background_and_introduction)  \n2. [First steps with TypeScript](https://fullstackopen.com/en/part9/first_steps_with_type_script)  \n3. [Typing an Express App](https://fullstackopen.com/en/part9/typing_an_express_app)\n4. [React with types](https://fullstackopen.com/en/part9/react_with_types)\n5. [Grande finale: Patientor](https://fullstackopen.com/en/part9/grande_finale_patientor)\n\nTypescript, JavaScript open-source superset.\n\n- [Calculators](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%209/Calculators)\n- [CourseInfo](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%209/CourseInfo) \n- [Ilari's diary](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%209/Ilari%20diary) \n- [Patientor](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%209/Patientor)  \n\n[Solutions](https://github.com/z1skgr/FullOpenStack2023/tree/main/Part%209)\n\n\n\n## Exercises per part\n\n\u003ctable style=\"border-collapse:collapse;border-spacing:0\" class=\"tg\"\u003e\u003cthead\u003e\u003ctr\u003e\u003cth style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;font-weight:normal;overflow:hidden;padding:10px 5px;text-align:left;vertical-align:top;word-break:normal\" colspan=\"8\"\u003eExercises per round\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003ePart 0\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003e6/6\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003ePart 4\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003e23/23\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003ePart 8\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003e22/26\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003ePart 1\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003e14/14\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003ePart 5\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003e23/23\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003ePart 9\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003e24/29\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003ePart 2\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003e20/20\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003ePart 6\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003e23/23\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003ePart 3\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003e22/22\u003c/td\u003e\u003ctd style=\"borsder-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003ePart 7\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:center;vertical-align:top;word-break:normal\"\u003e21/21\u003c/td\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:left;vertical-align:top;word-break:normal\" colspan=\"7\"\u003eTotal\u003c/td\u003e\u003ctd style=\"border-color:inherit;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;text-align:left;vertical-align:top;word-break:normal\"\u003e198/207\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fz1skgr%2Ffullopenstack2023","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fz1skgr%2Ffullopenstack2023","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fz1skgr%2Ffullopenstack2023/lists"}