interactive intro to open social at-me.zzstoatzz.io

add @ favicon

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

Changed files
+16
src
static
+1
src/main.rs
··· 35 35 .service(routes::client_metadata) 36 36 .service(routes::logout) 37 37 .service(routes::restore_session) 38 + .service(routes::favicon) 38 39 }) 39 40 .bind(("0.0.0.0", 8080))? 40 41 .run()
+9
src/routes.rs
··· 6 6 use crate::oauth::OAuthClientType; 7 7 use crate::templates; 8 8 9 + const FAVICON_SVG: &str = include_str!("../static/favicon.svg"); 10 + 9 11 #[derive(Deserialize)] 10 12 pub struct LoginForm { 11 13 handle: String, ··· 142 144 session.insert("did", &data.did).unwrap(); 143 145 HttpResponse::Ok().finish() 144 146 } 147 + 148 + #[get("/favicon.svg")] 149 + pub async fn favicon() -> HttpResponse { 150 + HttpResponse::Ok() 151 + .content_type("image/svg+xml") 152 + .body(FAVICON_SVG) 153 + }
+2
src/templates.rs
··· 5 5 <head> 6 6 <meta charset="UTF-8"> 7 7 <title>@me - login</title> 8 + <link rel="icon" type="image/svg+xml" href="/favicon.svg"> 8 9 <style> 9 10 * { margin: 0; padding: 0; box-sizing: border-box; } 10 11 body { font-family: 'Monaco', 'Courier New', monospace; display: flex; align-items: center; justify-content: center; height: 100vh; background: #000; color: #0f0; } ··· 64 65 <meta charset="UTF-8"> 65 66 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 66 67 <title>@me</title> 68 + <link rel="icon" type="image/svg+xml" href="/favicon.svg"> 67 69 <style> 68 70 * {{ margin: 0; padding: 0; box-sizing: border-box; }} 69 71
+4
static/favicon.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> 2 + <rect width="100" height="100" fill="#0a0a0a"/> 3 + <text x="50" y="75" font-family="monospace" font-size="70" font-weight="600" fill="#e0e0e0" text-anchor="middle">@</text> 4 + </svg>