{"id":1,"date":"2026-04-22T15:04:19","date_gmt":"2026-04-22T15:04:19","guid":{"rendered":"https:\/\/rafi-gino.co.il\/?p=1"},"modified":"2026-04-23T12:40:55","modified_gmt":"2026-04-23T12:40:55","slug":"hello-world","status":"publish","type":"post","link":"https:\/\/rafi-gino.co.il\/?p=1","title":{"rendered":"Hello world!"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"he\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Dev Notes \u2014 Rafi Gino's Blog<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Space+Mono:wght@400;700&#038;family=DM+Sans:wght@300;400;500;700&#038;display=swap\" rel=\"stylesheet\">\n<style>\n*{box-sizing:border-box;margin:0;padding:0}\n:root{--c1:#FF4D00;--c2:#FFD600;--c3:#00E5FF;--dark:#0A0A0A;--card:#111;--text:#F0F0F0;--muted:#888;--border:#222}\nhtml{scroll-behavior:smooth}\nbody{background:var(--dark);color:var(--text);font-family:'DM Sans',sans-serif;overflow-x:hidden}\n\n.nav{display:flex;justify-content:space-between;align-items:center;padding:1.2rem 2rem;border-bottom:1px solid var(--border);position:sticky;top:0;background:rgba(10,10,10,0.95);backdrop-filter:blur(10px);z-index:100}\n.logo{font-family:'Space Mono',monospace;font-size:0.9rem;color:var(--c1);letter-spacing:2px;text-decoration:none}\n.nav-links{display:flex;gap:1.5rem;align-items:center}\n.nav-links a{color:var(--muted);text-decoration:none;font-size:0.8rem;letter-spacing:1px;text-transform:uppercase;transition:color 0.2s}\n.nav-links a:hover{color:var(--c1)}\n.nav-links a.active{color:var(--text)}\n.nav-tag{font-family:'Space Mono',monospace;font-size:0.65rem;color:var(--c3);border:1px solid var(--c3);padding:3px 10px;border-radius:2px}\n\n.blog-header{padding:3rem 2rem 2rem;border-bottom:1px solid var(--border)}\n.blog-label{font-family:'Space Mono',monospace;font-size:0.7rem;color:var(--c1);letter-spacing:3px;text-transform:uppercase;margin-bottom:0.75rem}\n.blog-title{font-size:2.5rem;font-weight:700;letter-spacing:-1.5px;margin-bottom:0.5rem}\n.blog-sub{color:var(--muted);font-size:0.95rem}\n\n.filter-bar{display:flex;gap:8px;padding:1.5rem 2rem;border-bottom:1px solid var(--border);overflow-x:auto}\n.filter-btn{font-family:'Space Mono',monospace;font-size:0.65rem;padding:5px 14px;border:1px solid var(--border);background:transparent;color:var(--muted);cursor:pointer;letter-spacing:1px;text-transform:uppercase;border-radius:2px;white-space:nowrap;transition:all 0.2s}\n.filter-btn:hover{border-color:var(--muted);color:var(--text)}\n.filter-btn.active{border-color:var(--c1);color:var(--c1);background:rgba(255,77,0,0.08)}\n\n.posts-list{padding:0 2rem}\n.post-item{display:grid;grid-template-columns:80px 1fr auto;gap:1.5rem;align-items:start;padding:2rem 0;border-bottom:1px solid var(--border);cursor:pointer;text-decoration:none;color:inherit;transition:background 0.2s}\n.post-item:hover .post-title{color:var(--c1)}\n.post-date{font-family:'Space Mono',monospace;font-size:0.65rem;color:var(--muted);line-height:1.4;padding-top:4px}\n.post-tag{display:inline-block;font-family:'Space Mono',monospace;font-size:0.6rem;padding:2px 8px;border-radius:2px;margin-bottom:8px;letter-spacing:1px}\n.tag-python{background:rgba(75,139,190,0.15);color:#4B8BBE;border:1px solid rgba(75,139,190,0.3)}\n.tag-fastapi{background:rgba(77,182,172,0.15);color:#4DB6AC;border:1px solid rgba(77,182,172,0.3)}\n.tag-ml{background:rgba(255,167,38,0.15);color:#FFA726;border:1px solid rgba(255,167,38,0.3)}\n.tag-react{background:rgba(97,218,251,0.15);color:#61DAFB;border:1px solid rgba(97,218,251,0.3)}\n.post-title{font-size:1.1rem;font-weight:700;margin-bottom:6px;letter-spacing:-0.3px;transition:color 0.2s;line-height:1.3}\n.post-desc{font-size:0.85rem;color:var(--muted);line-height:1.6}\n.read-time{font-family:'Space Mono',monospace;font-size:0.6rem;color:var(--muted);padding-top:4px}\n\n.featured-post{margin:2rem 0 0;background:var(--card);border:1px solid var(--border);border-left:3px solid var(--c1);padding:2rem;cursor:pointer;transition:background 0.2s;text-decoration:none;color:inherit;display:block}\n.featured-post:hover{background:#161616}\n.featured-post:hover .featured-title{color:var(--c1)}\n.featured-label{font-family:'Space Mono',monospace;font-size:0.6rem;color:var(--c1);letter-spacing:2px;margin-bottom:1rem}\n.featured-title{font-size:1.4rem;font-weight:700;letter-spacing:-0.5px;margin-bottom:0.75rem;line-height:1.3;transition:color 0.2s}\n.featured-desc{color:var(--muted);font-size:0.9rem;line-height:1.7;margin-bottom:1.5rem}\n.featured-footer{display:flex;justify-content:space-between;align-items:center}\n.read-btn{font-family:'Space Mono',monospace;font-size:0.7rem;color:var(--c1)}\n\n.sidebar-strip{display:flex;gap:0;border-top:1px solid var(--border);border-bottom:1px solid var(--border);flex-wrap:wrap}\n.strip-item{flex:1;min-width:120px;padding:1.5rem 2rem;border-right:1px solid var(--border)}\n.strip-item:last-child{border-right:none}\n.strip-num{font-family:'Space Mono',monospace;font-size:1.5rem;font-weight:700;color:var(--c1);margin-bottom:4px}\n.strip-label{font-size:0.75rem;color:var(--muted)}\n\n.newsletter{padding:3rem 2rem;text-align:center;border-top:1px solid var(--border)}\n.newsletter h3{font-size:1.5rem;font-weight:700;letter-spacing:-0.5px;margin-bottom:0.5rem}\n.newsletter h3 span{color:var(--c2)}\n.newsletter p{color:var(--muted);font-size:0.85rem;margin-bottom:1.5rem}\n.nl-form{display:flex;gap:8px;max-width:400px;margin:0 auto}\n.nl-input{flex:1;background:#1a1a1a;border:1px solid var(--border);color:var(--text);padding:0.7rem 1rem;font-family:'DM Sans',sans-serif;font-size:0.9rem;border-radius:2px;outline:none}\n.nl-input::placeholder{color:var(--muted)}\n.nl-input:focus{border-color:var(--c1)}\n.nl-btn{background:var(--c1);color:#fff;border:none;padding:0.7rem 1.5rem;font-family:'DM Sans',sans-serif;font-weight:700;font-size:0.85rem;cursor:pointer;border-radius:2px;white-space:nowrap;transition:opacity 0.2s}\n.nl-btn:hover{opacity:0.9}\n\n.footer{padding:1.5rem 2rem;border-top:1px solid #1a1a1a;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:1rem}\n.footer-logo{font-family:'Space Mono',monospace;font-size:0.7rem;color:#333}\n.footer-copy{font-size:0.75rem;color:#333}\n\n@media(max-width:600px){\n  .post-item{grid-template-columns:60px 1fr}\n  .read-time{display:none}\n  .nav-links{gap:1rem}\n  .blog-header,.posts-list,.newsletter,.filter-bar{padding-left:1.5rem;padding-right:1.5rem}\n}\n<\/style>\n<\/head>\n<body>\n\n<nav class=\"nav\">\n  <a class=\"logo\" href=\"index.html\">RG_DEV<\/a>\n  <div class=\"nav-links\">\n    <a href=\"index.html\">Home<\/a>\n    <a href=\"blog.html\" class=\"active\">Blog<\/a>\n    <a href=\"index.html#projects\">Projects<\/a>\n    <span class=\"nav-tag\">BLOG<\/span>\n  <\/div>\n<\/nav>\n\n<div class=\"blog-header\">\n  <div class=\"blog-label\">Writing<\/div>\n  <h1 class=\"blog-title\">Dev Notes<\/h1>\n  <p class=\"blog-sub\">Python, FastAPI, ML \u2014 things I build and learn.<\/p>\n<\/div>\n\n<div class=\"filter-bar\">\n  <button class=\"filter-btn active\" onclick=\"filterPosts('all',this)\">All<\/button>\n  <button class=\"filter-btn\" onclick=\"filterPosts('python',this)\">Python<\/button>\n  <button class=\"filter-btn\" onclick=\"filterPosts('fastapi',this)\">FastAPI<\/button>\n  <button class=\"filter-btn\" onclick=\"filterPosts('ml',this)\">ML \/ AI<\/button>\n  <button class=\"filter-btn\" onclick=\"filterPosts('react',this)\">React<\/button>\n<\/div>\n\n<div style=\"padding:2rem 2rem 0\">\n  <a class=\"featured-post\" href=\"#\" data-category=\"fastapi\">\n    <div class=\"featured-label\">FEATURED POST<\/div>\n    <div style=\"margin-bottom:10px\"><span class=\"post-tag tag-fastapi\">FASTAPI<\/span><\/div>\n    <div class=\"featured-title\">Build a production-ready REST API with FastAPI in 30 minutes<\/div>\n    <div class=\"featured-desc\">A complete guide to building, securing, and deploying a FastAPI backend \u2014 with auth, async endpoints, and Docker. Everything I wish I knew when I started.<\/div>\n    <div class=\"featured-footer\">\n      <div style=\"display:flex;gap:1rem;align-items:center\">\n        <span style=\"font-family:'Space Mono',monospace;font-size:0.65rem;color:var(--muted)\">APR 2026<\/span>\n        <span style=\"font-family:'Space Mono',monospace;font-size:0.65rem;color:var(--muted)\">8 MIN READ<\/span>\n      <\/div>\n      <div class=\"read-btn\">Read \u2192<\/div>\n    <\/div>\n  <\/a>\n<\/div>\n\n<div class=\"posts-list\" id=\"posts-list\">\n  <a class=\"post-item\" href=\"#\" data-category=\"python\">\n    <div class=\"post-date\">MAR<br>2026<\/div>\n    <div>\n      <span class=\"post-tag tag-python\">PYTHON<\/span>\n      <div class=\"post-title\">5 Python patterns that make your code 10x cleaner<\/div>\n      <div class=\"post-desc\">Dataclasses, context managers, generators \u2014 patterns I use every day.<\/div>\n    <\/div>\n    <div class=\"read-time\">5 MIN<\/div>\n  <\/a>\n  <a class=\"post-item\" href=\"#\" data-category=\"ml\">\n    <div class=\"post-date\">MAR<br>2026<\/div>\n    <div>\n      <span class=\"post-tag tag-ml\">ML \/ AI<\/span>\n      <div class=\"post-title\">CUDA setup guide for PyTorch on Ubuntu \u2014 no headaches<\/div>\n      <div class=\"post-desc\">The definitive guide I wish existed when I set up my first ML environment.<\/div>\n    <\/div>\n    <div class=\"read-time\">6 MIN<\/div>\n  <\/a>\n  <a class=\"post-item\" href=\"#\" data-category=\"react\">\n    <div class=\"post-date\">FEB<br>2026<\/div>\n    <div>\n      <span class=\"post-tag tag-react\">REACT<\/span>\n      <div class=\"post-title\">Building a music streaming UI with React \u2014 lessons from wave.fm<\/div>\n      <div class=\"post-desc\">What I learned building a real-time streaming interface from scratch.<\/div>\n    <\/div>\n    <div class=\"read-time\">7 MIN<\/div>\n  <\/a>\n  <a class=\"post-item\" href=\"#\" data-category=\"python\">\n    <div class=\"post-date\">FEB<br>2026<\/div>\n    <div>\n      <span class=\"post-tag tag-python\">PYTHON<\/span>\n      <div class=\"post-title\">How to structure a Python project in 2026<\/div>\n      <div class=\"post-desc\">__init__.py, pyproject.toml, and everything in between \u2014 the modern way.<\/div>\n    <\/div>\n    <div class=\"read-time\">4 MIN<\/div>\n  <\/a>\n<\/div>\n\n<div class=\"sidebar-strip\">\n  <div class=\"strip-item\"><div class=\"strip-num\">12<\/div><div class=\"strip-label\">Posts published<\/div><\/div>\n  <div class=\"strip-item\"><div class=\"strip-num\">4<\/div><div class=\"strip-label\">Topics covered<\/div><\/div>\n  <div class=\"strip-item\"><div class=\"strip-num\">1\/wk<\/div><div class=\"strip-label\">Publishing cadence<\/div><\/div>\n<\/div>\n\n<div class=\"newsletter\">\n  <h3>Stay <span>updated<\/span><\/h3>\n  <p>New post every week. No spam, just code.<\/p>\n  <div class=\"nl-form\">\n    <input class=\"nl-input\" type=\"email\" placeholder=\"your@email.com\">\n    <button class=\"nl-btn\" onclick=\"subscribe()\">Subscribe<\/button>\n  <\/div>\n<\/div>\n\n<footer class=\"footer\">\n  <div class=\"footer-logo\">RAFI-GINO.CO.IL\/BLOG<\/div>\n  <div class=\"footer-copy\">\u00a9 2026 Rafi Gino<\/div>\n<\/footer>\n\n<script>\nfunction filterPosts(cat, btn) {\n  document.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active'));\n  btn.classList.add('active');\n  document.querySelectorAll('.post-item').forEach(p => {\n    p.style.display = (cat === 'all' || p.dataset.category === cat) ? 'grid' : 'none';\n  });\n  const feat = document.querySelector('.featured-post');\n  if(feat) feat.style.display = (cat === 'all' || feat.dataset.category === cat) ? 'block' : 'none';\n}\n\nfunction subscribe() {\n  const input = document.querySelector('.nl-input');\n  if(input.value && input.value.includes('@')) {\n    input.value = '';\n    input.placeholder = 'Subscribed!';\n    input.style.borderColor = '#00E5FF';\n  }\n}\n<\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Dev Notes \u2014 Rafi Gino's Blog RG_DEV Home Blog Projects BLOG Writing Dev Notes Python, FastAPI, ML \u2014 things I build and learn. All Python FastAPI ML \/ AI React FEATURED POST FASTAPI Build a production-ready REST API with FastAPI in 30 minutes A complete guide to building, securing, and deploying a FastAPI backend \u2014 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/rafi-gino.co.il\/index.php?rest_route=\/wp\/v2\/posts\/1","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rafi-gino.co.il\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rafi-gino.co.il\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rafi-gino.co.il\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rafi-gino.co.il\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1"}],"version-history":[{"count":1,"href":"https:\/\/rafi-gino.co.il\/index.php?rest_route=\/wp\/v2\/posts\/1\/revisions"}],"predecessor-version":[{"id":18,"href":"https:\/\/rafi-gino.co.il\/index.php?rest_route=\/wp\/v2\/posts\/1\/revisions\/18"}],"wp:attachment":[{"href":"https:\/\/rafi-gino.co.il\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rafi-gino.co.il\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rafi-gino.co.il\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}