{"id":25917154,"url":"https://github.com/lostincompilation/prettyota","last_synced_at":"2026-06-20T12:33:07.168Z","repository":{"id":280236191,"uuid":"937358461","full_name":"LostInCompilation/PrettyOTA","owner":"LostInCompilation","description":"OTA (Over the air) update library - A better looking Web OTA updater for ESP32 \u0026 Raspberry Pi Pico W - including easy rollback feature","archived":false,"fork":false,"pushed_at":"2025-06-03T16:12:14.000Z","size":1655,"stargazers_count":206,"open_issues_count":2,"forks_count":10,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-06-04T01:38:38.536Z","etag":null,"topics":["arduino","arduino-library","esp32","firmware-update","firmware-updater","firmware-updates","library","ota","ota-firmware-updates","ota-update","raspberry-pi","raspberry-pi-pico","update"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LostInCompilation.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","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},"funding":{"buy_me_a_coffee":"lostincompilation"}},"created_at":"2025-02-22T22:02:31.000Z","updated_at":"2025-05-21T14:56:36.000Z","dependencies_parsed_at":"2025-03-02T07:24:06.487Z","dependency_job_id":"4ad4f345-8996-47a9-b94d-e0ebe42d5924","html_url":"https://github.com/LostInCompilation/PrettyOTA","commit_stats":null,"previous_names":["lostincompilation/prettyota"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/LostInCompilation/PrettyOTA","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LostInCompilation%2FPrettyOTA","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LostInCompilation%2FPrettyOTA/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LostInCompilation%2FPrettyOTA/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LostInCompilation%2FPrettyOTA/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LostInCompilation","download_url":"https://codeload.github.com/LostInCompilation/PrettyOTA/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LostInCompilation%2FPrettyOTA/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34570537,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-20T02:00:06.407Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["arduino","arduino-library","esp32","firmware-update","firmware-updater","firmware-updates","library","ota","ota-firmware-updates","ota-update","raspberry-pi","raspberry-pi-pico","update"],"created_at":"2025-03-03T13:20:17.124Z","updated_at":"2026-06-20T12:33:07.146Z","avatar_url":"https://github.com/LostInCompilation.png","language":"C++","funding_links":["https://buymeacoffee.com/lostincompilation"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg src=\"img/logo.svg\" alt=\"Screenshot\" style=\"height:100px;\"/\u003e\n\u003c/p\u003e\n\n### \u003ccenter\u003eA modern looking OTA update server with easy rollback\u003c/center\u003e\n\n## Features\n- ***Drag and drop*** firmware or filesystem .bin file to start updating\n- ***Rollback*** to previous firmware with one button click\n- ***Show info*** about board (Firmware version, build time)\n- Automatic ***reboot*** after update/rollback\n- If needed enable **authentication** (username and password login)\n\n## Usage\n```cpp\n#include \u003cWiFi.h\u003e\n#include \"PrettyOTA.hpp\"\n\nconst char* WIFI_SSID     = \"YOUR_SSID\";\nconst char* WIFI_PASSWORD = \"YOUR_WIFI_PASSWORD\";\n\nAsyncWebServer  server(80);\nPrettyOTA       OTA;\n\nvoid setup() {\n    // Initialize WiFi\n    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);\n    \n    // Initialize OTA\n    OTA.Begin(\u0026server);\n    \n    // Start web server\n    server.begin();\n}\n\nvoid loop() {\n}\n```\n\n## Demo\n![Screen Recording 2025-03-02 at 08 26 48](https://github.com/user-attachments/assets/77b92946-ed00-470f-ad9b-a70e98503e44)\n\n## The Begin function\n```cpp\nPrettyOTA::Begin(Server, Username, Password, IsPasswordMD5Hash);\n```\n- Server: `AsyncWebServer*`\n- Username: `const char*` *(Optional)*\n- Password: `const char*` *(Optional)* - Can be normal text or an MD5 hash of the password\n- IsPasswordMD5Hash: `bool` *(Optional) Default: false* - Set to `true` if the password is a MD5 hash\n\n## Callbacks\nYou can define your own callbacks which get called by PrettyOTA:\n\n```cpp\n#include \u003cWiFi.h\u003e\n#include \"PrettyOTA.hpp\"\n\nconst char* WIFI_SSID     = \"YOUR_SSID\";\nconst char* WIFI_PASSWORD = \"YOUR_WIFI_PASSWORD\";\n\nAsyncWebServer  server(80);\nPrettyOTA       OTA;\n\nvoid OnOTAStart()\n{\n    Serial.println(\"OTA update started\");\n}\n\nvoid OnOTAProgress(uint32_t currentSize, uint32_t totalSize)\n{\n    Serial.printf(\"OTA Progress Current: %u bytes, Total: %u bytes\\n\", currentSize, totalSize);\n}\n\nvoid OnOTAEnd(bool successful)\n{\n    if (successful)\n        Serial.println(\"OTA update finished successfully\");\n    else\n        Serial.println(\"OTA update failed\");\n}\n\nvoid setup() {\n    Serial.begin(9600);\n    \n    // Initialize WiFi here\n    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);\n    \n    // Initialize OTA\n    OTAUpdates.Begin(\u0026server, \"admin\", \"123\");\n    \n    // Set callbacks\n    OTAUpdates.OnStart(OnOTAStart);\n    OTAUpdates.OnProgress(OnOTAProgress);\n    OTAUpdates.OnEnd(OnOTAEnd);\n    \n    // Start web server\n    server.begin();\n}\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flostincompilation%2Fprettyota","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flostincompilation%2Fprettyota","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flostincompilation%2Fprettyota/lists"}