{"id":23550375,"url":"https://github.com/piotrpdev/oko","last_synced_at":"2026-03-01T00:32:32.805Z","repository":{"id":269033045,"uuid":"870625550","full_name":"piotrpdev/oko","owner":"piotrpdev","description":"fully local home security system","archived":false,"fork":false,"pushed_at":"2025-05-15T18:14:50.000Z","size":2554,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-07T18:59:29.434Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://oko.piotrp.dev/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/piotrpdev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-10-10T11:34:01.000Z","updated_at":"2025-05-15T18:14:54.000Z","dependencies_parsed_at":"2024-12-20T13:22:18.370Z","dependency_job_id":"359d3349-e381-4c2d-b85b-cf935fe682bb","html_url":"https://github.com/piotrpdev/oko","commit_stats":null,"previous_names":["piotrpdev/oko"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/piotrpdev/oko","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrpdev%2Foko","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrpdev%2Foko/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrpdev%2Foko/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrpdev%2Foko/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/piotrpdev","download_url":"https://codeload.github.com/piotrpdev/oko/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/piotrpdev%2Foko/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29956195,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-28T22:53:01.873Z","status":"ssl_error","status_checked_at":"2026-02-28T22:52:50.699Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-26T10:15:53.053Z","updated_at":"2026-03-01T00:32:32.755Z","avatar_url":"https://github.com/piotrpdev.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- markdownlint-configure-file {\n  \"MD013\": {\n    tables: false\n  },\n  \"MD033\": false,\n  \"MD036\": false,\n  \"MD041\": false\n} --\u003e\n\u003cdiv align=\"center\"\u003e\n\n![demo](landing/assets/demo.webp)\n\n# Oko\n\nFully local home security system.\n\nFinal Year Project for SETU's [BSc (Hons.) in Software Systems Development][ssd].\n\n\u003c/div\u003e\n\n## Prerequisites\n\n[OpenCV][opencv] (see [`opencv-rust/INSTALL.md`][opencv-install])\n\n## Scripts\n\n```bash\n./make.sh run           # Default admin password: \"hunter42\"\n\n./make.sh f             # Run frontend in dev mode\n./make.sh b             # Run backend in dev mode\n\n./make.sh seed          # Seed DB with dummy data\n./make.sh cam1          # Send dummy camera images\n\n./make.sh t             # Run tests\n./make.sh coverage\n```\n\n## Repository Structure\n\n```bash\n.\n├── backend                         # Oko webserver (+ recording, mDNS, etc.)\n│   ├── ...\n│   └── utils\n│       ├── camera-impersonator     # CLI for sending fake camera images to Oko\n│       └── ws-utils                # Functions for WebSocket port reuse\n├── camera                          # ESP32-CAM code\n│   ├── ...\n│   └── esp-camera-rs               # Safe wrappers for unsafe camera functions\n├── frontend                        # Oko web UI\n└── landing                         # Project info page (https://oko.piotrp.dev/)\n```\n\n## Features\n\nFor a full list see the [Documents](#documents).\n\n| Add Camera | Video Feed | Camera Settings | Captive Portal |\n|:----------:|:----------:|:---------------:|:--------------:|\n| \u003cimg alt=\"add camera\" width=\"400px\" src=\"landing/assets/add.webp\"/\u003e | \u003cimg alt=\"video feed\" width=\"400px\" src=\"landing/assets/streaming.webp\"/\u003e | \u003cimg alt=\"camera settings\" width=\"400px\" src=\"landing/assets/settings.webp\"/\u003e | \u003cimg alt=\"captive portal\" width=\"400px\" src=\"landing/assets/captive.webp\"/\u003e |\n\n## Documents\n\n*(each image links to its respective document)*\n\n| Presentation | Report | Poster |\n|:------------:|:------:|:------:|\n| [\u003cimg alt=\"add camera\" width=\"800px\" src=\"landing/assets/presentation.webp\"/\u003e](landing/assets/presentation.pdf) | [\u003cimg alt=\"video feed\" width=\"400px\" src=\"landing/assets/report.webp\"/\u003e](landing/assets/report.pdf) | [\u003cimg alt=\"poster\" width=\"400px\" src=\"landing/assets/poster.webp\"/\u003e](landing/assets/poster.pdf) |\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    Poster concept made at the start of the project\n  \u003c/summary\u003e\n  \u003cbr/\u003e\n\n  ![poster prototype](landing/assets/poster_prototype.webp)\n\u003c/details\u003e\n\n## Flow Diagrams\n\n| Oko Overview |\n|:-------:|\n| ![Oko Overview](landing/assets/flow-diagrams/Threads.svg) |\n\n| Account Creation | CI/CD Testing | Settings |\n|:----------------:|:-------------:|:--------:|\n| ![Account Creation](landing/assets/flow-diagrams/Account_Creation_Flow.svg) | ![CI/CD Testing](landing/assets/flow-diagrams/CICD_Testing.svg) | ![Settings](landing/assets/flow-diagrams/Camera_Settings_Flow.svg) |\n\n| Recording | Camera Detection |\n|:----------------:|:-------------:|\n| ![Recording](landing/assets/flow-diagrams/Record_Flow.svg) | ![Camera Detection](landing/assets/flow-diagrams/Camera_Detection_Flow.svg) |\n\n| Image Streaming | ESP32-CAM Setup | Permissions |\n|:---------------:|:---------------:|:-----------:|\n| ![Image Streaming](landing/assets/flow-diagrams/ESP32-CAM_Image_Streaming.svg) | ![Image Streaming](landing/assets/flow-diagrams/ESP32-CAM_Setup.svg) | ![Permissions](landing/assets/flow-diagrams/Permissions_Flow.svg) |\n\n## Notes\n\n| Notes | Demo Notes |\n|:-----:|:----------:|\n| [\u003cimg alt=\"notes\" width=\"800px\" src=\"landing/assets/notes.webp\"/\u003e](landing/assets/notes.webp) | [\u003cimg alt=\"demo notes\" width=\"400px\" src=\"landing/assets/demo_notes.webp\"/\u003e](landing/assets/demo_notes.webp) |\n\n## License\n\nThis project is licensed under the [GNU GPL v3.0][license].\n\nMade using the following resources:\n\n| Resource                                  | License                           |\n|:-----------------------------------------:|:---------------------------------:|\n| [`axum-login` example code][axum-sqlite]  | [MIT][axum-login-license]         |\n| [Axum example code][axum-examples]        | [MIT][axum-license]               |\n| [video2image][video2image]                | N/A[^1]                           |\n| [Vite PWA Svelte template][pwa]           | [MIT][pwa-license]                |\n| [Svelte ESLint example config][eslint]    | [MIT][eslint-license]             |\n| [Svelte Prettier example config][prettier]| [MIT][prettier-license]           |\n| [Playwright-rust README][playwright]      | [MIT][playwright-license]         |\n| [Testing Library setup][test-setup]       | [MIT][test-license]               |\n| [Vitest mocking example][mocking]         | [MIT][vitest-license]             |\n| [opencv-rs example code][opencv-example]  | [MIT][opencv-license]             |\n| [tungstenite examples][tungsten-example]  | [MIT][tungsten-license]           |\n| [shadcn Blocks][shadcn-blocks]            | [MIT][shadcn-license]             |\n| [ESP32-CAM example code][esp32-cam]       | [GNU LGPLv2.1][cam-license]       |\n| [ArduinoWebsockets examples][ws-example]  | [GNU GPLv3.0][ws-license]         |\n| [ESPAsyncWebServer examples][espa-example]| [GNU LGPLv3.0][espa-license]      |\n| [Lucide icons][lucide]                    | [ISC][lucide-license]             |\n| [`esp-idf-template` examples][idf-example]| [MIT][idf-license]                |\n| [`esp-rs/std-training`][esp-std]          | [MIT][esp-std-license]            |\n| [`esp-idf-svc` examples][idf-svc-example] | [MIT][idf-svc-license]            |\n| [`edge-net` examples][edge-net-example]   | [MIT][edge-net-license]           |\n| [gatekeeper source code][gatekeeper]      | [Unlicense][gatekeeper-license]   |\n| [`esp-camera-rs` package fork][cam-rs]    | [MIT][cam-rs-license]             |\n| [Geist font][geist]                       | [OFL-1.1][geist-license]          |\n| [`mdns` package fork][mdns]               | [MIT][mdns-license]               |\n| [`mdns` examples][mdns-examples]          | [MIT][mdns-license]               |\n\n[^1]: [*\"...this solution can be customized to suit your particular requirements.\nDon’t hesitate to make adjustments and employ this code according to your\nvideo-to-image conversion needs.\"*][video2image-medium]\n\n[opencv]: https://opencv.org/\n[opencv-install]: https://github.com/twistedfall/opencv-rust/blob/6784a7e74c5cd3e1edced9484d6839d67ee70a12/INSTALL.md\n[license]: ./LICENSE\n[axum-sqlite]: https://github.com/maxcountryman/axum-login/tree/9c26b37cd03be8d803ae261b7bc556229c2043da/examples/sqlite\n[axum-login-license]: https://github.com/maxcountryman/axum-login/blob/9c26b37cd03be8d803ae261b7bc556229c2043da/LICENSE\n[axum-examples]: https://github.com/tokio-rs/axum/tree/main/examples\n[axum-license]: https://github.com/tokio-rs/axum/blob/main/axum/LICENSE\n[video2image]: https://github.com/Wayan123/convert-video2image-and-image2video-using-python/blob/3886bf02af4b3c31d566b95ff7af1c9ad2ef7bc8/video2image.py\n[video2image-medium]: https://medium.com/@wayandadangunsri/converting-video-to-images-using-python-and-opencv-72b2ea66a692\n[pwa]: https://github.com/vite-pwa/create-pwa/tree/9df7c97be15ea6bdc8660472e90db2aa005c9892/templates/template-svelte-ts\n[pwa-license]: https://github.com/vite-pwa/create-pwa/blob/main/LICENSE\n[eslint]: https://github.com/ota-meshi/eslint-online-playground/blob/main/src/examples/plugin-svelte_with_ts/eslint.config.js.txt\n[eslint-license]: https://github.com/ota-meshi/eslint-online-playground/blob/main/LICENSE\n[prettier]: https://github.com/sveltejs/prettier-plugin-svelte\n[prettier-license]: https://github.com/sveltejs/prettier-plugin-svelte/blob/master/LICENSE\n[playwright]: https://github.com/octaltree/playwright-rust/blob/master/README.md\n[playwright-license]: https://github.com/octaltree/playwright-rust/blob/master/Cargo.toml\n[test-setup]: https://testing-library.com/docs/svelte-testing-library/setup\n[test-license]: https://github.com/testing-library/testing-library-docs/blob/main/LICENSE\n[mocking]: https://vitest.dev/guide/mocking#requests\n[vitest-license]: https://github.com/vitest-dev/vitest/blob/main/LICENSE\n[opencv-example]: https://github.com/twistedfall/opencv-rust/blob/6784a7e74c5cd3e1edced9484d6839d67ee70a12/examples/video_capture_http_stream.rs\n[opencv-license]: https://github.com/twistedfall/opencv-rust/blob/6784a7e74c5cd3e1edced9484d6839d67ee70a12/LICENSE\n[tungsten-example]: https://github.com/snapview/tokio-tungstenite/blob/cae2e89102dbb212ee723b912f7dc540398be28e/examples/client.rs\n[tungsten-license]: https://github.com/snapview/tokio-tungstenite/blob/cae2e89102dbb212ee723b912f7dc540398be28e/LICENSE\n[shadcn-blocks]: https://github.com/huntabyte/shadcn-svelte/tree/main/sites/docs/src/lib/registry/new-york/block\n[shadcn-license]: https://github.com/huntabyte/shadcn-svelte/blob/main/LICENSE.md\n[esp32-cam]: https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Camera/CameraWebServer\n[cam-license]: https://github.com/espressif/arduino-esp32/blob/master/LICENSE.md\n[ws-example]: https://github.com/gilmaimon/ArduinoWebsockets/tree/master/examples\n[ws-license]: https://github.com/gilmaimon/ArduinoWebsockets/blob/master/LICENSE\n[espa-example]: https://github.com/ESP32Async/ESPAsyncWebServer/tree/main/examples\n[espa-license]: https://github.com/ESP32Async/ESPAsyncWebServer/blob/main/LICENSE\n[lucide]: https://github.com/lucide-icons/lucide\n[lucide-license]: https://github.com/lucide-icons/lucide/blob/main/LICENSE\n[idf-example]: https://github.com/esp-rs/esp-idf-template\n[idf-license]: https://github.com/esp-rs/esp-idf-template/blob/master/LICENSE-MIT\n[esp-std]: https://github.com/esp-rs/std-training/\n[esp-std-license]: https://github.com/esp-rs/std-training/blob/main/LICENSE-MIT.txt\n[idf-svc-example]: https://github.com/esp-rs/esp-idf-svc\n[idf-svc-license]: https://github.com/esp-rs/esp-idf-svc/blob/master/LICENSE-MIT\n[edge-net-example]: https://github.com/ivmarkov/edge-net/tree/master/examples\n[edge-net-license]: https://github.com/ivmarkov/edge-net/blob/master/LICENSE-MIT\n[gatekeeper]: https://github.com/shekohex/gatekeeper\n[gatekeeper-license]: https://github.com/shekohex/gatekeeper/blob/main/LICENSE\n[cam-rs]: https://github.com/hnz1102/esp-camera-rs\n[cam-rs-license]: https://github.com/hnz1102/esp-camera-rs/blob/main/LICENSE\n[geist]: https://github.com/vercel/geist-font\n[geist-license]: https://github.com/vercel/geist-font/blob/main/OFL.txt\n[mdns]: https://github.com/PhysicalGraph/mdns\n[mdns-examples]: https://github.com/PhysicalGraph/mdns/tree/master/examples\n[mdns-license]: https://github.com/PhysicalGraph/mdns/blob/master/LICENSE\n[ssd]: https://www.setu.ie/courses/bsc-hons-in-software-systems-development\n\n\u003c!-- https://eslint.org/docs/latest/use/configure/language-options --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpiotrpdev%2Foko","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpiotrpdev%2Foko","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpiotrpdev%2Foko/lists"}