├── .prettierrc.json ├── images ├── greg.png ├── image-1.png ├── image-2.png ├── image-3.png ├── image-4.png ├── mockup.png ├── paypal.png ├── bitcoin_rcv.png ├── greg_mockup.xcf ├── kaios-marketing-banner.png └── helper.svg ├── .prettierrc ├── docs ├── assets │ ├── icons │ │ ├── intro.png │ │ ├── icon-56-56.png │ │ ├── icon-112-112.png │ │ └── intro.svg │ ├── image │ │ ├── caldav.png │ │ ├── waiting.png │ │ ├── google_button.png │ │ ├── 1F503.svg │ │ ├── E252.svg │ │ ├── 2B07.svg │ │ ├── bell.svg │ │ ├── picture.svg │ │ ├── E261.svg │ │ ├── E262.svg │ │ ├── E264.svg │ │ ├── E257.svg │ │ ├── option.svg │ │ ├── add.svg │ │ ├── E25C.svg │ │ ├── calendar.svg │ │ ├── pencil.svg │ │ ├── delete-red.svg │ │ ├── delete.svg │ │ ├── list.svg │ │ ├── person.svg │ │ └── E1D8.svg │ └── fonts │ │ └── Roboto-Medium.ttf ├── Roboto-Medium.44d94bd3.ttf ├── E264.fecca750.svg ├── sitemap.xml ├── index.3b283937.css ├── index.html ├── manifest.webmanifest ├── manifest.webapp ├── index.5671dcd7.css ├── about.html └── datenschutz.html ├── application ├── assets │ ├── icons │ │ ├── intro.png │ │ ├── icon-56-56.png │ │ ├── icon-112-112.png │ │ └── intro.svg │ ├── image │ │ ├── caldav.png │ │ ├── waiting.png │ │ ├── google_button.png │ │ ├── 1F503.svg │ │ ├── E252.svg │ │ ├── 2B07.svg │ │ ├── bell.svg │ │ ├── picture.svg │ │ ├── E261.svg │ │ ├── E262.svg │ │ ├── E264.svg │ │ ├── E257.svg │ │ ├── option.svg │ │ ├── add.svg │ │ ├── E25C.svg │ │ ├── calendar.svg │ │ ├── pencil.svg │ │ ├── delete-red.svg │ │ ├── delete.svg │ │ ├── list.svg │ │ ├── person.svg │ │ └── E1D8.svg │ ├── fonts │ │ └── Roboto-Medium.ttf │ ├── js │ │ ├── ads.js │ │ ├── eximport.js │ │ ├── scan.js │ │ ├── shim-xhr-to-fetch.js │ │ └── kaiads.v5.min.js │ └── css │ │ ├── qr-reader.css │ │ └── grid.css ├── sitemap.xml ├── index.html ├── manifest.webmanifest ├── manifest.webapp ├── about.html └── datenschutz.html ├── .gitignore ├── webpage-uploader.sh ├── .babelrc ├── LICENSE.md ├── README.md └── package.json /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignore": ["**/@ts-ignore"] 3 | } 4 | -------------------------------------------------------------------------------- /images/greg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/images/greg.png -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "ignore": ["**/@ts-ignore"], 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /images/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/images/image-1.png -------------------------------------------------------------------------------- /images/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/images/image-2.png -------------------------------------------------------------------------------- /images/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/images/image-3.png -------------------------------------------------------------------------------- /images/image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/images/image-4.png -------------------------------------------------------------------------------- /images/mockup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/images/mockup.png -------------------------------------------------------------------------------- /images/paypal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/images/paypal.png -------------------------------------------------------------------------------- /images/bitcoin_rcv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/images/bitcoin_rcv.png -------------------------------------------------------------------------------- /images/greg_mockup.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/images/greg_mockup.xcf -------------------------------------------------------------------------------- /docs/assets/icons/intro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/icons/intro.png -------------------------------------------------------------------------------- /docs/assets/image/caldav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/image/caldav.png -------------------------------------------------------------------------------- /docs/assets/image/waiting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/image/waiting.png -------------------------------------------------------------------------------- /docs/Roboto-Medium.44d94bd3.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/Roboto-Medium.44d94bd3.ttf -------------------------------------------------------------------------------- /docs/assets/icons/icon-56-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/icons/icon-56-56.png -------------------------------------------------------------------------------- /images/kaios-marketing-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/images/kaios-marketing-banner.png -------------------------------------------------------------------------------- /application/assets/icons/intro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/icons/intro.png -------------------------------------------------------------------------------- /application/assets/image/caldav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/image/caldav.png -------------------------------------------------------------------------------- /docs/assets/fonts/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/fonts/Roboto-Medium.ttf -------------------------------------------------------------------------------- /docs/assets/icons/icon-112-112.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/icons/icon-112-112.png -------------------------------------------------------------------------------- /docs/assets/image/google_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/image/google_button.png -------------------------------------------------------------------------------- /application/assets/image/waiting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/image/waiting.png -------------------------------------------------------------------------------- /application/assets/icons/icon-56-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/icons/icon-56-56.png -------------------------------------------------------------------------------- /application/assets/fonts/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/fonts/Roboto-Medium.ttf -------------------------------------------------------------------------------- /application/assets/icons/icon-112-112.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/icons/icon-112-112.png -------------------------------------------------------------------------------- /application/assets/image/google_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/image/google_button.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | node_modules/* 3 | .parcel-cache 4 | build/* 5 | dist/* 6 | dist 7 | build 8 | .cache 9 | application/assets/js/google_cred.js 10 | application/google_cred.js 11 | .env 12 | 13 | -------------------------------------------------------------------------------- /webpage-uploader.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | npm run web << EOF 4 | ssh perry7@biela.uberspace.de << 'EOF' 5 | cd /var/www/virtual/perry7/greg.strukturart.com/ 6 | rm -rf * 7 | 8 | 9 | EOF 10 | if [ -d "docs" ]; then 11 | cd docs/ 12 | rsync -avz . perry7@biela.uberspace.de:/var/www/virtual/perry7/greg.strukturart.com/ 13 | fi 14 | 15 | 16 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "exclude": ["node_modules/@babel/**"], 3 | "presets": [], 4 | "plugins": [ 5 | "@babel/plugin-transform-named-capturing-groups-regex", 6 | "@babel/plugin-syntax-dynamic-import", 7 | [ 8 | "@babel/plugin-transform-runtime", 9 | { 10 | "regenerator": false, 11 | "useESModules": true 12 | } 13 | ] 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /docs/E264.fecca750.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/assets/image/1F503.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /application/assets/image/1F503.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /docs/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | https://greg.strukturart.com/index 6 | 2024-10-17 7 | 1.00 8 | weekly 9 | 10 | 11 | 12 | https://greg.strukturart.com/about 13 | 2024-10-17 14 | 0.80 15 | monthly 16 | 17 | 18 | 19 | https://greg.strukturart.com/datenschutz 20 | 2024-10-17 21 | 0.85 22 | monthly 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /application/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | https://greg.strukturart.com/index 6 | 2024-10-17 7 | 1.00 8 | weekly 9 | 10 | 11 | 12 | https://greg.strukturart.com/about 13 | 2024-10-17 14 | 0.80 15 | monthly 16 | 17 | 18 | 19 | https://greg.strukturart.com/datenschutz 20 | 2024-10-17 21 | 0.85 22 | monthly 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /docs/assets/image/E252.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /application/assets/image/E252.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /docs/assets/image/2B07.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /application/assets/image/2B07.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /docs/assets/image/bell.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /application/assets/image/bell.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /application/assets/js/ads.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | export let load_ads = function () { 4 | getKaiAd({ 5 | publisher: '4408b6fa-4e1d-438f-af4d-f3be2fa97208', 6 | app: 'greg', 7 | slot: 'greg', 8 | test: 0, 9 | timeout: 10000, 10 | h: 120, 11 | w: 240, 12 | container: document.getElementById('KaiOSAds-Wrapper'), 13 | onerror: (err) => console.error('Error:', err), 14 | onready: (ad) => { 15 | // user clicked the ad 16 | ad.on('click', () => console.log('click event')); 17 | 18 | // user closed the ad (currently only with fullscreen) 19 | ad.on('close', () => console.log('close event')); 20 | 21 | // the ad succesfully displayed 22 | ad.on('display', () => { 23 | console.log('yeah'); 24 | }); 25 | 26 | // Ad is ready to be displayed 27 | // calling 'display' will display the ad 28 | ad.call('display', { 29 | navClass: 'item', 30 | display: 'block', 31 | }); 32 | }, 33 | }); 34 | }; 35 | -------------------------------------------------------------------------------- /docs/assets/image/picture.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/index.3b283937.css: -------------------------------------------------------------------------------- 1 | div#qr-screen{z-index:200000;z-index:2147483647;min-width:100vw;min-height:100vh;display:none;position:fixed;top:0;left:0}#video{width:auto;min-width:100%;height:auto;min-height:100%;position:fixed;bottom:0;right:0}#startDecoding{color:#fff;text-align:center;background:#0095dd;-moz-border-radius:40px;border-radius:40px;width:150px;margin:-30px 0 0 -95px;padding:20px;font-family:Arial,sans;font-size:20px;position:fixed;top:50%;left:50%}#corner-nw,#corner-no,#corner-so,#corner-sw{border:6px solid #fff;width:30px;height:30px;position:fixed}#corner-nw{border-bottom:0;border-right:0;-moz-border-top-left-radius:20px;border-top-left-radius:20px;top:20px;left:20px}#corner-no{border-bottom:0;border-left:0;-moz-border-top-right-radius:20px;border-top-right-radius:20px;top:20px;right:20px}#corner-so{border-top:0;border-left:0;-moz-border-bottom-right-radius:20px;border-bottom-right-radius:20px;bottom:20px;right:20px}#corner-sw{border-top:0;border-right:0;-moz-border-bottom-left-radius:20px;border-bottom-left-radius:20px;bottom:20px;left:20px} -------------------------------------------------------------------------------- /application/assets/image/picture.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /application/assets/js/eximport.js: -------------------------------------------------------------------------------- 1 | export let export_ical = function (filename, data, callback) { 2 | let file = new Blob([data.trim()], { type: 'text/calendar' }); 3 | 4 | function writeFile(sdcard) { 5 | let del = sdcard.delete(filename); 6 | del.onsuccess = function () { 7 | let add = sdcard.addNamed(file, filename); 8 | add.onsuccess = () => callback('backup written'); 9 | add.onerror = () => callback('Unable to write the file'); 10 | }; 11 | del.onerror = function () { 12 | // Falls Datei nicht existiert → trotzdem schreiben 13 | let add = sdcard.addNamed(file, filename); 14 | add.onsuccess = () => callback('backup written'); 15 | add.onerror = () => callback('Unable to write the file'); 16 | }; 17 | } 18 | 19 | try { 20 | if ('b2g' in navigator) { 21 | // KaiOS 3.x 22 | let sdcard = navigator.b2g.getDeviceStorage('sdcard'); 23 | writeFile(sdcard); 24 | } else { 25 | // KaiOS 2.x 26 | let sdcard = navigator.getDeviceStorage('sdcard'); 27 | writeFile(sdcard); 28 | } 29 | } catch (e) { 30 | console.log('DeviceStorage error:', e); 31 | callback('Storage access failed'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | greg
-------------------------------------------------------------------------------- /application/assets/css/qr-reader.css: -------------------------------------------------------------------------------- 1 | div#qr-screen { 2 | top: 0; 3 | left: 0; 4 | position: fixed; 5 | z-index: 200000; 6 | display: block; 7 | min-height: 100vh; 8 | min-width: 100vw; 9 | z-index: 2000000000000; 10 | display: none; 11 | } 12 | 13 | #video { 14 | bottom: 0; 15 | height: auto; 16 | min-height: 100%; 17 | min-width: 100%; 18 | position: fixed; 19 | right: 0; 20 | width: auto; 21 | } 22 | 23 | #startDecoding { 24 | background: #0095dd; 25 | border-radius: 40px; 26 | color: #fff; 27 | font-family: Arial, sans; 28 | font-size: 20px; 29 | left: 50%; 30 | margin: -30px 0 0 -95px; 31 | padding: 20px; 32 | position: fixed; 33 | text-align: center; 34 | top: 50%; 35 | width: 150px; 36 | } 37 | 38 | #corner-nw, 39 | #corner-no, 40 | #corner-so, 41 | #corner-sw { 42 | border: #fff 6px solid; 43 | height: 30px; 44 | position: fixed; 45 | width: 30px; 46 | } 47 | 48 | #corner-nw { 49 | border-bottom: 0; 50 | border-right: 0; 51 | border-top-left-radius: 20px; 52 | left: 20px; 53 | top: 20px; 54 | } 55 | 56 | #corner-no { 57 | border-bottom: 0; 58 | border-left: 0; 59 | border-top-right-radius: 20px; 60 | right: 20px; 61 | top: 20px; 62 | } 63 | 64 | #corner-so { 65 | border-bottom-right-radius: 20px; 66 | border-left: 0; 67 | border-top: 0; 68 | bottom: 20px; 69 | right: 20px; 70 | } 71 | 72 | #corner-sw { 73 | border-bottom-left-radius: 20px; 74 | border-right: 0; 75 | border-top: 0; 76 | bottom: 20px; 77 | left: 20px; 78 | } 79 | -------------------------------------------------------------------------------- /docs/assets/image/E261.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /application/assets/image/E261.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /docs/assets/image/E262.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /application/assets/image/E262.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /docs/assets/image/E264.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 32 | 34 | 38 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /application/assets/image/E264.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 32 | 34 | 38 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /docs/assets/image/E257.svg: -------------------------------------------------------------------------------- 1 | 2 | 14 | 16 | 38 | 41 | 48 | 49 | 52 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /application/assets/image/E257.svg: -------------------------------------------------------------------------------- 1 | 2 | 14 | 16 | 38 | 41 | 48 | 49 | 52 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /application/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | greg 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 |
21 | 22 |
23 | 24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | 32 | 37 | 38 | 39 |
40 |
41 |
42 |
43 |
44 |
45 | 46 | 47 | 48 | 49 |
50 |
51 | 52 | 53 |
54 |
55 |
56 |
57 | 58 |
59 | 60 |
61 |
62 |
63 |
64 | 65 |
66 | 67 |
68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /application/assets/js/scan.js: -------------------------------------------------------------------------------- 1 | import jsQR from "jsqr"; 2 | 3 | let video = document.querySelector("video"); 4 | let intv; 5 | let mediaStream; 6 | 7 | export let stop_scan = function (callback) { 8 | mediaStream.getTracks().map(function (val) { 9 | val.stop(); 10 | }); 11 | 12 | document.getElementById("qr-screen").style.display = "none"; 13 | 14 | callback(); 15 | }; 16 | 17 | export let start_scan = function (callback) { 18 | document.getElementById("qr-screen").style.display = "block"; 19 | 20 | navigator.getUserMedia = 21 | navigator.getUserMedia || 22 | navigator.webkitGetUserMedia || 23 | navigator.mozGetUserMedia; 24 | 25 | if (navigator.getUserMedia) { 26 | navigator.getUserMedia( 27 | { 28 | audio: false, 29 | video: { 30 | width: 200, 31 | height: 200, 32 | }, 33 | }, 34 | function (stream) { 35 | video.srcObject = stream; 36 | console.log(stream); 37 | mediaStream = stream; 38 | 39 | video.onloadedmetadata = function (e) { 40 | video.play(); 41 | 42 | var barcodeCanvas = document.createElement("canvas"); 43 | intv = setInterval(() => { 44 | barcodeCanvas.width = video.videoWidth; 45 | barcodeCanvas.height = video.videoHeight; 46 | var barcodeContext = barcodeCanvas.getContext("2d"); 47 | var imageWidth = Math.max(1, Math.floor(video.videoWidth)), 48 | imageHeight = Math.max(1, Math.floor(video.videoHeight)); 49 | 50 | barcodeContext.drawImage(video, 0, 0, imageWidth, imageHeight); 51 | 52 | var imageData = barcodeContext.getImageData( 53 | 0, 54 | 0, 55 | imageWidth, 56 | imageHeight, 57 | ); 58 | var idd = imageData.data; 59 | 60 | let code = jsQR(idd, imageWidth, imageHeight); 61 | 62 | if (code) { 63 | clearInterval(intv); 64 | callback(code.data); 65 | stop_scan(); 66 | } 67 | }, 1000); 68 | }; 69 | }, 70 | function (err) { 71 | console.log("The following error occurred: " + err.name); 72 | }, 73 | ); 74 | } else { 75 | console.log("getUserMedia not supported"); 76 | } 77 | }; 78 | -------------------------------------------------------------------------------- /docs/assets/image/option.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 39 | 41 | 46 | 49 | 55 | 61 | 67 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /application/assets/image/option.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 39 | 41 | 46 | 49 | 55 | 61 | 67 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /docs/assets/image/add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 39 | 41 | 46 | 49 | 55 | + 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /application/assets/image/add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 39 | 41 | 46 | 49 | 55 | + 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /docs/manifest.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Greg", 3 | "id": "greg", 4 | "description": "Effortlessly manage your schedule with GREG for KaiOS. Save events locally or sync external calendars, including Nextcloud/Google via CalDAV. Navigate months, slide through events, and quickly jump to today with intuitive controls. Plus, enjoy a moon phase calendar with a press of a button (#). Stay organized with ease.", 5 | "lang": "en-US", 6 | "start_url": "/index.html", 7 | "short_name": "Greg", 8 | "categories": ["utilities"], 9 | "theme_color": "#ffffff", 10 | "orientation": "natural", 11 | "userAgentInfo": "greg written by strukturart@gmail.com", 12 | 13 | "icons": [ 14 | { 15 | "src": "/assets/icons/icon-56-56.png", 16 | "type": "image/png", 17 | "sizes": "56x56" 18 | }, 19 | { 20 | "src": "/assets/icons/icon-112-112.png", 21 | "type": "image/png", 22 | "sizes": "112x112" 23 | } 24 | ], 25 | 26 | "b2g_features": { 27 | "version": "3.0.773", 28 | "id": "greg", 29 | "subtitle": "easy to use calendar", 30 | "core": true, 31 | "type": "privileged", 32 | "display": "fullscreen", 33 | 34 | "developer": { 35 | "name": "strukturart", 36 | "url": "https://github.com/strukturart/greg" 37 | }, 38 | 39 | "dependencies": { 40 | "ads-sdk": "1.5.8" 41 | }, 42 | "messages": [{ "serviceworker-notification": "index.html" }, "alarm"], 43 | 44 | "activities": { 45 | "greg-oauth": {} 46 | }, 47 | 48 | "serviceworker": { 49 | "script_url": "sw.js" 50 | }, 51 | 52 | "permissions": { 53 | "desktop-notification": { 54 | "description": "Needed to fire system notifications" 55 | }, 56 | "alarms": { 57 | "description": "Required to schedule alarms" 58 | }, 59 | "feature-detection": { 60 | "description": "query which keys are available" 61 | }, 62 | "mobiledata": {}, 63 | "wifidata": {}, 64 | "calllog": {}, 65 | 66 | "audio-channel-content": { 67 | "description": "Allow background audio playback." 68 | }, 69 | "volumemanager": { "description": "" }, 70 | "device-storage:sdcard": { 71 | "description": "Read/Write from/to sd-card", 72 | "access": "readwrite" 73 | }, 74 | "spatialnavigation-app-manage": { 75 | "navigator.spatialNavigationEnabled": false 76 | }, 77 | "systemXHR": { 78 | "description": "Required to load remote content" 79 | } 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Greg 4 | 5 | An easy to use calendar for KaiOs 6 | 7 | ![image-1](/images/mockup.png) 8 | 9 | ## How to use 10 | 11 | - Key 1 & 3 : Jump between the months 12 | - Key \* : Jump to current Day 13 | - Key Enter: toggle views 14 | - Key 2: event slider in month view 15 | - Key SoftLeft: Add event 16 | - Key SoftLeft Longpress: Add Event with template 17 | - Key 5: shortAction edit/delete 18 | - 0 Single category view 19 | 20 | ### Nextcloud account 21 | 22 | if you want to use an external calendar, you have to enter the correct server address. 23 | at nextcloud as follows: 24 | 25 | - server: "https://xxxxx/remote.php/dav", 26 | - username: "xxxxm", 27 | - password: "xxxxx", 28 | 29 | ## Features 30 | 31 | - Local Calendar 32 | - Nextcloud calendar 33 | - Google Calendar 34 | - subscribe to calendar 35 | 36 | I tested subscribing to calendar with google calendar. you have the possibility to subscribe to public calendars and private calendars, in the google calendar settings you will find an ID that you can enter in greg (by hand or qr code). 37 | 38 | ## How to install 39 | 40 | - KaiOS Store 41 | - Sideloading step-by-step article by martinkaptein 42 | 43 | You can download the latest version from the Releases page. 44 | The app is not auto-updating. To update it, you have to follow the same steps you took when installing it. 45 | 46 | ### LICENSES 47 | 48 | This software (except KaiAds) is open source and licensed under the MIT License. View the source code. 49 | 50 | - tsdav https://github.com/natelindev/tsdav MIT License 51 | - mithril https://github.com/MithrilJS MIT License 52 | 53 | ### Privacy Policy 54 | 55 | This software uses KaiAds. This is a third party service that may collect information used to identify you. Pricacy policy of KaiAds. 56 | If you connect a Google account to greg, it is possible that Google collects information about you, or identifies you. 57 | 58 | ### Dev 59 | 60 | If you want to create your own version of the app you need to use your own google oaut cred. you have to create a file with this content 61 | .env 62 | 63 | ``` 64 | clientId= 65 | clientSecret= 66 | token_url= 67 | redirect_url= 68 | ``` 69 | 70 | ## Donation 71 | 72 | If you use the app often, please donate an amount to me. 73 |
74 | 75 | Donate using Liberapay 76 | -------------------------------------------------------------------------------- /application/manifest.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Greg", 3 | "id": "greg", 4 | "description": "Effortlessly manage your schedule with GREG for KaiOS. Save events locally or sync external calendars, including Nextcloud/Google via CalDAV. Navigate months, slide through events, and quickly jump to today with intuitive controls. Plus, enjoy a moon phase calendar with a press of a button (#). Stay organized with ease.", 5 | "lang": "en-US", 6 | "start_url": "/index.html", 7 | "short_name": "Greg", 8 | "categories": ["utilities"], 9 | "theme_color": "#ffffff", 10 | "orientation": "natural", 11 | "userAgentInfo": "greg written by strukturart@gmail.com", 12 | 13 | "icons": [ 14 | { 15 | "src": "/assets/icons/icon-56-56.png", 16 | "type": "image/png", 17 | "sizes": "56x56" 18 | }, 19 | { 20 | "src": "/assets/icons/icon-112-112.png", 21 | "type": "image/png", 22 | "sizes": "112x112" 23 | } 24 | ], 25 | 26 | "b2g_features": { 27 | "version": "3.0.776", 28 | "id": "greg", 29 | "subtitle": "easy to use calendar", 30 | "core": true, 31 | "type": "privileged", 32 | "display": "fullscreen", 33 | 34 | "developer": { 35 | "name": "strukturart", 36 | "url": "https://github.com/strukturart/greg" 37 | }, 38 | 39 | "dependencies": { 40 | "ads-sdk": "1.5.8" 41 | }, 42 | "messages": [{ "serviceworker-notification": "index.html" }, "alarm"], 43 | 44 | "activities": { 45 | "greg-oauth": {} 46 | }, 47 | 48 | "serviceworker": { 49 | "script_url": "sw.js" 50 | }, 51 | 52 | "permissions": { 53 | "desktop-notification": { 54 | "description": "Needed to fire system notifications" 55 | }, 56 | "alarms": { 57 | "description": "Required to schedule alarms" 58 | }, 59 | "feature-detection": { 60 | "description": "query which keys are available" 61 | }, 62 | "mobiledata": {}, 63 | "wifidata": {}, 64 | "calllog": {}, 65 | 66 | "audio-channel-content": { 67 | "description": "Allow background audio playback." 68 | }, 69 | "volumemanager": { "description": "" }, 70 | "device-storage:sdcard": { 71 | "description": "Read/Write from/to sd-card", 72 | "access": "readwrite" 73 | }, 74 | "spatialnavigation-app-manage": { 75 | "navigator.spatialNavigationEnabled": false 76 | }, 77 | "systemXHR": { 78 | "description": "Required to load remote content" 79 | } 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /docs/manifest.webapp: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.2.6342", 3 | "name": "greg", 4 | "id": "greg", 5 | "categories": ["utilities"], 6 | "subtitle": "easy to use calendar", 7 | "description": "Effortlessly manage your schedule with GREG for KaiOS. Save events locally or sync external calendars, including Nextcloud/Google via CalDAV. Navigate months, slide through events, and quickly jump to today with intuitive controls. Plus, enjoy a moon phase calendar with a press of a button (#). Stay organized with ease.", 8 | "launch_path": "/index.html", 9 | "type": "privileged", 10 | "fullscreen": "true", 11 | "priority": "high", 12 | "userAgentInfo": "greg written by strukturart@gmail.com", 13 | "icons": { 14 | "56": "/assets/icons/icon-56-56.png", 15 | "112": "/assets/icons/icon-112-112.png" 16 | }, 17 | "developer": { 18 | "name": "strukturart", 19 | "url": "https://github.com/strukturart/greg" 20 | }, 21 | "dependencies": { 22 | "ads-sdk": "1.5.8" 23 | }, 24 | 25 | "locales": { 26 | "en-US": { 27 | "name": "greg", 28 | "subtitle": "greg", 29 | "description": "Effortlessly manage your schedule with GREG for KaiOS. Save events locally or sync external calendars, including Nextcloud/Google via CalDAV. Navigate months, slide through events, and quickly jump to today with intuitive controls. Plus, enjoy a moon phase calendar with a press of a button (#). Stay organized with ease." 30 | } 31 | }, 32 | "default_locale": "en-US", 33 | 34 | "deeplinks": { 35 | "regex": "^https?://.*\\.ics$", 36 | "action": "view" 37 | }, 38 | 39 | 40 | "activities": { 41 | "greg-oauth": { 42 | "href": "/index.html" 43 | } 44 | }, 45 | 46 | 47 | 48 | "messages": [ 49 | { 50 | "alarm": "/index.html" 51 | }, 52 | 53 | { 54 | "notification": "/index.html" 55 | }, 56 | { "serviceworker-notification": "/index.html" } 57 | ], 58 | 59 | "redirects": [ 60 | { 61 | "from": "https://greg.strukturart.com/index.html", 62 | "to": "/index.html" 63 | } 64 | ], 65 | 66 | "serviceworker": { 67 | "script_url": "sw.js" 68 | }, 69 | 70 | "permissions": { 71 | "serviceworker": { 72 | "description": "Needed for assocating service worker" 73 | }, 74 | "desktop-notification": { 75 | "description": "Needed to fire system notifications" 76 | }, 77 | 78 | "mobiledata": {}, 79 | "wifidata": {}, 80 | "calllog": {}, 81 | "device-storage:sdcard": { 82 | "description": "Read/Write from/to sd-card", 83 | "access": "readwrite" 84 | }, 85 | "video-capture": { 86 | "description": "Reading Codes using the Camera" 87 | }, 88 | 89 | "spatialnavigation-app-manage": { 90 | "navigator.spatialNavigationEnabled": false 91 | }, 92 | "systemXHR": { 93 | "description": "Required to load remote content" 94 | }, 95 | "alarms": { 96 | "description": "Required to schedule alarms" 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /application/manifest.webapp: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.2.6344", 3 | "name": "greg", 4 | "id": "greg", 5 | "categories": ["utilities"], 6 | "subtitle": "easy to use calendar", 7 | "description": "Effortlessly manage your schedule with GREG for KaiOS. Save events locally or sync external calendars, including Nextcloud/Google via CalDAV. Navigate months, slide through events, and quickly jump to today with intuitive controls. Plus, enjoy a moon phase calendar with a press of a button (#). Stay organized with ease.", 8 | "launch_path": "/index.html", 9 | "type": "privileged", 10 | "fullscreen": "true", 11 | "priority": "high", 12 | "userAgentInfo": "greg written by strukturart@gmail.com", 13 | "icons": { 14 | "56": "/assets/icons/icon-56-56.png", 15 | "112": "/assets/icons/icon-112-112.png" 16 | }, 17 | "developer": { 18 | "name": "strukturart", 19 | "url": "https://github.com/strukturart/greg" 20 | }, 21 | "dependencies": { 22 | "ads-sdk": "1.5.8" 23 | }, 24 | 25 | "locales": { 26 | "en-US": { 27 | "name": "greg", 28 | "subtitle": "greg", 29 | "description": "Effortlessly manage your schedule with GREG for KaiOS. Save events locally or sync external calendars, including Nextcloud/Google via CalDAV. Navigate months, slide through events, and quickly jump to today with intuitive controls. Plus, enjoy a moon phase calendar with a press of a button (#). Stay organized with ease." 30 | } 31 | }, 32 | "default_locale": "en-US", 33 | 34 | "deeplinks": { 35 | "regex": "^https?://.*\\.ics$", 36 | "action": "view" 37 | }, 38 | 39 | 40 | "activities": { 41 | "greg-oauth": { 42 | "href": "/index.html" 43 | } 44 | }, 45 | 46 | 47 | 48 | "messages": [ 49 | { 50 | "alarm": "/index.html" 51 | }, 52 | 53 | { 54 | "notification": "/index.html" 55 | }, 56 | { "serviceworker-notification": "/index.html" } 57 | ], 58 | 59 | "redirects": [ 60 | { 61 | "from": "https://greg.strukturart.com/index.html", 62 | "to": "/index.html" 63 | } 64 | ], 65 | 66 | "serviceworker": { 67 | "script_url": "sw.js" 68 | }, 69 | 70 | "permissions": { 71 | "serviceworker": { 72 | "description": "Needed for assocating service worker" 73 | }, 74 | "desktop-notification": { 75 | "description": "Needed to fire system notifications" 76 | }, 77 | 78 | "mobiledata": {}, 79 | "wifidata": {}, 80 | "calllog": {}, 81 | "device-storage:sdcard": { 82 | "description": "Read/Write from/to sd-card", 83 | "access": "readwrite" 84 | }, 85 | "video-capture": { 86 | "description": "Reading Codes using the Camera" 87 | }, 88 | 89 | "spatialnavigation-app-manage": { 90 | "navigator.spatialNavigationEnabled": false 91 | }, 92 | "systemXHR": { 93 | "description": "Required to load remote content" 94 | }, 95 | "alarms": { 96 | "description": "Required to schedule alarms" 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /docs/assets/image/E25C.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 32 | 39 | 42 | 54 | 66 | 78 | 87 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /application/assets/image/E25C.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 32 | 39 | 42 | 54 | 66 | 78 | 87 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "greg", 3 | "version": "2.0.0", 4 | "description": "", 5 | "source": "application/index.html", 6 | "browserslist": "Firefox <= 48", 7 | "scripts": { 8 | "oa": "parcel application/oauth.js --no-source-maps --no-optimize /dist", 9 | "start": "rm -rf dist/* && parcel --no-source-maps application/index.html && cp application/manifest.webapp dist && cp -r application/assets/icons dist", 10 | "build": "rm -rf dist/* && parcel build --no-source-maps --no-optimize --public-url ./ application/index.html && cp application/manifest.webapp dist && mkdir dist/assets && cp -r application/assets/icons dist/assets/", 11 | "web": "rm -rf docs/* && parcel build --dist-dir docs --public-url ./ --no-source-maps --no-content-hash application/index.html && cp application/manifest.webapp docs && cp application/manifest.webmanifest docs && mkdir -p docs/assets && cp -r application/assets/icons docs/assets/ && mkdir -p docs/assets/js/ && cp application/assets/js/kaiads.v5.min.js docs/assets/js/ && cp -r application/assets/fonts docs/assets/ && cp -r application/assets/image docs/assets/ && cp application/about.html docs/ && cp application/datenschutz.html docs/&& cp application/sitemap.xml docs/" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/strukturart/greg.git" 16 | }, 17 | "keywords": [ 18 | "KaiOs", 19 | "Calendar" 20 | ], 21 | "author": "strukturart", 22 | "license": "MPL-2.0", 23 | "bugs": { 24 | "url": "https://github.com/strukturart/greg/issues" 25 | }, 26 | "homepage": "https://github.com/strukturart/greg#readme", 27 | "devDependencies": { 28 | "@babel/cli": "^7.18.10", 29 | "@babel/core": "^7.19.1", 30 | "@babel/plugin-syntax-dynamic-import": "^7.8.3", 31 | "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", 32 | "@babel/plugin-transform-runtime": "^7.18.5", 33 | "@babel/preset-env": "^7.19.1", 34 | "@parcel/transformer-html": "^2.6.2", 35 | "assert": "^2.0.0", 36 | "babel-plugin-transform-async-to-promises": "^0.8.18", 37 | "browserify-zlib": "^0.2.0", 38 | "buffer": "^6.0.3", 39 | "core-js": "^3.22.5", 40 | "crypto-browserify": "^3.12.0", 41 | "cssnano": "^5.0.17", 42 | "events": "^3.3.0", 43 | "https-browserify": "^1.0.0", 44 | "os-browserify": "^0.3.0", 45 | "parcel-plugin-static-files-copy": "^1.2.4", 46 | "path-browserify": "^1.0.1", 47 | "postcss": "^8.4.6", 48 | "querystring-es3": "^0.2.1", 49 | "stream-browserify": "^3.0.0", 50 | "stream-http": "^3.2.0", 51 | "timers-browserify": "^2.0.12", 52 | "url": "^0.11.0" 53 | }, 54 | "dependencies": { 55 | "@babel/runtime": "^7.27.1", 56 | "@parcel/service-worker": "^2.8.0", 57 | "as": "^0.4.1", 58 | "assets": "^3.0.1", 59 | "dayjs": "^1.11.6", 60 | "dayjs-plugin-utc": "^0.1.2", 61 | "dotenv": "^16.4.5", 62 | "fast-sort": "^3.2.1", 63 | "ical.js": "^1.5.0", 64 | "jsqr": "^1.4.0", 65 | "loadsh": "^0.0.4", 66 | "localforage": "^1.10.0", 67 | "mithril": "^3.0.0-next.3", 68 | "moment": "^2.29.4", 69 | "moment-timezone": "^0.5.34", 70 | "uid": "^2.0.0", 71 | "url-search-params-polyfill": "^8.1.1" 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /docs/assets/image/calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 39 | 41 | 46 | 49 | 55 | 58 | 61 | 70 | 79 | 80 | 83 | 92 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /application/assets/image/calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 39 | 41 | 46 | 49 | 55 | 58 | 61 | 70 | 79 | 80 | 83 | 92 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /docs/assets/image/pencil.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 17 | 21 | 22 | 25 | 29 | 30 | 31 | 49 | 56 | 59 | 68 | 77 | 89 | 98 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /application/assets/image/pencil.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 17 | 21 | 22 | 25 | 29 | 30 | 31 | 49 | 56 | 59 | 68 | 77 | 89 | 98 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /application/assets/js/shim-xhr-to-fetch.js: -------------------------------------------------------------------------------- 1 | class Dispatch extends EventTarget { 2 | dispatch(eventName) { 3 | const ev = new Event(eventName); 4 | if ('on' + eventName in this) { 5 | this['on' + eventName](ev); 6 | } 7 | this.dispatchEvent(ev); 8 | } 9 | } 10 | export class XMLHttpRequest extends Dispatch { 11 | // readyState enumeration 12 | UNSENT = 0; 13 | OPENED = 1; 14 | HEADERS_RECEIVED = 2; 15 | LOADING = 3; 16 | DONE = 4; 17 | 18 | constructor() { 19 | super(); 20 | this.upload = new Dispatch(); 21 | } 22 | 23 | open(method, url) { 24 | this.url = url; 25 | this.method = method; 26 | this.headers = new Headers(); 27 | this.readyState = this.UNSENT; 28 | this.responseType = ''; 29 | this._controller = new AbortController(); 30 | } 31 | setRequestHeader(key, value) { 32 | this.headers.set(key, value); 33 | } 34 | abort() { 35 | this.upload.dispatch('abort'); 36 | this._controller.abort(); 37 | } 38 | send(payload) { 39 | this.readyState = this.OPENED; 40 | this.status = 0; 41 | this.dispatch('readystatechange'); 42 | this.upload.dispatch('loadstart'); 43 | fetch(this.url, { 44 | method: this.method, 45 | credentials: this.withCredentials, 46 | headers: this.headers, 47 | signal: this._controller.signal, 48 | body: payload, 49 | }) 50 | .then(async (response) => { 51 | this.readyState = this.HEADERS_RECEIVED; 52 | this.responseURL = response.url; 53 | this.responseType = response.type; 54 | this.status = response.status; 55 | this.statusText = response.statusText; 56 | 57 | // todo: this is wrong, fetch response.type possible values are - basic, cors, error, opaque, opaqueredirect 58 | switch (this.responseType) { 59 | case '': 60 | return response.text(); 61 | case 'arraybuffer': 62 | return response.arrayBuffer(); 63 | case 'blob': 64 | return response.blob(); 65 | case 'document': 66 | return response.text(); // todo pass through XMLParser 67 | case 'json': 68 | return response.json(); 69 | //todo stream and status 3 and progress 70 | } 71 | return response.text(); 72 | }) 73 | .then( 74 | (value) => { 75 | this.response = value; 76 | this.readyState = this.DONE; 77 | this.dispatch('readystatechange'); 78 | this.upload.dispatch('load'); 79 | this.dispatch('load'); 80 | this.upload.dispatch('progress'); 81 | this.dispatch('progress'); 82 | this.upload.dispatch('loadend'); 83 | this.dispatch('loadend'); 84 | }, 85 | (err) => { 86 | this.dispatch('error'); 87 | this.upload.dispatch('error'); 88 | this.readyState = this.DONE; 89 | this.dispatch('readystatechange'); 90 | } 91 | ); 92 | } 93 | get responseText() { 94 | if (this.response) { 95 | if (this.responseType === 'arraybuffer') { 96 | return String.fromCharCode.apply(null, new Uint16Array(this.response)); // slower than StringEncoder/StringDecoder API, but meh 97 | } 98 | if (this.responseType === 'json') { 99 | return JSON.stringify(this.response); 100 | } 101 | if (this.response === 'blob') { 102 | return ''; // 103 | } 104 | return this.response; 105 | } 106 | } 107 | 108 | // No response headers suport yet! 109 | getAllResponseHeaders() { 110 | return ''; // todo fix headers at HEADERS_RECEIVED 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /docs/assets/image/delete-red.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 32 | 34 | 39 | 48 | 54 | 66 | 67 | 69 | 71 | 73 | 75 | 84 | 93 | 106 | 118 | 130 | 131 | 132 | -------------------------------------------------------------------------------- /application/assets/image/delete-red.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 32 | 34 | 39 | 48 | 54 | 66 | 67 | 69 | 71 | 73 | 75 | 84 | 93 | 106 | 118 | 130 | 131 | 132 | -------------------------------------------------------------------------------- /application/assets/js/kaiads.v5.min.js: -------------------------------------------------------------------------------- 1 | var a0_0x97c4=['http://127.0.0.1:8081/sdk/ads/ads-sdk.min.js','appendChild','test','addEventListener','catch','length','onerror','push','navigator','mozApps','type','hostname','forEach','endsWith','load','https://static.kaiads.com/ads-sdk/ads-sdk.v5.min.js','http://127.0.0.1/sdk/ads/ads-sdk.min.js','async','result','script','location','apply','then','.localhost','manifest','head','getKaiAd','web','reject','userAgent','dummy','error','src','getSelf','createElement','split'];(function(_0x1ad48b,_0x97c48f){var _0x12a6ec=function(_0x11c212){while(--_0x11c212){_0x1ad48b['push'](_0x1ad48b['shift']());}};_0x12a6ec(++_0x97c48f);}(a0_0x97c4,0xd4));var a0_0x12a6=function(_0x1ad48b,_0x97c48f){_0x1ad48b=_0x1ad48b-0x0;var _0x12a6ec=a0_0x97c4[_0x1ad48b];return _0x12a6ec;};'use strict';(function(){var _0x457a87=this,_0x5d8736=[],_0x5f3d51=function _0x212ebb(_0x493730){_0x5d8736[a0_0x12a6('0x10')](function(_0xb35be3){_0x493730[a0_0x12a6('0x19')](_0x457a87,_0xb35be3);}),_0x5d8736=[];};window[a0_0x12a6('0x1e')]=function(){_0x5d8736[a0_0x12a6('0xb')](arguments);},window[a0_0x12a6('0x1e')][a0_0x12a6('0x22')]=!![];var _0x12380d=function _0x25eaab(_0x3708a3){if(typeof _0x3708a3[a0_0x12a6('0xa')]==='function'){var _0x164442=0x13;_0x3708a3[a0_0x12a6('0xa')](_0x164442);}},_0xeacc58=function _0x6b8586(_0x23bc2b){return new Promise(function(_0x45ea96,_0x5ec98a){var _0x2c2f55=document[a0_0x12a6('0x2')]('script');_0x2c2f55['addEventListener'](a0_0x12a6('0x12'),function(){_0x45ea96();}),_0x2c2f55[a0_0x12a6('0x7')](a0_0x12a6('0x23'),function(){_0x5ec98a();}),_0x2c2f55[a0_0x12a6('0x0')]=_0x23bc2b,_0x2c2f55[a0_0x12a6('0x15')]=![],document['head'][a0_0x12a6('0x5')](_0x2c2f55);});},_0x28b24c=function _0x399e17(_0x4f2810){return new Promise(function(_0x355c79,_0x185516){var _0x132857=document[a0_0x12a6('0x2')](a0_0x12a6('0x17'));_0x132857['addEventListener']('load',function(){!getKaiAd||getKaiAd[a0_0x12a6('0x22')]?_0x185516():_0x355c79();}),_0x132857[a0_0x12a6('0x7')]('error',function(){_0x185516();}),_0x132857['src']=_0x4f2810,document[a0_0x12a6('0x1d')][a0_0x12a6('0x5')](_0x132857);});},_0x598f82;window[a0_0x12a6('0xc')][a0_0x12a6('0xd')]?window['navigator'][a0_0x12a6('0xd')][a0_0x12a6('0x1')]()['onsuccess']=function(_0x4ff815){var _0x580307=_0x4ff815['target'][a0_0x12a6('0x16')];(!_0x580307||!_0x580307['manifest']||!_0x580307[a0_0x12a6('0x1c')][a0_0x12a6('0xe')]||_0x580307[a0_0x12a6('0x1c')][a0_0x12a6('0xe')]===a0_0x12a6('0x1f'))&&(_0x598f82=_0x28b24c('https://static.kaiads.com/ads-sdk/ads-sdk.v5.min.js'));if(!_0x598f82){var _0x3bf9d4=/ kaios\/((?:\d+.)*\d+)/gi['exec'](window[a0_0x12a6('0xc')][a0_0x12a6('0x21')]);_0x3bf9d4&&_0x432c75(_0x3bf9d4[0x1],'2.5')===0x1&&(_0x598f82=_0x28b24c(a0_0x12a6('0x14'))['catch'](function(){return _0x28b24c(a0_0x12a6('0x4'));}));}!_0x598f82&&(_0x598f82=Promise[a0_0x12a6('0x20')]()),_0x598f82[a0_0x12a6('0x8')](function(){_0x5f3d51(_0x12380d),window[a0_0x12a6('0x1e')]=_0x12380d,getKaiAd=_0x12380d;})[a0_0x12a6('0x1a')](function(){_0x5f3d51(getKaiAd),window[a0_0x12a6('0x1e')]=getKaiAd;});}:(/kaios/gi[a0_0x12a6('0x6')](window[a0_0x12a6('0xc')]['userAgent'])&&window[a0_0x12a6('0x18')][a0_0x12a6('0xf')][a0_0x12a6('0x11')](a0_0x12a6('0x1b'))?_0x598f82=_0x28b24c('http://127.0.0.1/sdk/ads/ads-sdk.min.js'):_0x598f82=_0x28b24c(a0_0x12a6('0x13')),!_0x598f82&&(_0x598f82=Promise[a0_0x12a6('0x20')]()),_0x598f82[a0_0x12a6('0x8')](function(){_0x5f3d51(_0x12380d),window['getKaiAd']=_0x12380d,getKaiAd=_0x12380d;})[a0_0x12a6('0x1a')](function(){_0x5f3d51(getKaiAd),window[a0_0x12a6('0x1e')]=getKaiAd;}));function _0x432c75(_0x20ebef,_0x153396){var _0x1a6c74=_0x20ebef[a0_0x12a6('0x3')]('.'),_0x16fcae=_0x153396[a0_0x12a6('0x3')]('.');while(_0x1a6c74[a0_0x12a6('0x9')]<_0x16fcae[a0_0x12a6('0x9')]){_0x1a6c74[a0_0x12a6('0xb')]('0');}while(_0x16fcae[a0_0x12a6('0x9')]<_0x1a6c74[a0_0x12a6('0x9')]){_0x16fcae[a0_0x12a6('0xb')]('0');}for(var _0x482647=0x0;_0x482647<_0x1a6c74[a0_0x12a6('0x9')];++_0x482647){if(_0x1a6c74[_0x482647]==_0x16fcae[_0x482647])continue;else return _0x1a6c74[_0x482647]>_0x16fcae[_0x482647]?0x1:-0x1;}return 0x0;}}()); 2 | //# sourceMappingURL=sdk-loader.js.map -------------------------------------------------------------------------------- /docs/assets/image/delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 33 | 35 | 37 | 39 | 46 | 49 | 51 | 56 | 65 | 70 | 82 | 83 | 85 | 94 | 103 | 115 | 127 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /application/assets/image/delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 33 | 35 | 37 | 39 | 46 | 49 | 51 | 56 | 65 | 70 | 82 | 83 | 85 | 94 | 103 | 115 | 127 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /docs/assets/image/list.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 39 | 41 | 46 | 49 | 55 | 58 | 61 | 64 | 74 | 83 | 92 | 93 | 96 | 106 | 107 | 110 | 120 | 121 | 122 | 131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /application/assets/image/list.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 39 | 41 | 46 | 49 | 55 | 58 | 61 | 64 | 74 | 83 | 92 | 93 | 96 | 106 | 107 | 110 | 120 | 121 | 122 | 131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /docs/assets/image/person.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 17 | 21 | 22 | 25 | 29 | 30 | 31 | 49 | 56 | 59 | 67 | 75 | 83 | 91 | 99 | 101 | 109 | 112 | 115 | 122 | 130 | 131 | 132 | 133 | -------------------------------------------------------------------------------- /application/assets/image/person.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 17 | 21 | 22 | 25 | 29 | 30 | 31 | 49 | 56 | 59 | 67 | 75 | 83 | 91 | 99 | 101 | 109 | 112 | 115 | 122 | 130 | 131 | 132 | 133 | -------------------------------------------------------------------------------- /docs/index.5671dcd7.css: -------------------------------------------------------------------------------- 1 | .grid-col-1{min-width:10px;max-width:10px}.grid-col-2{min-width:20px;max-width:20px}.grid-col-3{min-width:30px;max-width:30px}.grid-col-4{min-width:40px;max-width:40px}.grid-col-5{min-width:50px;max-width:50px}.grid-col-6{min-width:60px;max-width:60px}.grid-col-7{min-width:70px;max-width:70px}.grid-col-8{min-width:80px;max-width:80px}.grid-col-9{min-width:90px;max-width:90px}.grid-col-10{min-width:100px;max-width:100px}.grid-col-11{min-width:110px;max-width:110px}.grid-col-12{min-width:120px;max-width:120px}.grid-col-13{min-width:130px;max-width:130px}.grid-col-14{min-width:140px;max-width:140px}.grid-col-15{min-width:150px;max-width:150px}.grid-col-16{min-width:160px;max-width:160px}.grid-col-17{min-width:170px;max-width:170px}.grid-col-18{min-width:180px;max-width:180px}.grid-col-19{min-width:190px;max-width:190px}.grid-col-20{min-width:200px;max-width:200px}.grid-col-21{min-width:210px;max-width:210px}.grid-col-22{min-width:220px;max-width:220px}.grid-col-23{min-width:230px;max-width:230px}.grid-col-24{min-width:240px;max-width:240px}.grid-col-25{min-width:250px;max-width:250px}.grid-col-26{min-width:260px;max-width:260px}.grid-col-27{min-width:270px;max-width:270px}.grid-col-28{min-width:280px;max-width:280px}.grid-col-29{min-width:290px;max-width:290px}.grid-col-30{min-width:300px;max-width:300px}.grid-col-31{min-width:310px;max-width:310px}.grid-col-32{min-width:320px;max-width:320px}.grid-col-33{min-width:330px;max-width:330px}.grid-col-34{min-width:340px;max-width:340px}.grid-col-35{min-width:350px;max-width:350px}.grid-col-36{min-width:360px;max-width:360px}.grid-col-37{min-width:370px;max-width:370px}.grid-col-38{min-width:380px;max-width:380px}.grid-col-39{min-width:390px;max-width:390px}.grid-col-40{min-width:400px;max-width:400px}.grid-col-41{min-width:410px;max-width:410px}.grid-col-42{min-width:420px;max-width:420px}.grid-col-43{min-width:430px;max-width:430px}.grid-col-44{min-width:440px;max-width:440px}.grid-col-45{min-width:450px;max-width:450px}.grid-col-46{min-width:460px;max-width:460px}.grid-col-47{min-width:470px;max-width:470px}.grid-col-48{min-width:480px;max-width:480px}.grid-col-49{min-width:490px;max-width:490px}.grid-col-50{min-width:500px;max-width:500px}.grid-col-51{min-width:510px;max-width:510px}.grid-col-52{min-width:520px;max-width:520px}.grid-col-53{min-width:530px;max-width:530px}.grid-col-54{min-width:540px;max-width:540px}.grid-col-55{min-width:550px;max-width:550px}.grid-col-56{min-width:560px;max-width:560px}.grid-col-57{min-width:570px;max-width:570px}.grid-col-58{min-width:580px;max-width:580px}.grid-col-59{min-width:590px;max-width:590px}.grid-col-60{min-width:600px;max-width:600px}.grid-col-61{min-width:610px;max-width:610px}.grid-col-62{min-width:620px;max-width:620px}.grid-col-63{min-width:630px;max-width:630px}.grid-col-64{min-width:640px;max-width:640px}.grid-col-65{min-width:650px;max-width:650px}.grid-col-66{min-width:660px;max-width:660px}.grid-col-67{min-width:670px;max-width:670px}.grid-col-68{min-width:680px;max-width:680px}.grid-col-69{min-width:690px;max-width:690px}.grid-col-70{min-width:700px;max-width:700px}.grid-col-71{min-width:710px;max-width:710px}.grid-col-72{min-width:720px;max-width:720px}.grid-col-73{min-width:730px;max-width:730px}.grid-col-74{min-width:740px;max-width:740px}.grid-col-75{min-width:750px;max-width:750px}.grid-col-76{min-width:760px;max-width:760px}.grid-col-77{min-width:770px;max-width:770px}.grid-col-78{min-width:780px;max-width:780px}.grid-col-79{min-width:790px;max-width:790px}.grid-col-80{min-width:800px;max-width:800px}.grid-col-81{min-width:810px;max-width:810px}.grid-col-82{min-width:820px;max-width:820px}.grid-col-83{min-width:830px;max-width:830px}.grid-col-84{min-width:840px;max-width:840px}.grid-col-85{min-width:850px;max-width:850px}.grid-col-86{min-width:860px;max-width:860px}.grid-col-87{min-width:870px;max-width:870px}.grid-col-88{min-width:880px;max-width:880px}.grid-col-89{min-width:890px;max-width:890px}.grid-col-90{min-width:900px;max-width:900px}.grid-col-91{min-width:910px;max-width:910px}.grid-col-92{min-width:920px;max-width:920px}.grid-col-93{min-width:930px;max-width:930px}.grid-col-94{min-width:940px;max-width:940px}.grid-col-95{min-width:950px;max-width:950px}.grid-col-96{min-width:960px;max-width:960px}.text-center{text-align:center}.flex{-moz-box-orient:horizontal;-moz-box-direction:normal;flex-flow:wrap;display:flex}.flex-column{-moz-box-orient:vertical;-moz-box-direction:normal;flex-direction:column}.justify-content-start{-moz-box-align:start;align-items:flex-start}.justify-content-end{-moz-box-pack:end;justify-content:flex-end}.algin-item-start{-moz-box-align:start;align-items:flex-start}.algin-item-end{-moz-box-align:end;align-items:flex-end}.align-item-center{-moz-box-align:center;align-items:center}.justify-content-spacebetween{-moz-box-pack:justify;justify-content:space-between}.justify-content-spacearound{align-content:space-around;justify-content:space-around}.justify-content-center{-moz-box-pack:center;justify-content:center}.width-100{min-width:100vw;max-width:100vw}.height-100{min-height:100vh}.width-95{min-width:95%}.width-98{min-width:98%}.width-50{min-width:50%}.width-30{min-width:30%;max-width:30%}.center{transform:translate(50%)}.block{display:block} -------------------------------------------------------------------------------- /docs/assets/icons/intro.svg: -------------------------------------------------------------------------------- 1 | 2 | 50 | Svg Vector Icons : http://www.onlinewebfonts.com/icon image/svg+xml 54 | 55 | 86 | -------------------------------------------------------------------------------- /application/assets/icons/intro.svg: -------------------------------------------------------------------------------- 1 | 2 | 50 | Svg Vector Icons : http://www.onlinewebfonts.com/icon image/svg+xml 54 | 55 | 86 | -------------------------------------------------------------------------------- /docs/about.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Greg 9 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 |

Greg

23 | 24 | An easy to use calendar for KaiOS 25 |
26 | 27 |
28 |
29 |

How to use

30 |
    31 |
  • - Key 1 & 3 : Jump between the months
  • 32 |
  • - Key \* : Jump to current Day
  • 33 |
  • - Key Enter: toggle views
  • 34 |
  • - Key 2: event slider in month view
  • 35 |
  • - Key #: toggle moon phase view
  • 36 |
37 |
38 |
39 |

Nextcloud account

40 | 41 | if you want to use an external calendar, you have to enter the 42 | correct server address. at nextcloud as follows: - server: 43 | "https://xxxxx/remote.php/dav", - username: "xxxxm", - password: 44 | "xxxxx", 45 |
46 |
47 |

Features

48 |
    49 |
  • Local Calendar
  • 50 |
  • Nextcloud calendar
  • 51 |
  • Google calendar
  • 52 |
  • subscribe to public calendars
  • 53 |
  • moon phases
  • 54 |
55 | I tested subscribing to calendar with google calendar. you have the 56 | possibility to subscribe to public calendars and private calendars, 57 | in the google calendar settings you will find an ID that you can 58 | enter in greg (by hand or qr code). 59 |
60 |
61 |

How to install

62 | you can find the app in the 63 | bHaCkErSTORe or 64 | in the KaiOs Store or you can 65 | sideload 69 | it. 70 |
71 |
72 |

LICENSES

73 | This software (except KaiAds) is open source and licensed under the 74 | MIT License. View the source code. 75 |
76 |
    77 |
  • tsdav https://github.com/natelindev/tsdav MIT License
  • 78 |
  • mithril https://github.com/MithrilJS MIT License
  • 79 |
  • Dayjs https://github.com/iamkun/dayjs/ MIT License
  • 80 |
81 |
82 |
83 |

84 | Privacy Policy 85 |

86 |
87 |

What data is stored?

88 | 89 |

Google Account

90 |

91 | If you have connected your Google account to the app, the username and password of your Google account will not be saved on the app. Authentication is done via OAuth. 92 |

93 |

94 | The information on the individual calendars and calendar events is stored locally using IndexedDB on your device. 95 |

96 | 97 |

CalDAV Account

98 |

99 | If you have connected the app to a CalDAV account, the username and password are stored locally using IndexedDB in the app. 100 |

101 |

102 | The information on the individual calendars and calendar events is also stored locally using IndexedDB. 103 |

104 | 105 |

Local Calendar

106 |

107 | Calendar events are stored locally on your device using IndexedDB. 108 |

109 | 110 |

Data protection and security

111 |

112 | The app uses IndexedDB for local data storage, which allows for efficient and secure management of large datasets. The storage of sensitive information, such as CalDAV account credentials, is encrypted and securely stored within IndexedDB to protect against unauthorized access. 113 |

114 |
115 | 116 | 117 | 118 | 119 |
120 | 121 | 122 | 123 | 124 | 125 |
126 |

You have a problem with the app or found a bug

127 | https://github.com/strukturart/greg/issues 128 |
129 | 130 | 131 | 132 |
133 |

Analysis of the data and use of the app

134 | 135 |

The app does not store any data that analyzes the use of the app, nor is there any tracking of the user.

136 |

If you installed the app with the KaiOs store:

137 |

138 | This software uses KaiAds. This is a third party service that may 139 | collect information used to identify you. Pricacy policy of 140 | KaiAds. 141 |

142 |
143 | 144 | 145 |
146 |
147 | 148 | 149 | 150 | -------------------------------------------------------------------------------- /application/about.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Greg 9 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 |

Greg

23 | 24 | An easy to use calendar for KaiOS 25 |
26 | 27 |
28 |
29 |

How to use

30 |
    31 |
  • - Key 1 & 3 : Jump between the months
  • 32 |
  • - Key \* : Jump to current Day
  • 33 |
  • - Key Enter: toggle views
  • 34 |
  • - Key 2: event slider in month view
  • 35 |
  • - Key #: toggle moon phase view
  • 36 |
37 |
38 |
39 |

Nextcloud account

40 | 41 | if you want to use an external calendar, you have to enter the 42 | correct server address. at nextcloud as follows: - server: 43 | "https://xxxxx/remote.php/dav", - username: "xxxxm", - password: 44 | "xxxxx", 45 |
46 |
47 |

Features

48 |
    49 |
  • Local Calendar
  • 50 |
  • Nextcloud calendar
  • 51 |
  • Google calendar
  • 52 |
  • subscribe to public calendars
  • 53 |
  • moon phases
  • 54 |
55 | I tested subscribing to calendar with google calendar. you have the 56 | possibility to subscribe to public calendars and private calendars, 57 | in the google calendar settings you will find an ID that you can 58 | enter in greg (by hand or qr code). 59 |
60 |
61 |

How to install

62 | you can find the app in the 63 | bHaCkErSTORe or 64 | in the KaiOs Store or you can 65 | sideload 69 | it. 70 |
71 |
72 |

LICENSES

73 | This software (except KaiAds) is open source and licensed under the 74 | MIT License. View the source code. 75 |
76 |
    77 |
  • tsdav https://github.com/natelindev/tsdav MIT License
  • 78 |
  • mithril https://github.com/MithrilJS MIT License
  • 79 |
  • Dayjs https://github.com/iamkun/dayjs/ MIT License
  • 80 |
81 |
82 |
83 |

84 | Privacy Policy 85 |

86 |
87 |

What data is stored?

88 | 89 |

Google Account

90 |

91 | If you have connected your Google account to the app, the username and password of your Google account will not be saved on the app. Authentication is done via OAuth. 92 |

93 |

94 | The information on the individual calendars and calendar events is stored locally using IndexedDB on your device. 95 |

96 | 97 |

CalDAV Account

98 |

99 | If you have connected the app to a CalDAV account, the username and password are stored locally using IndexedDB in the app. 100 |

101 |

102 | The information on the individual calendars and calendar events is also stored locally using IndexedDB. 103 |

104 | 105 |

Local Calendar

106 |

107 | Calendar events are stored locally on your device using IndexedDB. 108 |

109 | 110 |

Data protection and security

111 |

112 | The app uses IndexedDB for local data storage, which allows for efficient and secure management of large datasets. The storage of sensitive information, such as CalDAV account credentials, is encrypted and securely stored within IndexedDB to protect against unauthorized access. 113 |

114 |
115 | 116 | 117 | 118 | 119 |
120 | 121 | 122 | 123 | 124 | 125 |
126 |

You have a problem with the app or found a bug

127 | https://github.com/strukturart/greg/issues 128 |
129 | 130 | 131 | 132 |
133 |

Analysis of the data and use of the app

134 | 135 |

The app does not store any data that analyzes the use of the app, nor is there any tracking of the user.

136 |

If you installed the app with the KaiOs store:

137 |

138 | This software uses KaiAds. This is a third party service that may 139 | collect information used to identify you. Pricacy policy of 140 | KaiAds. 141 |

142 |
143 | 144 | 145 |
146 |
147 | 148 | 149 | 150 | -------------------------------------------------------------------------------- /docs/datenschutz.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Greg 9 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 |

Greg

23 | 24 | An easy to use calendar for KaiOS 25 |
26 | 27 |
28 |
29 |

How to use

30 |
    31 |
  • - Key 1 & 3 : Jump between the months
  • 32 |
  • - Key \* : Jump to current Day
  • 33 |
  • - Key Enter: toggle views
  • 34 |
  • - Key 2: event slider in month view
  • 35 |
  • - Key #: toggle moon phase view
  • 36 |
37 |
38 |
39 |

Nextcloud account

40 | 41 | if you want to use an external calendar, you have to enter the 42 | correct server address. at nextcloud as follows: - server: 43 | "https://xxxxx/remote.php/dav", - username: "xxxxm", - password: 44 | "xxxxx", 45 |
46 |
47 |

Features

48 |
    49 |
  • Local Calendar
  • 50 |
  • Nextcloud calendar
  • 51 |
  • Google calendar
  • 52 |
  • subscribe to public calendars
  • 53 |
  • moon phases
  • 54 |
55 | I tested subscribing to calendar with google calendar. you have the 56 | possibility to subscribe to public calendars and private calendars, 57 | in the google calendar settings you will find an ID that you can 58 | enter in greg (by hand or qr code). 59 |
60 |
61 |

How to install

62 | you can find the app in the 63 | bHaCkErSTORe or 64 | in the KaiOs Store or you can 65 | sideload 69 | it. 70 |
71 |
72 |

LICENSES

73 | This software (except KaiAds) is open source and licensed under the 74 | MIT License. View the source code. 75 |
76 |
    77 |
  • tsdav https://github.com/natelindev/tsdav MIT License
  • 78 |
  • mithril https://github.com/MithrilJS MIT License
  • 79 |
  • Dayjs https://github.com/iamkun/dayjs/ MIT License
  • 80 |
81 |
82 |
83 |

84 | Privacy Policy 85 |

86 |
87 |

What data is stored?

88 | 89 |

Google Account

90 |

91 | If you have connected your Google account to the app, the username and password of your Google account will not be saved on the app. Authentication is done via OAuth. 92 |

93 |

94 | The information on the individual calendars and calendar events is stored locally using IndexedDB on your device. 95 |

96 | 97 |

CalDAV Account

98 |

99 | If you have connected the app to a CalDAV account, the username and password are stored locally using IndexedDB in the app. 100 |

101 |

102 | The information on the individual calendars and calendar events is also stored locally using IndexedDB. 103 |

104 | 105 |

Local Calendar

106 |

107 | Calendar events are stored locally on your device using IndexedDB. 108 |

109 | 110 |

Data protection and security

111 |

112 | The app uses IndexedDB for local data storage, which allows for efficient and secure management of large datasets. The storage of sensitive information, such as CalDAV account credentials, is encrypted and securely stored within IndexedDB to protect against unauthorized access. 113 |

114 |
115 | 116 | 117 | 118 | 119 |
120 | 121 | 122 | 123 | 124 | 125 |
126 |

You have a problem with the app or found a bug

127 | https://github.com/strukturart/greg/issues 128 |
129 | 130 | 131 | 132 |
133 |

Analysis of the data and use of the app

134 | 135 |

The app does not store any data that analyzes the use of the app, nor is there any tracking of the user.

136 |

If you installed the app with the KaiOs store:

137 |

138 | This software uses KaiAds. This is a third party service that may 139 | collect information used to identify you. Pricacy policy of 140 | KaiAds. 141 |

142 |
143 | 144 | 145 |
146 |
147 | 148 | 149 | 150 | -------------------------------------------------------------------------------- /application/datenschutz.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Greg 9 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 |

Greg

23 | 24 | An easy to use calendar for KaiOS 25 |
26 | 27 |
28 |
29 |

How to use

30 |
    31 |
  • - Key 1 & 3 : Jump between the months
  • 32 |
  • - Key \* : Jump to current Day
  • 33 |
  • - Key Enter: toggle views
  • 34 |
  • - Key 2: event slider in month view
  • 35 |
  • - Key #: toggle moon phase view
  • 36 |
37 |
38 |
39 |

Nextcloud account

40 | 41 | if you want to use an external calendar, you have to enter the 42 | correct server address. at nextcloud as follows: - server: 43 | "https://xxxxx/remote.php/dav", - username: "xxxxm", - password: 44 | "xxxxx", 45 |
46 |
47 |

Features

48 |
    49 |
  • Local Calendar
  • 50 |
  • Nextcloud calendar
  • 51 |
  • Google calendar
  • 52 |
  • subscribe to public calendars
  • 53 |
  • moon phases
  • 54 |
55 | I tested subscribing to calendar with google calendar. you have the 56 | possibility to subscribe to public calendars and private calendars, 57 | in the google calendar settings you will find an ID that you can 58 | enter in greg (by hand or qr code). 59 |
60 |
61 |

How to install

62 | you can find the app in the 63 | bHaCkErSTORe or 64 | in the KaiOs Store or you can 65 | sideload 69 | it. 70 |
71 |
72 |

LICENSES

73 | This software (except KaiAds) is open source and licensed under the 74 | MIT License. View the source code. 75 |
76 |
    77 |
  • tsdav https://github.com/natelindev/tsdav MIT License
  • 78 |
  • mithril https://github.com/MithrilJS MIT License
  • 79 |
  • Dayjs https://github.com/iamkun/dayjs/ MIT License
  • 80 |
81 |
82 |
83 |

84 | Privacy Policy 85 |

86 |
87 |

What data is stored?

88 | 89 |

Google Account

90 |

91 | If you have connected your Google account to the app, the username and password of your Google account will not be saved on the app. Authentication is done via OAuth. 92 |

93 |

94 | The information on the individual calendars and calendar events is stored locally using IndexedDB on your device. 95 |

96 | 97 |

CalDAV Account

98 |

99 | If you have connected the app to a CalDAV account, the username and password are stored locally using IndexedDB in the app. 100 |

101 |

102 | The information on the individual calendars and calendar events is also stored locally using IndexedDB. 103 |

104 | 105 |

Local Calendar

106 |

107 | Calendar events are stored locally on your device using IndexedDB. 108 |

109 | 110 |

Data protection and security

111 |

112 | The app uses IndexedDB for local data storage, which allows for efficient and secure management of large datasets. The storage of sensitive information, such as CalDAV account credentials, is encrypted and securely stored within IndexedDB to protect against unauthorized access. 113 |

114 |
115 | 116 | 117 | 118 | 119 |
120 | 121 | 122 | 123 | 124 | 125 |
126 |

You have a problem with the app or found a bug

127 | https://github.com/strukturart/greg/issues 128 |
129 | 130 | 131 | 132 |
133 |

Analysis of the data and use of the app

134 | 135 |

The app does not store any data that analyzes the use of the app, nor is there any tracking of the user.

136 |

If you installed the app with the KaiOs store:

137 |

138 | This software uses KaiAds. This is a third party service that may 139 | collect information used to identify you. Pricacy policy of 140 | KaiAds. 141 |

142 |
143 | 144 | 145 |
146 |
147 | 148 | 149 | 150 | -------------------------------------------------------------------------------- /images/helper.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 35 | 37 | 41 | 44 | 47 | 56 | 74 | 92 | 94 | 102 | select next article 113 | 114 | 115 | 118 | 121 | 129 | 2 140 | 5 151 | 152 | 155 | 163 | select next channel 174 | 175 | 176 | 177 | 178 | -------------------------------------------------------------------------------- /application/assets/css/grid.css: -------------------------------------------------------------------------------- 1 | /* G R I D */ 2 | 3 | .grid-col-1 { 4 | min-width: 10px; 5 | max-width: 10px; 6 | } 7 | 8 | .grid-col-2 { 9 | min-width: 20px; 10 | max-width: 20px; 11 | } 12 | 13 | .grid-col-3 { 14 | min-width: 30px; 15 | max-width: 30px; 16 | } 17 | 18 | .grid-col-4 { 19 | min-width: 40px; 20 | max-width: 40px; 21 | } 22 | 23 | .grid-col-5 { 24 | min-width: 50px; 25 | max-width: 50px; 26 | } 27 | 28 | .grid-col-6 { 29 | min-width: 60px; 30 | max-width: 60px; 31 | } 32 | 33 | .grid-col-7 { 34 | min-width: 70px; 35 | max-width: 70px; 36 | } 37 | 38 | .grid-col-8 { 39 | min-width: 80px; 40 | max-width: 80px; 41 | } 42 | 43 | .grid-col-9 { 44 | min-width: 90px; 45 | max-width: 90px; 46 | } 47 | 48 | .grid-col-10 { 49 | min-width: 100px; 50 | max-width: 100px; 51 | } 52 | 53 | .grid-col-11 { 54 | min-width: 110px; 55 | max-width: 110px; 56 | } 57 | 58 | .grid-col-12 { 59 | min-width: 120px; 60 | max-width: 120px; 61 | } 62 | 63 | .grid-col-13 { 64 | min-width: 130px; 65 | max-width: 130px; 66 | } 67 | 68 | .grid-col-14 { 69 | min-width: 140px; 70 | max-width: 140px; 71 | } 72 | 73 | .grid-col-15 { 74 | min-width: 150px; 75 | max-width: 150px; 76 | } 77 | 78 | .grid-col-16 { 79 | min-width: 160px; 80 | max-width: 160px; 81 | } 82 | 83 | .grid-col-17 { 84 | min-width: 170px; 85 | max-width: 170px; 86 | } 87 | 88 | .grid-col-18 { 89 | min-width: 180px; 90 | max-width: 180px; 91 | } 92 | 93 | .grid-col-19 { 94 | min-width: 190px; 95 | max-width: 190px; 96 | } 97 | 98 | .grid-col-20 { 99 | min-width: 200px; 100 | max-width: 200px; 101 | } 102 | 103 | .grid-col-21 { 104 | min-width: 210px; 105 | max-width: 210px; 106 | } 107 | 108 | .grid-col-22 { 109 | min-width: 220px; 110 | max-width: 220px; 111 | } 112 | 113 | .grid-col-23 { 114 | min-width: 230px; 115 | max-width: 230px; 116 | } 117 | 118 | .grid-col-24 { 119 | min-width: 240px; 120 | max-width: 240px; 121 | } 122 | 123 | .grid-col-25 { 124 | min-width: 250px; 125 | max-width: 250px; 126 | } 127 | 128 | .grid-col-26 { 129 | min-width: 260px; 130 | max-width: 260px; 131 | } 132 | 133 | .grid-col-27 { 134 | min-width: 270px; 135 | max-width: 270px; 136 | } 137 | 138 | .grid-col-28 { 139 | min-width: 280px; 140 | max-width: 280px; 141 | } 142 | 143 | .grid-col-29 { 144 | min-width: 290px; 145 | max-width: 290px; 146 | } 147 | 148 | .grid-col-30 { 149 | min-width: 300px; 150 | max-width: 300px; 151 | } 152 | 153 | .grid-col-31 { 154 | min-width: 310px; 155 | max-width: 310px; 156 | } 157 | 158 | .grid-col-32 { 159 | min-width: 320px; 160 | max-width: 320px; 161 | } 162 | 163 | .grid-col-33 { 164 | min-width: 330px; 165 | max-width: 330px; 166 | } 167 | 168 | .grid-col-34 { 169 | min-width: 340px; 170 | max-width: 340px; 171 | } 172 | 173 | .grid-col-35 { 174 | min-width: 350px; 175 | max-width: 350px; 176 | } 177 | 178 | .grid-col-36 { 179 | min-width: 360px; 180 | max-width: 360px; 181 | } 182 | 183 | .grid-col-37 { 184 | min-width: 370px; 185 | max-width: 370px; 186 | } 187 | 188 | .grid-col-38 { 189 | min-width: 380px; 190 | max-width: 380px; 191 | } 192 | 193 | .grid-col-39 { 194 | min-width: 390px; 195 | max-width: 390px; 196 | } 197 | 198 | .grid-col-40 { 199 | min-width: 400px; 200 | max-width: 400px; 201 | } 202 | 203 | .grid-col-41 { 204 | min-width: 410px; 205 | max-width: 410px; 206 | } 207 | 208 | .grid-col-42 { 209 | min-width: 420px; 210 | max-width: 420px; 211 | } 212 | 213 | .grid-col-43 { 214 | min-width: 430px; 215 | max-width: 430px; 216 | } 217 | 218 | .grid-col-44 { 219 | min-width: 440px; 220 | max-width: 440px; 221 | } 222 | 223 | .grid-col-45 { 224 | min-width: 450px; 225 | max-width: 450px; 226 | } 227 | 228 | .grid-col-46 { 229 | min-width: 460px; 230 | max-width: 460px; 231 | } 232 | 233 | .grid-col-47 { 234 | min-width: 470px; 235 | max-width: 470px; 236 | } 237 | 238 | .grid-col-48 { 239 | min-width: 480px; 240 | max-width: 480px; 241 | } 242 | 243 | .grid-col-49 { 244 | min-width: 490px; 245 | max-width: 490px; 246 | } 247 | 248 | .grid-col-50 { 249 | min-width: 500px; 250 | max-width: 500px; 251 | } 252 | 253 | .grid-col-51 { 254 | min-width: 510px; 255 | max-width: 510px; 256 | } 257 | 258 | .grid-col-52 { 259 | min-width: 520px; 260 | max-width: 520px; 261 | } 262 | 263 | .grid-col-53 { 264 | min-width: 530px; 265 | max-width: 530px; 266 | } 267 | 268 | .grid-col-54 { 269 | min-width: 540px; 270 | max-width: 540px; 271 | } 272 | 273 | .grid-col-55 { 274 | min-width: 550px; 275 | max-width: 550px; 276 | } 277 | 278 | .grid-col-56 { 279 | min-width: 560px; 280 | max-width: 560px; 281 | } 282 | 283 | .grid-col-57 { 284 | min-width: 570px; 285 | max-width: 570px; 286 | } 287 | 288 | .grid-col-58 { 289 | min-width: 580px; 290 | max-width: 580px; 291 | } 292 | 293 | .grid-col-59 { 294 | min-width: 590px; 295 | max-width: 590px; 296 | } 297 | 298 | .grid-col-60 { 299 | min-width: 600px; 300 | max-width: 600px; 301 | } 302 | 303 | .grid-col-61 { 304 | min-width: 610px; 305 | max-width: 610px; 306 | } 307 | 308 | .grid-col-62 { 309 | min-width: 620px; 310 | max-width: 620px; 311 | } 312 | 313 | .grid-col-63 { 314 | min-width: 630px; 315 | max-width: 630px; 316 | } 317 | 318 | .grid-col-64 { 319 | min-width: 640px; 320 | max-width: 640px; 321 | } 322 | 323 | .grid-col-65 { 324 | min-width: 650px; 325 | max-width: 650px; 326 | } 327 | 328 | .grid-col-66 { 329 | min-width: 660px; 330 | max-width: 660px; 331 | } 332 | 333 | .grid-col-67 { 334 | min-width: 670px; 335 | max-width: 670px; 336 | } 337 | 338 | .grid-col-68 { 339 | min-width: 680px; 340 | max-width: 680px; 341 | } 342 | 343 | .grid-col-69 { 344 | min-width: 690px; 345 | max-width: 690px; 346 | } 347 | 348 | .grid-col-70 { 349 | min-width: 700px; 350 | max-width: 700px; 351 | } 352 | 353 | .grid-col-71 { 354 | min-width: 710px; 355 | max-width: 710px; 356 | } 357 | 358 | .grid-col-72 { 359 | min-width: 720px; 360 | max-width: 720px; 361 | } 362 | 363 | .grid-col-73 { 364 | min-width: 730px; 365 | max-width: 730px; 366 | } 367 | 368 | .grid-col-74 { 369 | min-width: 740px; 370 | max-width: 740px; 371 | } 372 | 373 | .grid-col-75 { 374 | min-width: 750px; 375 | max-width: 750px; 376 | } 377 | 378 | .grid-col-76 { 379 | min-width: 760px; 380 | max-width: 760px; 381 | } 382 | 383 | .grid-col-77 { 384 | min-width: 770px; 385 | max-width: 770px; 386 | } 387 | 388 | .grid-col-78 { 389 | min-width: 780px; 390 | max-width: 780px; 391 | } 392 | 393 | .grid-col-79 { 394 | min-width: 790px; 395 | max-width: 790px; 396 | } 397 | 398 | .grid-col-80 { 399 | min-width: 800px; 400 | max-width: 800px; 401 | } 402 | 403 | .grid-col-81 { 404 | min-width: 810px; 405 | max-width: 810px; 406 | } 407 | 408 | .grid-col-82 { 409 | min-width: 820px; 410 | max-width: 820px; 411 | } 412 | 413 | .grid-col-83 { 414 | min-width: 830px; 415 | max-width: 830px; 416 | } 417 | 418 | .grid-col-84 { 419 | min-width: 840px; 420 | max-width: 840px; 421 | } 422 | 423 | .grid-col-85 { 424 | min-width: 850px; 425 | max-width: 850px; 426 | } 427 | 428 | .grid-col-86 { 429 | min-width: 860px; 430 | max-width: 860px; 431 | } 432 | 433 | .grid-col-87 { 434 | min-width: 870px; 435 | max-width: 870px; 436 | } 437 | 438 | .grid-col-88 { 439 | min-width: 880px; 440 | max-width: 880px; 441 | } 442 | 443 | .grid-col-88 { 444 | min-width: 880px; 445 | max-width: 880px; 446 | } 447 | 448 | .grid-col-89 { 449 | min-width: 890px; 450 | max-width: 890px; 451 | } 452 | 453 | .grid-col-90 { 454 | min-width: 900px; 455 | max-width: 900px; 456 | } 457 | 458 | .grid-col-91 { 459 | min-width: 910px; 460 | max-width: 910px; 461 | } 462 | 463 | .grid-col-92 { 464 | min-width: 920px; 465 | max-width: 920px; 466 | } 467 | 468 | .grid-col-93 { 469 | min-width: 930px; 470 | max-width: 930px; 471 | } 472 | 473 | .grid-col-94 { 474 | min-width: 940px; 475 | max-width: 940px; 476 | } 477 | 478 | .grid-col-95 { 479 | min-width: 950px; 480 | max-width: 950px; 481 | } 482 | 483 | .grid-col-96 { 484 | min-width: 960px; 485 | max-width: 960px; 486 | } 487 | 488 | .text-center { 489 | text-align: center; 490 | } 491 | 492 | .flex { 493 | display: -webkit-flex; 494 | display: flex; 495 | -webkit-flex-direction: row; 496 | flex-direction: row; 497 | -webkit-flex-wrap: wrap; 498 | flex-wrap: wrap; 499 | } 500 | 501 | .flex-column { 502 | -webkit-flex-direction: column; 503 | -ms-flex-direction: column; 504 | flex-direction: column; 505 | } 506 | 507 | .justify-content-start { 508 | -webkit-align-items: flex-start; 509 | align-items: flex-start; 510 | } 511 | 512 | .justify-content-end { 513 | -webkit-justify-content: flex-end; 514 | justify-content: flex-end; 515 | } 516 | 517 | .algin-item-start { 518 | -webkit-align-items: flex-start; 519 | align-items: flex-start; 520 | } 521 | 522 | .algin-item-end { 523 | -webkit-align-items: flex-end; 524 | align-items: flex-end; 525 | } 526 | 527 | .align-item-center { 528 | -webkit-align-items: center; 529 | -ms-flex-align: center; 530 | align-items: center; 531 | } 532 | 533 | .justify-content-spacebetween { 534 | -webkit-justify-content: space-between; 535 | justify-content: space-between; 536 | } 537 | 538 | .justify-content-spacearound { 539 | -webkit-justify-content: space-around; 540 | -ms-flex-pack: distribute; 541 | justify-content: space-around; 542 | -webkit-align-content: space-around; 543 | -ms-flex-line-pack: distribute; 544 | align-content: space-around; 545 | } 546 | 547 | .justify-content-center { 548 | -webkit-justify-content: center; 549 | -ms-flex-pack: center; 550 | justify-content: center; 551 | } 552 | 553 | .width-100 { 554 | min-width: 100vw; 555 | max-width: 100vw; 556 | } 557 | 558 | .height-100 { 559 | min-height: 100vh; 560 | } 561 | 562 | .width-95 { 563 | min-width: 95%; 564 | } 565 | 566 | .width-98 { 567 | min-width: 98%; 568 | } 569 | 570 | .width-50 { 571 | min-width: 50%; 572 | } 573 | 574 | .width-30 { 575 | min-width: 30%; 576 | max-width: 30%; 577 | } 578 | 579 | .center { 580 | transform: translate(50%, -0%); 581 | } 582 | 583 | .block { 584 | display: block; 585 | } 586 | -------------------------------------------------------------------------------- /docs/assets/image/E1D8.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 32 | 39 | 41 | 48 | 55 | 62 | 63 | 66 | 72 | 78 | 84 | 90 | 96 | 102 | 108 | 114 | 120 | 126 | 132 | 138 | 144 | 150 | 156 | 162 | 168 | 174 | 184 | 194 | 204 | 214 | 224 | 234 | 244 | 252 | 260 | 268 | 276 | 284 | 292 | 300 | 308 | 316 | 324 | 332 | 340 | 348 | 356 | 364 | 372 | 380 | 388 | 396 | 404 | 412 | 420 | 428 | 436 | 444 | 452 | 460 | 461 | 462 | -------------------------------------------------------------------------------- /application/assets/image/E1D8.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 32 | 39 | 41 | 48 | 55 | 62 | 63 | 66 | 72 | 78 | 84 | 90 | 96 | 102 | 108 | 114 | 120 | 126 | 132 | 138 | 144 | 150 | 156 | 162 | 168 | 174 | 184 | 194 | 204 | 214 | 224 | 234 | 244 | 252 | 260 | 268 | 276 | 284 | 292 | 300 | 308 | 316 | 324 | 332 | 340 | 348 | 356 | 364 | 372 | 380 | 388 | 396 | 404 | 412 | 420 | 428 | 436 | 444 | 452 | 460 | 461 | 462 | --------------------------------------------------------------------------------