From e9ccb7d3b1abbbe15b1272813118739a89e31c41 Mon Sep 17 00:00:00 2001 From: Protocolbot Date: Wed, 8 Jul 2026 18:41:53 -0600 Subject: [PATCH] feat: add logo, PWA manifest, favicon - Geometric Companion logo: rounded head, blue outline, green eyes, green antenna tip. SVG for crisp rendering at any size. - Logo appears in header next to site name - PWA manifest (manifest.json) with 192px and 512px PNG icons - Favicon (favicon.ico) for browser tab - Apple touch icon for iOS home screen - README: logo replacement instructions for whitelabeling To replace the logo for whitelabeling, just swap frontend/logo.svg and the icon PNGs. Update tags in index.html if filename changes. --- README.md | 15 +++++++++++++-- frontend/favicon.ico | Bin 0 -> 678 bytes frontend/icon-192.png | Bin 0 -> 5022 bytes frontend/icon-512.png | Bin 0 -> 14524 bytes frontend/index.html | 32 ++++++-------------------------- frontend/logo.svg | 13 +++++++++++++ frontend/style.css | 5 +++-- manifest.json | 26 ++++++++++++++++++++++++++ 8 files changed, 61 insertions(+), 30 deletions(-) create mode 100644 frontend/favicon.ico create mode 100644 frontend/icon-192.png create mode 100644 frontend/icon-512.png create mode 100644 frontend/logo.svg create mode 100644 manifest.json diff --git a/README.md b/README.md index 93f992b..88688fe 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ protocol-droid/ ``` 4. The database schema auto-initializes on first API request (creates `data/protocol_droid.db`) 5. Visit the site and register — the **first user to register becomes admin** -5. Optionally load seed protocols: Go to your **profile page** (click your @username) and click **"Load Seed Protocols"** (visible to admins only). This loads 100 example protocols into your library. Can be repeated to re-import seeds. +6. Optionally load seed protocols: Go to the **About** page and click **"Load seed protocols"** (visible to admins only). This loads 6 example protocols into your library in one click. No curl needed. **No default admin credentials exist.** A fresh deployment has an empty database. The first registration creates the admin account. Seed protocols are optional and must be explicitly loaded. @@ -122,7 +122,7 @@ cd protocol-droid php -S localhost:8000 ``` -The SQLite database is created automatically at `data/protocol_droid.db`. The first registration creates the admin account. To load the 100 sample protocols, go to your **profile page** (click your @username) and click **"Load Seed Protocols"** (admins only). +The SQLite database is created automatically at `data/protocol_droid.db`. The first registration creates the admin account. To load the 6 sample protocols (Round Robin Check-In, Consent Decision-Making, etc.): ```bash # After registering as admin: @@ -171,6 +171,17 @@ curl -b cookies.txt -X DELETE http://localhost:8000/api/protocols/round-robin-ch Protocol Droid is designed to be fully whitelabel-able. Here's how to customize it for your deployment: +### Logo + +The logo is an SVG file at `frontend/logo.svg`. It appears in the header next to the site name and as the browser/PWA icon. + +To replace it: +1. Create your own SVG logo (or PNG) +2. Replace `frontend/logo.svg` (and `frontend/favicon.ico`, `frontend/icon-192.png`, `frontend/icon-512.png` for PWA icons) +3. If using a different filename, update the `` tags in `frontend/index.html` + +For PWA icons, generate 192x192 and 512x512 PNG versions of your logo and save them as `frontend/icon-192.png` and `frontend/icon-512.png`. The web manifest is at `manifest.json` in the project root. + ### Site name and tagline Edit `config.yaml` in the project root: diff --git a/frontend/favicon.ico b/frontend/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a1c9afe0cd7be51de027a460312448bd03960eaa GIT binary patch literal 678 zcmV;X0$KfuP)!~sxU-U zJgA6t{$Xx()8VG=x(Q>++S+98nl@YaC%%~>%;hB;(}U2DM+m>)m+yPO_uva*s__8; zWLd^A46KG~aihS&KgR!WKxp);z5AO^T&UX7U@(%ZgrX#-#)m#XzmtgdqeL*&B^xU$ zJFmS+j7G+KpXP<6>c?iA(;eujs%z}Nd~{Zv1{<2d>28LuuWnzI7Z(5;-y<*2-TdHi zH%|<{)-ix`VD$va(E+ILYG|YCTlk5QvEFCDySoA>ZMD1E;dkut`(%8;WOV=pRxTM^ z3mlih5>)pdIujFmYMG$Br9&ZmT2ImbgE2nr3!a7EaBq;UV}OFo-}Z4T#NGAu%!lau zfKsIQw1yW#+&ym}_h7p}sI8!5km1G~9qq;|Lku{c<5{IB@>~-*28(-Z+NZhrrVPG? z9}2NAN3bqTkRp$7DaHOrH;C-wVXP}X@+tbZTU&tudieV0K3snkp$AwWN?D`}TJ z(z<^J7$l>5$O)uu+Od<7fv!02tYZq96snJ$0Oka~g*ec8X)4+`KU+}clx;Opz5w({ z#RpM3D`~2VYR^9AZ^iXm*j(OxCNU>wfgZ|9tJ&%lCZnod^&`T|48il)NjnAKbLmMb z^P?!u6brez{0z*+a+AdXm$3qdC|OA>oF`XLs|LH)5&hcTHjAA$+bAexu~VddSx)5H zT$+W6Bnrz|10RR8mX?Csv000I_L_t&o0QFt!5ZahK8UO$Q M07*qoM6N<$g7h~(Y5)KL literal 0 HcmV?d00001 diff --git a/frontend/icon-192.png b/frontend/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..843aeda2a3f7bd96b96042f4ec54b10b2d039a98 GIT binary patch literal 5022 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 literal 0 HcmV?d00001 diff --git a/frontend/index.html b/frontend/index.html index 1cc1b08..64a2164 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,13 +4,18 @@ Protocol Droid - + + + + +
@@ -230,31 +235,6 @@ - - - diff --git a/frontend/logo.svg b/frontend/logo.svg new file mode 100644 index 0000000..7a21a2f --- /dev/null +++ b/frontend/logo.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/frontend/style.css b/frontend/style.css index ec612ad..57a5b6b 100644 --- a/frontend/style.css +++ b/frontend/style.css @@ -71,6 +71,7 @@ header .breadcrumb { } header .breadcrumb .prompt { color: var(--green-bright); font-weight: normal; } header .breadcrumb:hover { text-decoration: none; } +.header-logo { width: 22px; height: 26px; flex-shrink: 0; margin-right: 2px; } header .crumb-path { font-size: 11px; color: var(--ink-dim); @@ -246,8 +247,8 @@ header nav a.active { color: var(--accent-bright); border-color: rgba(0,170,255, font-size: 13px; color: var(--ink-soft); font-family: var(--sans); word-break: break-word; line-height: 1.4; } -.protocol-pill .meta { font-family: var(--mono); font-size: 11px; color: var(--ink-dim); text-align: right; flex: 0 0 auto; max-width: 140px; } -.protocol-pill .meta .steps { color: var(--accent); font-weight: bold; white-space: nowrap; } +.protocol-pill .meta { font-family: var(--mono); font-size: 11px; color: var(--ink-dim); text-align: right; flex-shrink: 0; white-space: nowrap; } +.protocol-pill .meta .steps { color: var(--accent); font-weight: bold; } .protocol-pill.collection { background: var(--ink); color: #fff; border-color: var(--accent-deep); } diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..ebdfb19 --- /dev/null +++ b/manifest.json @@ -0,0 +1,26 @@ +{ + "name": "Protocol Droid", + "short_name": "Protocol Droid", + "description": "A tool for authoring, sharing, and curating social protocols", + "start_url": "./", + "display": "standalone", + "background_color": "#0a1929", + "theme_color": "#0a1929", + "icons": [ + { + "src": "frontend/logo.svg", + "sizes": "any", + "type": "image/svg+xml" + }, + { + "src": "frontend/icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "frontend/icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +}