{"id":48896882,"url":"https://github.com/michigg/web-sense","last_synced_at":"2026-04-16T11:06:26.320Z","repository":{"id":53453518,"uuid":"471723868","full_name":"michigg/web-sense","owner":"michigg","description":"With this project a web based crowd sensing framework should be developed","archived":false,"fork":false,"pushed_at":"2024-07-27T12:03:39.000Z","size":17593,"stargazers_count":4,"open_issues_count":22,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-07-28T13:04:11.168Z","etag":null,"topics":["crowdsensing","progressive-web-app","typescript","vuejs"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/michigg.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":"2022-03-19T14:45:47.000Z","updated_at":"2024-07-27T12:03:01.000Z","dependencies_parsed_at":"2024-07-27T13:05:05.979Z","dependency_job_id":null,"html_url":"https://github.com/michigg/web-sense","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/michigg/web-sense","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michigg%2Fweb-sense","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michigg%2Fweb-sense/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michigg%2Fweb-sense/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michigg%2Fweb-sense/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/michigg","download_url":"https://codeload.github.com/michigg/web-sense/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michigg%2Fweb-sense/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31882936,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T09:23:21.276Z","status":"ssl_error","status_checked_at":"2026-04-16T09:23:15.028Z","response_time":69,"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":["crowdsensing","progressive-web-app","typescript","vuejs"],"created_at":"2026-04-16T11:06:26.185Z","updated_at":"2026-04-16T11:06:26.311Z","avatar_url":"https://github.com/michigg.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WebSense\n[![Build Status](https://github.drone.michigg.de/api/badges/michigg/web-sense/status.svg)](https://github.drone.michigg.de/michigg/web-sense) [![Quality Gate Status](https://sonarqube.michigg.de/api/project_badges/measure?project=michigg%3Aweb-sense\u0026metric=alert_status)](https://sonarqube.michigg.de/dashboard?id=michigg%3Aweb-sense) [![Coverage](https://sonarqube.michigg.de/api/project_badges/measure?project=michigg%3Aweb-sense\u0026metric=coverage)](https://sonarqube.michigg.de/dashboard?id=michigg%3Aweb-sense)\n\nThis project was created during a master thesis.\n\nWith this project we want to evaluate a web based approach for mobile crowd sensing frameworks. Currently, the noise measurement use case is implemented as an application example. Usually, crowd sensing\nframeworks use native applications for their clients. For example [Medusa](https://github.com/USC-NSL/Medusa) and [AWARE](https://awareframework.com/).\n\nThis would lead to a high implementation effort because both iOS and Android applications need to be implemented. Therefore, a progressive web app is used as an alternative way to create a crowd sensing application that runs on any device with a browser. This is a prototype to evaluate the possibilities of a web based crowd sensing framework. The prototype was evaluated by experts and thereafter by a qualitative user study. The implementation process shows that a web based approach cannot offer opportunistic crowd sensing use cases because sensors cannot run in the background yet. An implementation using the PWA approach does not have the capabilities of a native app because some sensors of the mobile device that native applications can access are not accessible using web technologies.\n\n## Repository Notes\nLabel and emoji ideas are from:\n- https://gitmoji.dev/\n- https://seantrane.com/posts/logical-colorful-github-labels-18230/\n- https://medium.com/@dave_lunny/sane-github-labels-c5d2e6004b63\n\nCommit messages shall use the structure defined by Conventional Commits: https://www.conventionalcommits.org/en/v1.0.0/\n\n## Repository Structure\n- 📁 `backend`: Includes source code and build files for the nginx API server\n- 📁 `frontend`: Includes source code and build files for PWA client\n- 📄 `docker-compose.prod.yml`: Builds and starts the prototype production ready (Both backend and frontend)\n- 📄 `docker-compose.yml`: Builds and starts the prototype development ready (Both backend and frontend)\n- 📄 `sonar-project.properties`: [SonarQube](https://www.sonarqube.org/) configuration used for code quality analysis\n\nFor further information see the `README.md` files in the folders that were presented.\n\n## Screen Design\n### Tasks\nThe following screenshots show the task selection (left) and the task \"Lärm in der Stadt\" (right) \n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/tasks.png\" width=\"30%\" /\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise.png\" width=\"30%\" /\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-bottom.png\" width=\"30%\" /\u003e \n\u003c/p\u003e\n\n\n### Task Execution\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-activity-noise-top.png\" width=\"30%\" /\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-activity-noise-bottom.png\" width=\"30%\" /\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-activity-noise-bottom-running.png\" width=\"30%\" /\u003e \n\u003c/p\u003e\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-activity-survey-top.png\" width=\"30%\" /\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-activity-survey-bottom.png\" width=\"30%\" /\u003e\n\u003c/p\u003e\n\n### Task Results\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-finished-top.png\" width=\"30%\" /\u003e \n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-finished-middle.png\" width=\"30%\" /\u003e\n\u003c/p\u003e\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-finished-middle-graph.png\" width=\"30%\" /\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-finished-middle-graph-2.png\" width=\"30%\" /\u003e\n \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-finished-middle-graph-3.png\" width=\"30%\" /\u003e\n\u003c/p\u003e\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-finished-middle-graph-metadata-open.png\" width=\"30%\" /\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-finished-middle-survey.png\" width=\"30%\" /\u003e \n  \u003cimg src=\"./documentation/screenshots/prototype2/task-noise-finished-bottom.png\" width=\"30%\" /\u003e\n\u003c/p\u003e\n\n### Measurements\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/measurements.png\" width=\"30%\" /\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/measurement-top.png\" width=\"30%\" /\u003e \n  \u003cimg src=\"./documentation/screenshots/prototype2/measurement-bottom.png\" width=\"30%\" /\u003e\n\u003c/p\u003e\n\n### Settings\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/settings.png\" width=\"30%\" /\u003e\n  \u003cimg src=\"./documentation/screenshots/prototype2/settings-bottom.png\" width=\"30%\" /\u003e \n\u003c/p\u003e\n\n## System Design\nThe vizualization of the software architecture was created with the [C4 model](https://c4model.com/). C4 stands for context, container, component and code.\n### Context\nThis diagram shows the system within its environment.\n![This is an image](./documentation/diagrams/c4/C4_Context.png)\n\n### Container\nShows the different high level software parts like the different applications and the internal services.\n![This is an image](./documentation/diagrams/c4/C4_Container.png)\n\n### Component - PWA\nIt zooms into the previously shown services and displays their internal components.\n![This is an image](./documentation/diagrams/c4/C4_Component.png)\n\n## Extensability\n### Task Configuration\nExample\n\n```\n[\n  {\n    \"id\": 1,\n    \"title\": \"Lärm in der Stadt\",\n    \"description\": \"Mit der Teilnahme bei 'Lärm in der Stadt' kannst du die lautesten und leisesten Orte in deiner Stadt entdecken. Benutze einfach dein Smartphone und nehme mit Hilfe des Mikrofons den Lärm in deiner Umgebung auf. Abschließend kannst du uns noch mit deinem persönlichen Lärmempfinden weiterhelfen.\",\n    \"inputDescriptions\": {\n      \"GEOLOCATION\": \"Die Position wird benötigt, damit wir wissen, wo der Lärm auftrat.\",\n      \"MIC\": \"Das Mikrofon wird zur Aufnahme des Umgebungslärms genutzt. Es wird dabei keine Sprachaufnahme angefertigt.\",\n      \"SURVEY\": \"Die Umfrage nutzen wir, um uns einen besseren Eindruck von der Lärmbeschaffenheit zu machen.\"\n    },\n    \"steps\": [\n      {\n        \"id\": \"noise-step-1\",\n        \"type\": \"SensorTaskStep\",\n        \"title\": \"Umgebungslärm aufnehmen\",\n        \"description\": \"In diesem Schritt misst du den Umgebungslärm mit deinem Mikrofon im Smartphone. Bevor es los geht bitten wir dich die nachfolgenden Schritte zu beachten.\",\n        \"instructions\": [\n          {\n            \"title\": \"Vorraussetzung\",\n            \"description\": \"Da wir uns für den Lärm in der Stadt interessieren, bitten wir dich, Aufnahmen nur außerhalb von geschlossenen Einrichtungen wie Wohnungen oder öffentlichen Gebäuden zu machen.\"\n          },\n          {\n            \"title\": \"Halte dein Smartphone richtig\",\n            \"image\": {\n              \"src\": \"/img/noise/noise-smartphone-position.jpg\",\n              \"alt\": \"placeholder\"\n            },\n            \"description\": \",Damit die Aufnahmen so präzise wie möglich werden, halte dein Smarphone vor dir in Brusthöhe und halte es von dir Weg.\"\n          },\n          {\n            \"title\": \"Ein Moment der Stille\",\n            \"description\": \"Die Aufnahme dauert etwa 10 Sekunden. Wichtig ist, dass du dich während der Aufnahme ruhig verhälst. Wir wollen ja nur den Umgebungslärm messen. ;)\"\n          }\n        ],\n        \"activityComponentName\": \"ActivityNoiseMeasurement\",\n        \"inputTypes\": [\n          \"GEOLOCATION\",\n          \"MIC\"\n        ],\n        \"resultActivityComponentName\": \"ActivityNoiseQuantitativeMeasurement\"\n      },\n      {\n        \"id\": \"noise-step-2\",\n        \"type\": \"SurveyTaskStep\",\n        \"title\": \"Subjektive Wahrnehmung\",\n        \"description\": \"Mit dieser Umfrage kannst du uns helfen die Lärmquelle besser einzuschätzen.\",\n        \"instructions\": [],\n        \"questions\": [\n          {\n            \"id\": \"question-1\",\n            \"type\": \"TEXT\",\n            \"title\": \"Lärmquelle\",\n            \"question\": \"Was hat deiner Meinung nach den Lärm verursacht?\"\n          },\n          {\n            \"id\": \"question-2\",\n            \"type\": \"TEXT\",\n            \"title\": \"Lärmeigenschaft\",\n            \"question\": \"Wie würdest du den Lärm beschreiben? (Bsp.: Impulsartig, gleichmäßig langanhaltend)\"\n          },\n          {\n            \"id\": \"question-3\",\n            \"type\": \"SINGLE_CHOICE\",\n            \"title\": \"Lärmfrequenz\",\n            \"question\": \"Wie häufig tritt deiner Meinung nach der Lärm auf?\",\n            \"options\": [\n              {\n                \"value\": \"oneTimePerWeek\",\n                \"text\": \"Einmal in der Woche\"\n              },\n              {\n                \"value\": \"manyTimesPerWeek\",\n                \"text\": \"Mehrmals in der Woche\"\n              },\n              {\n                \"value\": \"daily\",\n                \"text\": \"Täglich\"\n              },\n              {\n                \"value\": \"manyTimesPerDay\",\n                \"text\": \"Mehrmals am Tag\"\n              },\n              {\n                \"value\": \"noSpecification\",\n                \"text\": \"Weiß ich nicht\"\n              }\n            ]\n          },\n          {\n            \"id\": \"question-4\",\n            \"type\": \"SINGLE_CHOICE\",\n            \"title\": \"Belästigungsgrad\",\n            \"question\": \"Wie sehr empfindest du den Umgebungslärm als störend?\",\n            \"options\": [\n              {\n                \"value\": \"veryAnnoying\",\n                \"text\": \"Äußerst störend\"\n              },\n              {\n                \"value\": \"stronglyAnnoying\",\n                \"text\": \"Stark störend\"\n              },\n              {\n                \"value\": \"mediumAnnoying\",\n                \"text\": \"Mittelmäßig störend\"\n              },\n              {\n                \"value\": \"smallAnnoying\",\n                \"text\": \"Etwas störend\"\n              },\n              {\n                \"value\": \"notAnnoying\",\n                \"text\": \"Überhaupt nicht störend\"\n              },\n              {\n                \"value\": \"noSpecification\",\n                \"text\": \"Weiß ich nicht\"\n              }\n            ]\n          }\n        ],\n        \"resultActivityComponentName\": \"ActivityNoiseQualitativeMeasurement\"\n      }\n    ]\n  },\n  {\n    \"id\": 2,\n    \"title\": \"Staualarm\",\n    \"description\": \"I love cake chocolate cake marshmallow sugar plum powder. Shortbread pie jelly-o bonbon icing. I love gingerbread topping donut fruitcake cupcake. Gummies gummi bears chocolate bar oat cake candy canes. Bear claw candy canes gummies carrot cake I love biscuit lollipop muffin. Toffee jelly beans halvah halvah topping muffin lollipop. Lemon drops cookie pastry brownie fruitcake dragée bonbon. Dragée pie marshmallow cheesecake pastry. Marshmallow candy canes powder jelly beans I love. Jelly beans pie I love macaroon marzipan danish tiramisu.\",\n    \"inputDescriptions\": {\n      \"GEOLOCATION\": \"Cupcake ipsum dolor sit amet tootsie roll tootsie roll jelly-o\",\n      \"DUMMY\": \"Cupcake ipsum dolor sit amet tootsie roll tootsie roll jelly-o\"\n    },\n    \"steps\": [\n      {\n        \"id\": \"smell-step-1\",\n        \"type\": \"SensorTaskStep\",\n        \"title\": \"Durchführung\",\n        \"description\": \"Drücken Sie auf Start. Füllen Sie anschließend das angezeigte Formular aus.\",\n        \"instructions\": [],\n        \"activityComponentName\": \"ActivityNoiseMeasurement\",\n        \"inputTypes\": [\n          \"GEOLOCATION\",\n          \"DUMMY\"\n        ]\n      }\n    ]\n  },\n  {\n    \"id\": 3,\n    \"title\": \"Mülljäger\",\n    \"description\": \"Jelly beans caramels pastry toffee tiramisu croissant wafer. Powder jujubes icing jelly cake I love I love marzipan. Cupcake candy bonbon I love dessert. Bear claw tiramisu apple pie brownie bear claw I love. Cotton candy I love cookie muffin cheesecake sesame snaps donut. I love liquorice candy canes sugar plum apple pie. Carrot cake gummies fruitcake pudding tart bonbon liquorice. Dessert danish chocolate cake bear claw pastry carrot cake sesame snaps tiramisu gummies.\",\n    \"inputDescriptions\": {\n      \"GEOLOCATION\": \"Cupcake ipsum dolor sit amet tootsie roll tootsie roll jelly-o\",\n      \"SURVEY\": \"Cupcake ipsum dolor sit amet tootsie roll tootsie roll jelly-o\",\n      \"DUMMY\": \"Cupcake ipsum dolor sit amet tootsie roll tootsie roll jelly-o\"\n    },\n    \"steps\": [\n      {\n        \"id\": \"waste-step-1\",\n        \"type\": \"SensorTaskStep\",\n        \"title\": \"Durchführung\",\n        \"description\": \"cupcake ipsum dolor sit amet tootsie roll tootsie roll jelly-o.\",\n        \"instructions\": [],\n        \"activityComponentName\": \"ActivityNoiseMeasurement\",\n        \"inputTypes\": [\n          \"GEOLOCATION\",\n          \"DUMMY\"\n        ]\n      },\n      {\n        \"id\": \"waste-step-2\",\n        \"type\": \"SurveyTaskStep\",\n        \"title\": \"Durchführung\",\n        \"description\": \"cupcake ipsum dolor sit amet tootsie roll tootsie roll jelly-o.\",\n        \"instructions\": [],\n        \"questions\": []\n      }\n    ]\n  }\n]\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichigg%2Fweb-sense","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmichigg%2Fweb-sense","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichigg%2Fweb-sense/lists"}