{"id":28247740,"url":"https://github.com/driebit/kenniscloud","last_synced_at":"2026-03-06T11:02:18.478Z","repository":{"id":289848379,"uuid":"958644512","full_name":"driebit/kenniscloud","owner":"driebit","description":null,"archived":false,"fork":false,"pushed_at":"2026-02-13T15:39:16.000Z","size":1967,"stargazers_count":1,"open_issues_count":14,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-14T00:09:06.135Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/driebit.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-04-01T14:29:33.000Z","updated_at":"2026-02-13T15:39:38.000Z","dependencies_parsed_at":"2025-04-25T11:41:34.615Z","dependency_job_id":"40c64f36-9461-4ce1-abc1-59d138b82873","html_url":"https://github.com/driebit/kenniscloud","commit_stats":null,"previous_names":["driebit/kenniscloud"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/driebit/kenniscloud","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/driebit%2Fkenniscloud","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/driebit%2Fkenniscloud/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/driebit%2Fkenniscloud/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/driebit%2Fkenniscloud/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/driebit","download_url":"https://codeload.github.com/driebit/kenniscloud/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/driebit%2Fkenniscloud/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30173348,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T07:56:45.623Z","status":"ssl_error","status_checked_at":"2026-03-06T07:55:55.621Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":[],"created_at":"2025-05-19T11:11:15.653Z","updated_at":"2026-03-06T11:02:13.468Z","avatar_url":"https://github.com/driebit.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# KennisCloud\n\n## Overview\n\nThe KennisCloud online platform provides a place to share (publish) insights, findings, questions\nand start discussions on them. Users of the platform are librarians, journalists and other people\nfrom media organisations, scientists and the general public, in particular visitors of public\nlibraries.\n\nIf you would like to contribute to this project make sure to review the [contribution policy](docs/CONTRIBUTION-POLICY.md) first.\n\n### Stack\n\n-   Frontend\n    -   SCSS (css)\n    -   Templating (html)\n    -   [Elm](https://elm-lang.org/) (js)\n-   Backend\n    -   [Zotonic](https://zotonic.com/)\n    -   Erlang\n\n### Setup\n\nTo run this project and make contributions you will need to follow this list:\n\n-   Clone [Zotonic](git@github.com:zotonic/zotonic.git) on your machine and build it\n-   Clone this repository into the `zotonic/apps_user` directory\n-   Make sure to add the site to your `etc/hosts` file `127.0.0.1 kenniscloud.docker.test` this will allow you to access the site in your broswer after compiling the code\n-   Install the frontend dependencies using the below instructions\n    With nixOs:\n\n    -   This project was built using [NixOs](https://nixos.org/) as a dependency management system via `nixpkgs`:\n        -   Add this list of nixpkgs:\n            -   sass\n            -   uglify-js\n            -   elm\n            -   elm-format\n            -   elm-analyse\n            -   elm-test\n            -   elm-upgrade\n            -   elm-review\n            -   go-task\n        -   non-nix packages (these you will need to fetch from github or use another dependency management system):\n            -   autprefixer\n            -   breakpoint-sass\n            -   normalize.css\n        -   running `task` will compile all the frontend code\n\n    Without nixOs:\n\n    -   Using `npm`: (WIP)\n        -   current version is set to v22.14.0.\n        -   run `npm i` to install the frontend deps and task-go\n        -   install elm (recommended method if you use brew `brew install elm elm-format`)\n        -   in the [`style.scss`](priv/lib-src/scss/src/style.scss) stylesheet replace the first 2 lines with the below commented out lines\n        -   in the sass [Taskfile](priv/lib-src/scss/Taskfile.yml) uncomment the `npx sass` script and remove the `sass` lines above.\n        -   in the main [Taskfile](Taskfile.yml) uncomment the `npx babel` scripts and remove the line above each of them.\n        -   run `task` to compile the stylesheets and javascript\n\n**TODO:**\n\n-   import the module stylsheets from ginger foundation into the repository\n\n### Concepts\n\n-   User groups\n    -   Visitors (people without or with a temporary account)\n        -   Not-logged-in visitors are regarded as being in the anonymous (\"anoniem\") user group\n    -   Members (people with a KennisCloud account)\n        -   The user group Members (\"gebruikers\") covers all logged-in users\n    -   Community Librarians\n        -   This user group includes editors (\"redactie\") and managers (\"beheerders\")\n    -   Editors\n    -   Managers\n-   Regions\n    -   Meetups, Knowledge groups and people can have regions\n-   Meetups\n    -   Meetups are events and have participants\n-   Contributions\n-   Discussions\n    -   Discussions take place in the form of remarks on a contribution\n-   Remarks\n    -   A small message in response to a contribution or another remark\n    -   Other KennisCloud members can be mentioned in a remark\n    -   A remark can contain an image\n-   Suggestions\n    -   When adding contributions we would lookup library title suggestions\n        (currently not used as the library API changed)\n    -   When adding contributions we would lookup dbpedia suggestions\n        (currently not used due to dbpedia server problems, we need to switch to the\n        international one)\n    -   When starting to type a mention in a remark, we lookup matching KennisCloud\n        members\n    -   When starting to type a keyword name when signing up, we lookup matches\n-   Topics (keywords or tags)\n    -   Topics can be added by editors or imported from library book title results\n        (currently no new library keywords are imported because of API changes)\n    -   Topics/keywords can be added to Locations (e.g. Regions), Knowledge groups,\n        People, Media (Documents), Meetups, Text resources (e.g. Contributions,\n        References, Remarks)\n-   Knowledge groups (\"Kennisgroepen\" or collaboration groups)\n    -   Discussion groups by topic where knowledge is collected in contributions and\n        references\n    -   Knowledge groups have initiators, members and managers\n    -   They can be linked to a project and/or region\n    -   Meetups are organised from a Knowledge Group\n-   Projects\n    -   Knowledge groups and people can be part of a project\n-   Citizen science (\"Burgerwetenschap\")\n-   Methodologies\n-   Steps (within Methodologies)\n-   Notifications\n    -   When logged in, a user gets notified of mentions and contributions in their\n        Knowledge Groups or in response of their own content via a notification icon\n        in the top navigation bar\n-   KennisCloud Weekly Update (newsletter)\n    -   A newsletter is sent when there are new contributions in Knowledge groups\n        subscribed to\n-   KennisCrowds\n    -   People participating in Meetups\n-   Day Crowds\n    -   A Day Crowd is a special Meetup that resets every night to cater for casual\n        local ad hoc meetings, such as with people just happening to be at the LocHal\n\n## Technology\n\n-   KennisCloud is built on the Erlang (language) / OTP (middleware) system.\n-   Nix is used to manage development environment dependencies.\n-   Data is persisted to a Postgres database.\n-   For building the project `task` is used (instead of `make`).\n\n**TODO** Should we move back to `make` to reduce dependencies? At the moment \"task\" is somewhere in\nour Nix dependencies, but it is not listed as a dep in Zotonic's `shell.nix` file, nor in a `shell.nix`\nfor the KennisCloud project. Currently we have it installed from Driebit's \"dev-env\" `shell.nix` as\n`unstable-pkgs.go-task`.\n\n## Development setup\n\n1. Clone Zotonic\n2. Ensure you can load the Nix environment (see shell.nix in the top-level directory of Zotonic)\n\nThe Nix environment includes Erlang, Postgres, image magick..\n\n### Project installation and builds\n\n1. Clone the Kenniscloud project (`master` branch) into the `apps_user` dir of Zotonic 1\n2. Ensure that `zotonic_driebit_base` and `zotonic_driebit_edit` are also cloned inside the\n   `apps_user` dir (`apps` is reserved for zotonic framework modules, all others should be in `apps_user`)\n3. Run `make` in the Zotonic 1 root dir, to have Zotonic pick up the project\n4. Start the site from the Zotonic site status page\n\nBuilding project assets:\n\n-   `task` to compile elm and scss\n-   `task build-dev` to compile elm in debug mode so you can place debug statements. Scss will also compile.\n\n### Modules\n\nModule dependencies are listed in `priv/zotonic_site.config`.\n\n#### KennisCloud specific modules\n\n-   zotonic_mod_crowdlink\n-   zotonic_mod_crowdparticipant\n-   zotonic_mod_ginger_activity2\n\n#### Zotonic module usage notes\n\nThis site uses the mod_access_url module to grant user access for a single request.\nIt is used for the implementation of one-click unsubscribe links.\n\n1. `cd $PATH_TO_GINGER/modules`\n2. `git clone git@github.com:mworrell/mod_access_url.git`\n\n### KennisCloud support libraries\n\nIn the directory `src/support` you will find libraries to support the\nimplementation of functionalities and infrastructure, like:\n\n-   Data schema and fixtures\n-   Additional ACL rules\n-   Batch operations\n-   Weekly newsletter\n-   Notifications\n-   Working with activity streams (things that happen on the site)\n-   Working with knowledge groups\n-   Web references and suggestions\n-   Integrations with services such as dbpedia (inactive at the moment) and\n    public library services\n-   Turtle format output (RDF/Linked Data)\n-   Ordering Methodology Steps\n\n### Fixtures\n\nThe fixtures in the `src/support/kenniscloud_schema.erl` file includes example\nresources for development and testing, such as `person_community_librarian`.\nThese fixtures can be (re)installed by resetting the datamodel from the Zotonic\nsite status page `/admin/status`.\n\nThe user group of Community Librarians, as well as Project managers) should be a\nsubgroup of Members (and this is the case on production); this is taken care of\nby the function `update_usergroup_hierarchy` in `kenniscloud_schema.erl`.\n\n`Anonymous \u003c Members \u003c (Community Librarians, Project managers) \u003c Editors \u003c Managers \u003c Administrator`\n\n**TODO**: Is it actually correct that all Editors are also CL?\n**TODO**: Is it still the case in Zotonic 1.x?\n\n## Data model\n\n-   The data model is defined in `src/support/kenniscloud_schema.erl` and extends\n    the base Zotonic data model, as described in Zotonic's documentation.\n-   Setting up user groups is part of the data model install procedure executed by\n    a call to `manage_data(install, Context)`.\n-   The installation of the data model covers (re)installing of project specific\n    `modules`, setting default configuration values, setting up parts of the site\n    depending on environment (production, acceptance, test, development) and\n    initialising the Zotonic `#datamodel` with `categories`, `resources`, `edges`,\n    `predicates` and `media`. For an explanation of datamodel concepts, see\n    https://zotonic.com/docs/1277/the-zotonic-data-model\n\n### Special resources\n\n-   Footer menu\n-   Community librarian usergroup\n-   Project manager usergroup\n-   Regions (including a `region_none`)\n-   DCAT Datasets on regions, knowledge groups (collabgroups), meetups,\n    references, contributions, remarks\n-   Methodology resources\n-   Roadmap resources\n-   Avatar fallback image\n\n### Special pages\n\n-   Homepage `page_home` (collection)\n-   Samenwerking VU, OBA en de Waag `vpro_waag_collaboration` (text)\n-   About image rights `page_image_copyright` (text)\n\n### KennisCloud specific categories\n\n-   Reference (\"bron\", is a text)\n-   Contribution (is a text)\n-   Task (is a contribution)\n-   Anonymous participant (is a person)\n-   Remark (\"opmerking\", is a text)\n-   Frequently asked question (is a text)\n-   Region (is a location)\n-   Library keyword (is a keyword)\n-   DCAT dataset (is a query)\n-   Roadmap\n-   Roadmap step\n-   Step option\n-   Project\n-   Organisation\n-   Day crowd event (is a Meetup)\n\n#### Zotonic categories with specific use\n\n-   Knowledge group (=acl_collaboration_group)\n-   Meetup (=event)\n\n### KennisCloud specific predicates\n\n```mermaid\ngraph LR\n    person -- \"like/flag\" --\u003e likeobjects(\"person\u003cbr\u003earticle\u003cbr\u003eevent\u003cbr\u003ereference\u003cbr\u003econtribution\u003cbr\u003eremark\")\n    remark -- mention --\u003e person\n    event -- hasregion --\u003e region\n    collabgroup -- hasextra_faq --\u003e faq\n    collabgroup -- hasextra_rsc --\u003e any\n    collabgroup -- hasextra_doc --\u003e document\n    collabgroup -- hasextra_img --\u003e image\n    collabgroup -- hasregion --\u003e region\n    person -- hasregion --\u003e region\n    hasprojectsubjects(\"event\u003cbr\u003ecollabgroup\u003cbr\u003eperson\") -- hasproject --\u003e project\n    project -- hasprojectinitiator --\u003e organisation\n    project -- hasprojectmanager --\u003e person\n    contribution -- hasreference --\u003e reference\n    contribution -- relation --\u003e reference\n    collabgroup -- hasinitiator --\u003e person\n    roadmap -- hasstep --\u003e roadmap_step\n    roadmap -- resetorder --\u003e roadmap_step\n    roadmap_step -- hasoption --\u003e step_option\n    project -- hasexpertjournalist --\u003e person\n    project -- hasexpertscientist --\u003e person\n    contribution -- hascollabgroup --\u003e collabgroup\n```\n\n### Zotonic predicates with specific use in KennisCloud\n\n-   Meetup attendance through the Zotonic `rsvp` predicate from members to events.\n\n### Data relations kept outside of Zotonic resources\n\n#### Crowd links\n\nA table `crowdlink` links to Meetups via a `crowd_id` (= event rsc id),\nproviding an expiring Meetup Crowd view `url`.\n\nThe table is managed from the `m_crowdlink` model inside the\n`zotonic_mod_crowdlink` module.\n\n#### Crowd participants\n\nA table `crowdparticipant` provides an expiring link between a person and a\nMeetup crowd via `person_id` and `crowd_id` (= event rsc id). The link also\ncarries `name`, `email` and `show_contact` information, which will expire with\nthe whole record to facilitate temporarily and only in-crowd sharing of personal\ndata. After expiration only an anonymous user (person) resource remains.\n\nThe table is managed from the `m_crowdparticipant` model inside the\n`zotonic_mod_crowdparticipant` module.\n\n### Model of contributions\n\n#### Conversations (former category of contributions)\n\n```mermaid\ngraph LR;\n    conversation -- hasreference --\u003e reference;\n    conversation -- author --\u003e person;\n    conversation -- hasdocument --\u003e document;\n\n    reference -- author --\u003e person;\n\n    remark -- about --\u003e conversation{conversation};\n\n    remark -- about --\u003e remark;\n```\n\n#### References\n\n```mermaid\ngraph LR;\n    remark -- about --\u003e reference{reference};\n\n    remark -- about --\u003e remark;\n\n    reference -- author --\u003e person;\n```\n\n#### Contributions model\n\nReferences can't be created by themselves; they are part of contributions (former conversations)\n\n```mermaid\ngraph LR;\n    contribution -- author --\u003e person;\n\n    contribution -- about --\u003e reference;\n\n    reference -- depiction --\u003e media;\n\n    remark -- about --\u003e contribution{contribution};\n\n    remark -- about --\u003e remark;\n```\n\n## User rights (authorisation)\n\n(?) Manually set in production admin\n(K) Set by the kenniscloud project\n(G) Set by module Ginger Base\n\n### Guest (Gast)\n\n-   View all\n-   Create account, start enrollment\n\n### Member (Lid)\n\n-   Frontend edit\n-   Allowed use of modules: `mod_ginger_edit` (K), `mod_ginger_rdf` (K)\n-   Edit profile\n-   Join a knowledge group\n-   Create topics (contributions and meetups)\n-   Can edit posts (but not delete!)\n-   Post a comment\n\n### Knowledge group administrator (Kennisgroep beheerder)\n\n-   Frontend edit\n-   Give permissions to: Log in as user\n-   Must have a white flag next to his/her profile picture\n-   Must have description 'knowledge group manager' in quick profile view\n-   Must be shown second in people overview (after CL)\n-   **Does not exist anymore (???)**\n\n### Project leader/manager (Projectleider)\n\n-   Admin edit\n-   Allowed use of modules: `mod_admin` (K)\n-   Editing projects they are project leader of\n-   Editing knowledge groups of projects are project leader of\n-   View, create, edit, delete, link content in own content groups (is_owner)\n-   View, create, edit, delete, link own content groups (is_owner)\n-   Create knowledge groups\n-   Link, unlink and edit members (person) (temporary too broad rule)\n-   Adding and editing tags\n\n### Community Librarian\n\n-   Allowed use of modules: `mod_admin` (K), `mod_acl_user_groups` (K), `mod_content_groups` (?), `mod_admin_identity` (K)\n-   Admin edit\n-   Create knowledge group\n-   Edit own knowledge group\n-   Manage own knowledge group members\n-   Remove/edit contributions\n-   Can add tags\n-   Add/remove knowledge group administrators (multiple administrators possible)\n-   Set username/password for users\n-   Place people in the correct user group(s)\n-   Must have an orange flag next to their profile picture\n-   Must have the description 'community librarian' in the quick profile view\n-   Must be shown first in the people overview.\n\n### REDACTEUR\n\n-   Allowed use modules: `mod_admin` (G), `mod_menu` (G+K), `mod_seo` (K)\n-   Delete knowledge groups\n-   Create Community Librarians\n-   Adjust all texts on all pages.\n-   Add general pages\n-   Create/adjust choice \u0026 order of knowledge groups on homepage\n\n## Sign-up flow\n\nThe following flow chart shows how sign-up works:\n![Sign-up flow diagram](signup-flow.png \"Sign-up flow\")\n\n## Start new collaboration group mailto links\n\nThe mailto links of the \"Start new collaboration group\" buttons are configured depending on\nthe resource category of the containing page:\n\n-   For Regions: the `email` property of the region resource is inserted as mail destination\n-   For the collaboration groups overview page: the email field of the community librarian\n    user group is used `acl_user_group_community_librarian.email`\n\n## Newsletter\n\nThe automatically generated weekly newsletter consists of the following parts:\n\n-   Header with headlines from news (`short_title`)\n-   Logo and mailheader image\n-   Salutation personalised with the receiver's first name (`name_first`) if present\n    (defaults to `title`)\n-   A list of news (`news`)\n-   A list of updates (`contributions`)\n-   Highlighteds: next meetup (`meetup_next`) and upcoming meetup (next month,\n    `meetup_upcoming`)\n-   Footer with unsubscribe link\n\nand is compiled from content satisfying the following criteria:\n\n-   News (`news`):\n    -   The 3 top items of a maximum of 3 knowledge groups (e.g. if you are member of\n        2 groups and group 1 has 2, and group 2 3 items, the news list will consist\n        of item 1 of group 1, item 1 of group 2, and item 2 of group 1)\n    -   From a maximum of 3 news items each per knowledge group\n    -   Resources of category `news`\n    -   From the default content group `default_content_group` and knowledge groups\n        the receiver is subscribed to\n    -   Sorted descending on `publication_start`\n    -   where `publication_start` is between (and including) today and 6 days ago\n    -   News items created by the recipient are _not excluded_\n-   Updates (`contributions`):\n    -   The top 3 items of a maximum of 3 knowledge groups (see News)\n    -   Resource created less than 7 days ago of any category except remarks\n    -   Resources created by the recipient are excluded\n-   Next meetup (`meetup_next`):\n    -   First (starting from the next day, up to and including 7 days ahead) based\n        on `date_start` within all regions of the recipient\n    -   Resources of category `event`\n    -   Events created by the recipient are excluded\n-   Upcoming meetup (`meetup_upcoming`):\n    -   First (starting 25 days ahead, up to and including 31 days ahead) based on\n        `date_start` within all regions of the recipient\n    -   Resources of category `event`\n    -   Events created by the recipient are excluded\n\n## Knowledge groups (kennisgroepen)\n\n-   Knowledge groups (category unique name `acl_collaboration_group`) are\n    collaboration groups\n-   See https://zotonic.com/docs/1752/mod_acl_user_groups and (rationale)\n    https://github.com/zotonic/zotonic/issues/1099\n-   Collaboration groups have members and managers, with their own acl rules\n-   The content group of a knowledge (collaboration) group is itself\n-   KennisCloud members who are linked to a knowledge group using the\n    `collabmember` or `collabmanager` predicate are _knowledge group member_\n-   Previously, project managers (project leaders) and project experts (journalists\n    and scientists) were shown as participating in all knowledge groups linked to\n    their projects, but **this is not the case anymore**: they have to be a member\n    or manager of the knowledge group to get listed.\n    -   `Collabgroup -\u003e hasproject -\u003e Project -\u003e hasprojectmanager -\u003e Person`\n    -   `Collabgroup -\u003e hasproject -\u003e Project -\u003e hasexpertjournalist -\u003e Person`\n    -   `Collabgroup -\u003e hasproject -\u003e Project -\u003e hasexpertscientist -\u003e Person`\n\n## Projects\n\nIn context of the integration of for example the 'Burgerwetenschap' project.\n\n### Project managers\n\nLink to project with `hasprojectmanager`. Using `hascollabmanager` creates a\nhigher risk of confusion.\n\n### Projects\n\nProjects are used to bundle multiple collaboration groups within a project topic\nand community.\n\n-   The project page design looks a lot like the landing page of a region\n-   Projects are not region specific (yet)\n-   Can span multiple collaboration groups\n\nProjects are initiated by a collaboration of organisations.\nAt the moment, organisations are separate entities connected to projects via the `hasprojectinitiator` predicate.\n\nHowever, there is also supposed to be a page describing the collaboration between the organisations.\nAt the moment, there is just one hardcoded page for the collaboration between VU, OBA, and Waag Futurelab.\nIn the future, we want to change this by replacing the \"Organisation\" category with a \"Collaboration\" category.\nCollaborations will hold the logo's of the organisations and describe the collaborations.\nThey could be connected to projects via a `has_initiating_collaboration` predicate.\n\n### Journalists and scientists, and the data model\n\nJournalists and scientists are specialists/experts whose recognised roles should be visible\nwithin projects.\n\n```mermaid\ngraph LR;\n  collection_expert_predicates -- haspart --\u003e hasexpertjournalist\n  collection_expert_predicates -- haspart --\u003e hasexpertscientist\n```\n\nEdges:\n\n-   `Project` `hasexpertjournalist` `Person`\n-   `Project` `hasexpertscientist` `Person`\n-   `Project` `hasprojectmanager` `Person`\n-   `Project` `hasprojectinitiator` `Organisation`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdriebit%2Fkenniscloud","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdriebit%2Fkenniscloud","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdriebit%2Fkenniscloud/lists"}