A product by Railslove commissioned by the City of Cologne.
- Intro
- Why this App?
- How does it work?
- Security and Privacy Questions
- Integration Guidelines
- Contribute
- Reporting Bugs and Feaures
- License
Meine Checkins is a Meta-App which allows you to perform a #covid19-checkin (e.g. in a restaurant) independent of the provider. It was developed, because there was a huge demand on the market for one particular app.
In times of COVID we have to fill a lot of check-in forms at local businesses in Germany to leave a trace so is possible to prevent the spread. Because of this data filling there is also a concern about data privacy. This app solves both problems by making easier to fill those forms and keeping data safe on the user’s phone.
The way data is traced by local businesses is that they usually provide a QR code sticker at the table that customers can scan. That code redirects the user to a website were they are asked to fill this check-in information (name, address, phone number).
The app will automatically fill these check-in forms for the user.
First time the app will ask the user to fill its data letting the user know the data will stay private and stored on the phone. After this step the user can scan a QR code and have the check-in form automatically filled within the app.
Navigation to the current check-in and a journal of check-ins the user filled in with the app.
All this information is stored in the phone.
- React Native for rendering
- TypeScript for typing
- redux for state management
- react-i18next for internationalization
Follow the environment setup for react native. Some basic knowledge of TypeScript and redux would be useful but you can also have a look at the codebase.
Once you have setup your environment
- install
node
version15
throughnvm
(needed this app Xcode build) - install dependencies with
yarn install
and thencd ios && pod install
- run
yarn sentry-wizard
- add an
.env
file with the values at.env.sample
- run the development server with
yarn start
- build the app and run it on a device with
yarn ios
oryarn android
For deployment we have Semaphore CI setup. Once a release is ready create a branch with that release name. Test it and once is ready tag it. After that go to Semaphore and start the builds for promoting the app to Google Play and TestFlight. After that you will have to follow the steps needed for each platform to publish the app to the Play Store and App Store.
To increment the patch
version simply do npm version patch
for the minor version npm version minor
. The code is setup in a way that it will automatically change the build number and ios / android versions according to this (through the postversion
script that runs after npm version
see package.json
).
For testing different providers, in development mode, you can add the provider check-in url to src/testData.ts
. This list will appear on the Scan QR screen and you can tap on them instead of scanning them while working on the simulator.
You can also have a look at the test wiki for more information on how to test real QRs.
If you have an android
phone you can test the app connecting the phone through USB
and then running yarn android
. Here more information: https://reactnative.dev/docs/running-on-device
GNU AGPL (GNU Affero General Public License v3.0)
To report bugs and features refer to our backlog.
What customer information gets collected?
No customer information are collected. We only store the Name, Surname, Street, ZIP, City and the Phone number on the phone.
Who will have access to this information?
Only the user has access to this information. If the user perform a “check in” with a given checkin service (scanning the QR code) the information will be passed locally to the service provider and will be processed by the provider. The provider is then responsible to store the data encrypted and secure and inform the user about his data privacy rules.
Where will information be stored?
The information will stored on the phone and after a checkin on the servers of the checkin-service-partner.
When will information be deleted?
The information stored on the phone can be deleted anytime by the user. After a checkin with a service provider the data are stored for max. 4 weeks (according to the german law Coronaschutzverordnung - CoronaSchuVO)
Will users be informed of a possible COVID infection?
No, the users will not be informed about a possible COVID infection by the app itself.
How can the Incognito-mode be activated?
Incognito mode is always used on the WebView within the app.
What permissions does the app ask for (location, bluetooth, contacts, HealthKit, Clinical Health Records etc.) and what are the permissions strings for each? If necessary, please provide English translations of the permission string.
The app asks only about the permission to use the camera to scan the barcode.
What personal information does the app require? List each separately with reasons why it’s required.
Name, Surname, Street, ZIP, City and the Phone number. The information are required to perform a location checkin in a venue required by the german law (Coronaschutzverordnung - CoronaSchuVO)
What personal information is optional? List each separately with reasons why the app is requesting it.
All information are mandatory.
Who in your organization has access to the information you collect?
Nobody at our organization has access to the information because the information is stored on the phone of the user only.
Is any of this data shared with any other parties? If so, provide details.
The data are shared locally (via Javascript) to third party checkin providers to fullfill the requirement of the german law (Coronaschutzverordnung - CoronaSchuVO). We’re performing checks if third party providers fullfill and follow the german privacy rules (DSGVO - Datenschutz). A list of apps is listed here: https://github.com/railslove/meine-checkins/issues?q=is%3Aissue+is%3Aopen+label%3A%22integration+done%22"
Beyond the permissions already described, what other disclosures and user consent steps does the app contain?
No other steps are required.
What jurisdiction(s) (i.e. region, state, country, etc.) is this app intended for?
The app is only usable in Germany.
Has this app been authorized for use by the government of that jurisdiction?
The app is authorized by the city of Cologne (Stadt Köln): stadt-koeln.de
Is the jurisdiction this app is intended for use in expected to change or expand?
No.
- Fünf Forderungen an eine bundesweite Check-In-App zur Kontaktnachverfolgung - https://d-64.org/check-in-app/
- 10 Prüfsteine für die Beurteilung von „Contact Tracing“-Apps - https://www.ccc.de/de/updates/2020/contact-tracing-requirements
- Gemeinsame Stellungnahme zur digitalen Kontaktnachverfolgung - https://digikoletter.github.io/
- Data stored in the app only
- Data copied into the the form of the checkin provider
- Reading data from the checkin-page (name of the place, confirmation information)
- Storing contact tracing entry on the phone
- All data stored locally
-
Check-in form inputs should use
autocomplete
attributes forname
(orgiven-name
andfamily-name
separately)tel
street-address
postal-code
address-level2
-
For signaling check-in and check-out to the app
- the
check-in
element should have adata-wfd-action="check-in"
- the
check-out
element should have adata-wfd-action="check-out"
- the
-
Other data
- the
location
name on an element (can be anything) withdata-wfd-location="<restaurant-name>"
- the
Here is how the check-in form should look like.
The order of the fields doesn't matter.
You can include the location
on the check-in
or in the check-out
page.
<!-- using name only for the full user name -->
<form data-wfd-location="Frische Küche Restaurant">
<input autocomplete="name" type="text" />
<input autocomplete="tel" type="text" />
<input autocomplete="street-address" type="text" />
<input autocomplete="postal-code" type="text" />
<input autocomplete="address-level2" type="text" />
<button data-wfd-action="check-in" type="submit">check-in</button>
</form>
<!-- using first and last name separately -->
<form data-wfd-location="Frische Küche Restaurant">
<input autocomplete="given-name" type="text" />
<input autocomplete="family-name" type="text" />
<input autocomplete="tel" type="text" />
<input autocomplete="street-address" type="text" />
<input autocomplete="postal-code" type="text" />
<input autocomplete="address-level2" type="text" />
<button data-wfd-action="check-in" type="submit">check-in</button>
</form>
Example check-out page
<form data-wfd-location="Café um die Ecke">
<button data-wfd-action="check-out" type="submit">check-out</button>
</form>
Other data like the location can be added to any element. In these examples was added to the form for simplicity.
to be done
- Edit the provider-admission.json and make a pull-request
- The provider-admission.json contains following information: ** name of the provider ** logo url ** checkin-page url ** link to the security paper or open source repository (file) explaining the security concept
- Pull-request will be reviewed by core commitors