[{"data":1,"prerenderedAt":847},["ShallowReactive",2],{"post-\u002Fposts\u002Fwhat-are-web-sockets":3,"post-author-garywoodfine":455,"post-aside-video-none":6,"\u002Fposts\u002Fwhat-are-web-sockets-surround":464,"navigation":475,"authors":523,"author-garywoodfine":552,"post-aside-related-candidates":553,"content-section-services":823,"content-section-products":826,"content-section-company":829,"legal-link":831},{"id":4,"title":5,"aside":6,"author":7,"body":8,"category":431,"date":432,"description":433,"extension":434,"featureImage":435,"meta":438,"navigation":440,"path":441,"seo":442,"sitemap":443,"slug":6,"stem":451,"subtitle":452,"summary":453,"tags":6,"updated":6,"video":6,"__hash__":454},"posts\u002Fposts\u002Fwhat-are-web-sockets.md","What are Web Sockets",null,"garywoodfine",{"type":9,"value":10,"toc":424},"minimark",[11,15,28,33,36,42,46,49,52,70,73,78,81,84,89,92,95,104,107,110,126,129,133,140,157,170,229,267,274,297,300,348,351,354,383,386,390,393,410,414,417,420],[12,13,14],"p",{},"A WebSocket is what is termed as a  bidirectional, a full-duplex protocol used in client-server communication channels,\nand although that line may make sense to some to others it may sound like complete jargon.  Let's try break this definition\ndown, so we can all understand it.",[12,16,17,18,22,23,27],{},"The Websocket protocol was standardised by the ",[19,20,21],"strong",{},"IETF"," as ",[24,25,26],"em",{},"RFC 6455"," in 2011, and the WebSocket API in Web IDL is being\nstandardised by the W3C, enabling data to be transferred between the browser and server without any delay making\nreal-time communication possible.",[29,30,32],"h3",{"id":31},"what-is-full-duplex-protocol","What is full duplex protocol",[12,34,35],{},"In their simplest definitions Full-Duplex protocols enable applications to send and receive information concurrently, allowing\nthe application sending information to continue without waiting for a response, and the consumer application can also send\ndata without waiting for the appropriate response.",[37,38,39],"content-quote",{},[12,40,41],{},"WebSockets enable data to be transmitted in both directions on a signal carrier at the same time",[29,43,45],{"id":44},"websocket-protocol","WebSocket Protocol",[12,47,48],{},"WebSockets establish TCP-style connections in a browser-compatible fashion using HTTP during initial setup. Messages\nover websockets can be provided in any protocol, freeing the application from the sometimes unnecessary overhead of\nhandling HTTP requests and responses, which typically include headers, cookies, and other artifacts. However, the most\ncritical aspect is the ability to deliver downstream (server-to-client) messages to connected clients.",[12,50,51],{},"Websockets, provide a stateful protocol which means the connection between client and server will keep alive until it is\nterminated by either party (client or server). After closing the connection, it is terminated at both ends, regardless\nof which side initiated the closure.",[37,53,54,57],{},[12,55,56],{},"The WebSocket Protocol enables two-way communication between a client\nrunning untrusted code in a controlled environment to a remote host\nthat has opted-in to communications from that code.  The security\nmodel used for this is the origin-based security model commonly used\nby web browsers.  The protocol consists of an opening handshake\nfollowed by basic message framing, layered over TCP.  The goal of\nthis technology is to provide a mechanism for browser-based\napplications that need two-way communication with servers that does\nnot rely on opening multiple HTTP connections.",[58,59,61],"template",{"v-slot:citation":60},"",[12,62,63],{},[64,65,69],"a",{"href":66,"rel":67},"https:\u002F\u002Fdatatracker.ietf.org\u002Fdoc\u002Fhtml\u002Frfc6455",[68],"nofollow","The WebSocket Protocol",[12,71,72],{},"A WebSocket is initiated by making a common HTTP request to that server with an Upgrade header, which the server\n(after authenticating and authorising the client) should confirm in its response. After the handshake process, the\nconnection remains established between that physical client-server pair; if at some point the service needs to be\nredeployed or the load redistributed, its WebSocket connections needs to be re-established.",[74,75],"content-image",{"image":76,"title":77},"websockets_o7yfpi.png","WebSocket protocol",[12,79,80],{},"In the browser, for instance, a similar approach was once only possible by polling a server resource, which is a\ncomparatively racy, high-latency, and bandwidth-intensive affair.",[12,82,83],{},"WebSockets are available on many platforms, including the most common browsers and mobile devices. They're often\napplied to solve problems of millisecond-accurate state synchronisation and publish-subscribe messaging, both of which\nuse Websockets' provision for downstream pushes.",[85,86,88],"h4",{"id":87},"differences-between-http-requests-websockets","Differences between HTTP Requests & WebSockets",[12,90,91],{},"Typically, communication between web browsers and websites is conducted via HTTP Requests, where the client sends a request\nand the server returns a response, which is commonly referred to as the Request\u002FRespond model.  The connection between\nthe web browser and the server is only active for the duration of the request response cycle. HTTP requests are transactional\nin nature.",[12,93,94],{},"WebSocket connections on the other hand are initiated over HTTP and are typically long-lived, messages can be sent in\neither direction at any time and are not transactional in nature. The connection will stay open until either the client\nor the server or the server close the request.",[12,96,97,98,103],{},"WebSockets help to reduce unnecessary network traffic, as data can immediately travel both ways through a single open\nconnection, providing speed and real-time capability on the web. Websockets also enable servers to keep track of\nclients and ",[24,99,100],{},[19,101,102],{},"push"," data to them as needed, which was not possible using only HTTP.",[12,105,106],{},"There are a number of situations where the use of WebSockets can be highly advantageous, where low latency or server\ninitiated  messages required.",[12,108,109],{},"The following types of applications can make use of WebSockets:",[111,112,113,117,120,123],"ul",{},[114,115,116],"li",{},"Real-time feeds such financial data or stock prices etc",[114,118,119],{},"Chat Programs",[114,121,122],{},"Social Media platforms",[114,124,125],{},"Gaming applications",[12,127,128],{},"WebSocket connections enable streaming of text strings and binary data via messages. WebSocket messages include a frame,\npayload, and data portion. Very little non-payload data gets sent across the existing network connection this way,\nwhich helps to reduce latency and overhead, especially when compared to HTTP request and streaming models.",[29,130,132],{"id":131},"how-do-websockets-work","How do WebSockets work ?",[12,134,135,136,139],{},"WebSockets effectively make use TCP ",[24,137,138],{},"(Transport Control Protocol)"," to run as a transport layer using the WebSocket Protocol.",[141,142,143],"top-tip",{},[58,144,145],{"v-slot:message":60},[12,146,147,148,152,153,156],{},"WebSockets require a uniform resource identifier (URI) to use a ",[149,150,151],"code",{},"ws:"," for unencrypted connections or ",[149,154,155],{},"wss:","\nwhich makes use of encrypted TLS connections.",[12,158,159,160,165,166,169],{},"In order to establish a connection, the client needs to make an initial HTTP Request, which is essentially a ",[19,161,162],{},[24,163,164],{},"WebSocket\nhandshake"," . This request makes use of the ",[19,167,168],{},"Upgrade","  header, which is  used to upgrade an already established\nclient\u002Fserver connection to a different protocol (over the same transport protocol).",[171,172,177],"pre",{"className":173,"code":174,"language":175,"meta":176,"style":60},"language-http shiki shiki-themes material-theme-lighter monokai monokai monokai","GET \u002Fchat HTTP\u002F1.1\nHost: threenine.co.uk\nConnection: Upgrade\nPragma: no-cache\nCache-Control: no-cache\nUpgrade: websocket\nSec-WebSocket-Version: 13\nSec-WebSocket-Key: b6gjhT32u488lpuRwKaOWs==\n","http","meta-info=val",[149,178,179,187,193,199,205,211,217,223],{"__ignoreMap":60},[180,181,184],"span",{"class":182,"line":183},"line",1,[180,185,186],{},"GET \u002Fchat HTTP\u002F1.1\n",[180,188,190],{"class":182,"line":189},2,[180,191,192],{},"Host: threenine.co.uk\n",[180,194,196],{"class":182,"line":195},3,[180,197,198],{},"Connection: Upgrade\n",[180,200,202],{"class":182,"line":201},4,[180,203,204],{},"Pragma: no-cache\n",[180,206,208],{"class":182,"line":207},5,[180,209,210],{},"Cache-Control: no-cache\n",[180,212,214],{"class":182,"line":213},6,[180,215,216],{},"Upgrade: websocket\n",[180,218,220],{"class":182,"line":219},7,[180,221,222],{},"Sec-WebSocket-Version: 13\n",[180,224,226],{"class":182,"line":225},8,[180,227,228],{},"Sec-WebSocket-Key: b6gjhT32u488lpuRwKaOWs==\n",[230,231,232],"content-note",{},[58,233,234,237],{"v-slot:message":60},[12,235,236],{},"There are several features of WebSockets handshake request to take note of:",[111,238,239,249,255,261],{},[114,240,241,242,245,246,248],{},"The ",[149,243,244],{},"Connection"," and ",[149,247,168],{}," headers in the request and response indicate that this is a WebSocket handshake.",[114,250,241,251,254],{},[149,252,253],{},"Sec-WebSocket-Version"," request header specifies the WebSocket protocol version that the client wishes to use. This is typically 13.",[114,256,241,257,260],{},[149,258,259],{},"Sec-WebSocket-Key"," request header contains a Base64-encoded random value, which should be randomly generated in each handshake request.",[114,262,241,263,266],{},[149,264,265],{},"Sec-WebSocket-Accept"," response header contains a hash of the value submitted in the Sec-WebSocket-Key request header,\nconcatenated with a specific string defined in the protocol specification. This is done to prevent misleading responses resulting from\nmisconfigured servers or caching proxies.",[12,268,269,270,273],{},"The server will determine to upgrade the connection and will respond with a ",[149,271,272],{},"101 Switching Protocols"," response",[171,275,277],{"className":173,"code":276,"language":175,"meta":176,"style":60},"HTTP\u002F1.1 101 Switching Protocols\nUpgrade: websocket\nConnection: Upgrade\nSec-WebSocket-Accept: b6gjhT32u488lpuRwKaOWs==\n",[149,278,279,284,288,292],{"__ignoreMap":60},[180,280,281],{"class":182,"line":183},[180,282,283],{},"HTTP\u002F1.1 101 Switching Protocols\n",[180,285,286],{"class":182,"line":189},[180,287,216],{},[180,289,290],{"class":182,"line":195},[180,291,198],{},[180,293,294],{"class":182,"line":201},[180,295,296],{},"Sec-WebSocket-Accept: b6gjhT32u488lpuRwKaOWs==\n",[12,298,299],{},"All this processing is hugely simplified by making use of various libraries available. For Instance in JavaScript creating\na new WebSocket is as easy as:",[171,301,305],{"className":302,"code":303,"language":304,"meta":176,"style":60},"language-javascript shiki shiki-themes material-theme-lighter monokai monokai monokai","var ws = new WebSocket(\"wss:\u002F\u002Fthreenine.co.uk\u002Ffeed\");\n","javascript",[149,306,307],{"__ignoreMap":60},[180,308,309,313,317,321,324,328,331,335,339,341,344],{"class":182,"line":183},[180,310,312],{"class":311},"sI02Y","var",[180,314,316],{"class":315},"sRVMn"," ws ",[180,318,320],{"class":319},"sb10O","=",[180,322,323],{"class":319}," new",[180,325,327],{"class":326},"s_vVk"," WebSocket",[180,329,330],{"class":315},"(",[180,332,334],{"class":333},"sxJtY","\"",[180,336,338],{"class":337},"sKdu0","wss:\u002F\u002Fthreenine.co.uk\u002Ffeed",[180,340,334],{"class":333},[180,342,343],{"class":315},")",[180,345,347],{"class":346},"s8B1f",";\n",[12,349,350],{},"Once the WebSocket has been established messages can be sent , messages can be sent asynchronously in either direction by the client or server.",[12,352,353],{},"A simple message could be sent from the browser using client-side JavaScript like the following:",[171,355,357],{"className":302,"code":356,"language":304,"meta":176,"style":60},"ws.send(\"Hello World!\");\n",[149,358,359],{"__ignoreMap":60},[180,360,361,364,367,370,372,374,377,379,381],{"class":182,"line":183},[180,362,363],{"class":315},"ws",[180,365,366],{"class":346},".",[180,368,369],{"class":326},"send",[180,371,330],{"class":315},[180,373,334],{"class":333},[180,375,376],{"class":337},"Hello World!",[180,378,334],{"class":333},[180,380,343],{"class":315},[180,382,347],{"class":346},[12,384,385],{},"WebSocket messages can contain any content or data format. In modern applications, the convention is to make of JSON\nto send structured data within WebSocket messages.",[29,387,389],{"id":388},"what-makes-websocket-great-for-real-time-communication","What makes WebSocket great for Real-Time Communication",[12,391,392],{},"WebSockets are generally a great fit for Real-Time communication for a number of reasons:",[111,394,395,398,401,404,407],{},[114,396,397],{},"Websockets provide real-time updates and open lines of communication.",[114,399,400],{},"Websockets are HTML5 compliant, and offer backwards compatibility with older html documents. Therefore, they are supported by all modern web browsers—Google Chrome, Brave, Mozilla Firefox, Apple Safari, and more.",[114,402,403],{},"WebSockets are also compatible across platforms—Android, iOS, web, and desktop apps.",[114,405,406],{},"A single server can have multiple WebSocket connections open simultaneously, and can even have multiple connections with the same client, which opens the door for scalability.",[114,408,409],{},"WebSockets can stream through many proxies and firewalls.",[29,411,413],{"id":412},"conclusion","Conclusion",[12,415,416],{},"WebSocket enables two-way interactive communication sessions between client and server without having to poll the server\nfor a reply, providing both speed improvements and real-capabilities over other protocols.",[12,418,419],{},"Hopefully this post covered the basics behind WebSockets and how and when to start using them in your applications to\nenable Real-Time communications between client and server applications.",[421,422,423],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sI02Y, html code.shiki .sI02Y{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#66D9EF;--shiki-default-font-style:italic;--shiki-dark:#66D9EF;--shiki-dark-font-style:italic;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sRVMn, html code.shiki .sRVMn{--shiki-light:#90A4AE;--shiki-default:#F8F8F2;--shiki-dark:#F8F8F2;--shiki-sepia:#F8F8F2}html pre.shiki code .sb10O, html code.shiki .sb10O{--shiki-light:#39ADB5;--shiki-default:#F92672;--shiki-dark:#F92672;--shiki-sepia:#F92672}html pre.shiki code .s_vVk, html code.shiki .s_vVk{--shiki-light:#6182B8;--shiki-default:#A6E22E;--shiki-dark:#A6E22E;--shiki-sepia:#A6E22E}html pre.shiki code .sxJtY, html code.shiki .sxJtY{--shiki-light:#39ADB5;--shiki-default:#E6DB74;--shiki-dark:#E6DB74;--shiki-sepia:#E6DB74}html pre.shiki code .sKdu0, html code.shiki .sKdu0{--shiki-light:#91B859;--shiki-default:#E6DB74;--shiki-dark:#E6DB74;--shiki-sepia:#E6DB74}html pre.shiki code .s8B1f, html code.shiki .s8B1f{--shiki-light:#39ADB5;--shiki-default:#F8F8F2;--shiki-dark:#F8F8F2;--shiki-sepia:#F8F8F2}",{"title":60,"searchDepth":189,"depth":189,"links":425},[426,427,428,429,430],{"id":31,"depth":195,"text":32},{"id":44,"depth":195,"text":45},{"id":131,"depth":195,"text":132},{"id":388,"depth":195,"text":389},{"id":412,"depth":195,"text":413},"development","2023-09-06","WebSockets are a bi-directional, full duplex communications protocol initiated over HTTP. They are commonly used in modern web applications for streaming data and other asynchronous traffic.","md",{"url":436,"title":437},"v1719908486\u002Fwebsockets_pjqtld","What are Websockets",{"publishDateTime":439},"2023-09-06:17:30",true,"\u002Fposts\u002Fwhat-are-web-sockets",{"title":5,"description":433},{"loc":441,"lastmod":432,"changefreq":444,"priority":445,"images":446},"monthly",0.8,[447,449],{"loc":448},"https:\u002F\u002Fres.cloudinary.com\u002Fthreenine-co-uk\u002Fimage\u002Fupload\u002Ff_jpg,w_1200\u002Fv1719908486\u002Fwebsockets_pjqtld",{"loc":450},"https:\u002F\u002Fres.cloudinary.com\u002Fthreenine-co-uk\u002Fimage\u002Fupload\u002Ff_jpg,w_1200\u002Fwebsockets_o7yfpi.png","posts\u002Fwhat-are-web-sockets","An explanation of the WebSocket protocol and API's","WebSocket is a bidirectional communication protocol based on TCP that standardises communication between a client and a server, allowing for both parties to request data from one another. In contrast, a unidirectional protocol like HTTP only allows for the client to request data from the server.","JYoz5wQVmU_yMoayAOy5kamCGCsG5w-gL6UELCc-Fkw",{"name":456,"to":457,"avatar":458,"sameAs":459},"Gary Woodfine","https:\u002F\u002Fgarywoodfine.com","garywoodfine_tlccjw",[460,461,462,463],"https:\u002F\u002Fgithub.com\u002Fgarywoodfine","https:\u002F\u002Fwww.youtube.com\u002F@Threenineio","https:\u002F\u002Fnjump.me\u002Fnpub1a3jz7w9laar2k77dkkh2rhxunr9zpja5emrl5yrxetamt29swqyqmmt32y","nostr:npub1a3jz7w9laar2k77dkkh2rhxunr9zpja5emrl5yrxetamt29swqyqmmt32y",[465,470],{"title":466,"path":467,"stem":468,"description":469,"children":-1},"How to use Terraform with DigitalOcean","\u002Fposts\u002Fhow-to-use-terraform-with-digitalocean","posts\u002Fhow-to-use-terraform-with-digitalocean","A tutorial on how to configure your local environment with Terraform and DigitalOcean CLI",{"title":471,"path":472,"stem":473,"description":474,"children":-1},"What is a REST API?","\u002Fposts\u002Fwhat-is-a-rest-api","posts\u002Fwhat-is-a-rest-api","A REST API is an API that conforms to the design principles of the REST, or representational state transfer architectural style. For this reason, REST APIs are sometimes referred to RESTful APIs.",{"id":476,"extension":477,"items":478,"meta":520,"stem":521,"__hash__":522},"navigation\u002Fnavigation.yaml","yaml",[479,492,505,513],{"label":480,"children":481},"products",[482,487],{"label":483,"icon":484,"description":485,"to":486},"Diogel","material-symbols:preview","Keep your Nostr identity in your hands, in your browser, on your phone or on your own server.","\u002Fproducts\u002Fdiogel",{"label":488,"icon":489,"description":490,"to":491},"Nostrfi","i-lucide-radio-tower","Nostr relay, storage and backend-service infrastructure for builders and operators.","\u002Fproducts\u002Fnostrfi",{"label":493,"children":494},"services",[495,500],{"label":496,"description":497,"icon":498,"to":499},"Nostr product development","Focused engineering support for teams building Nostr-native products, tools and protocol-aware user experiences.","game-icons:ostrich","\u002Fservices\u002Fnostr-product-development",{"label":501,"description":502,"icon":503,"to":504},"Bitcoin product development","Engineering for Bitcoin payments, wallet-connected flows and products where users hold their own keys.","bx:bxl-bitcoin","\u002Fservices\u002Fbitcoin-product-development",{"label":506,"children":507},"company",[508],{"label":509,"icon":510,"description":511,"to":512},"About","i-lucide-file-text","What we believe, what we build and how we work.","\u002Fcompany\u002Fabout",{"label":514,"children":515},"resources",[516],{"label":517,"icon":510,"description":518,"to":519},"Blog","Practical Bitcoin, Nostr and product engineering guides.","https:\u002F\u002Fthreenine.blog",{},"navigation","n-Xc9COCwoCHJiMCeBNLauHtuhxcGol-wu9S2og3Rqs",{"id":524,"title":456,"avatar":458,"body":525,"description":529,"extension":434,"meta":544,"name":456,"navigation":440,"path":545,"role":546,"sameAs":547,"seo":548,"stem":549,"summary":550,"to":457,"username":7,"__hash__":551},"authors\u002Fauthors\u002FGary Woodfine.md",{"type":9,"value":526,"toc":542},[527,530,533,536,539],[12,528,529],{},"Polyglot software engineer with extensive experience in software engineering, with a passion to build great scalable software to solve complex business problems. A track record in developing high-performance backend systems, optimizing architecture, and ensuring continuous availability of critical APIs.",[12,531,532],{},"I'm an independent software developer, vendor, architect, consultant, blogger, Bitcoin & Nostr Enthusiast. I've provided software development expertise and helped augment software development skills and teams for a number of startups, product companies, corporate IT shops, and consulting firms.",[12,534,535],{},"I started out in the software world back in 1995, building websites with HoTMetaL Pro & ASP and moved on to building web apps with .NET when it released in Beta in 2001, since then, I've shipped systems in just about every industry.",[12,537,538],{},"Along my journey, I have also shipped various platforms & products in a number of other programming languages or software development frameworks that have had their moments in the sun, but somehow I have always made way back to C# & .Net.",[12,540,541],{},"Over the years, I've strived to improve how I and my teams deliver value to the clients, customers, and end-users. That has led me down the path of exploring Agile, Domain-Driven Design, REST, messaging, distributed systems, and anything else I thought could help.",{"title":60,"searchDepth":189,"depth":189,"links":543},[],{},"\u002Fauthors\u002Fgary-woodfine","Managing Director",[460,461,462,463],{"title":456,"description":529},"authors\u002FGary Woodfine","independent software developer, vendor, architect, consultant, blogger, Bitcoin & Nostr Enthusiast. I've provided software development expertise and helped augment software development skills and teams for a number of startups, product companies, corporate IT shops, and consulting firms.","30ZWJ-6T2g8S0kLLgUhZWA7_QFUOpa5CElif7tAhsLo",{"title":456,"name":456,"role":546,"summary":550,"avatar":458,"username":7,"to":457},[554,566,577,584,591,598,609,618,624,631,637,644,654,663,669,675,680,685,694,700,706,712,716,721,724,729,734,739,745,750,757,766,771,776,784,789,791,796,801,805,811,814,818],{"path":555,"title":556,"date":557,"tags":558,"category":559,"featureImage":564},"\u002Fposts\u002Fwhat-is-a-nostr-client","What is a Nostr client?","2026-10-26",[559,560,561,562,563],"nostr","nostr-client","privacy","keys","getting-started",{"url":565,"title":556},"v1690313893\u002Fnostr-logo_hwrql1",{"path":567,"title":568,"date":569,"tags":570,"category":559,"featureImage":575},"\u002Fposts\u002Fhow-to-choose-nostr-relays","How to Choose Nostr Relays","2026-04-11",[559,571,561,572,573,574],"relay","security","nostr-relays","censorship-resistance",{"url":565,"title":576},"How to choose nostr relays",{"path":578,"title":579,"date":569,"tags":580,"category":559,"featureImage":583},"\u002Fposts\u002Fnostr-relays-privacy-and-security","Nostr Relays, Privacy, and Security",[559,571,561,572,581,582],"key-management","nostr-relay",{"url":565,"title":579},{"path":585,"title":586,"date":569,"tags":587,"category":559,"featureImage":589},"\u002Fposts\u002Fwhat-is-a-nostr-relay","What is a Nostr Relay?",[559,571,561,574,588,582],"decentralization",{"url":565,"title":590}," What is a Nostr Relay?",{"path":592,"title":593,"date":594,"tags":595,"category":559,"featureImage":597},"\u002Fposts\u002Fwhy-nostr-keys-better-privacy","Why Nostr keys and identity are better for privacy","2026-04-06",[559,561,596,572],"identity",{"url":565,"title":593},{"path":599,"title":600,"date":601,"tags":602,"category":559,"featureImage":608},"\u002Fposts\u002Fbest-nostr-browser-extensions-2026","Best Nostr Browser Extensions (2026): Complete Comparison","2026-03-24",[559,603,604,572,605,606,607],"browser-extension","nip-07","comparison","porwr","diogel",{"url":565,"title":600},{"path":610,"title":611,"date":601,"tags":612,"category":559,"featureImage":615},"\u002Fposts\u002Fhow-to-get-started-with-porwr","Getting Started with Nostr: Porwr Setup Guide (2026)",[613,561,559,606,607,614,604,603],"social","cryptography",{"url":616,"title":617},"v1690313893\u002Fblog\u002Fdiogel-product-header_x3az6t","Porwr Browser Extension",{"path":619,"title":620,"date":621,"tags":622,"category":559,"featureImage":623},"\u002Fposts\u002Fhow-to-manage-keys-for-nostr","How to manage keys for Nostr","2025-12-15",[559,562,561,572],{"url":565,"title":620},{"path":625,"title":626,"date":621,"tags":627,"category":559,"featureImage":630},"\u002Fposts\u002Fhow-to-self-host-your-nip-05-identity","How to self-host your NIP-05 identity",[559,628,561,629],"nip-05","self-hosting",{"url":565,"title":626},{"path":632,"title":633,"date":634,"tags":6,"category":561,"featureImage":635},"\u002Fposts\u002Fwhy-privacy-is-a-fundamental-human-right","Why privacy is a fundamental human right","2025-12-09",{"url":636,"title":633},"v1690313893\u002Fprivacy-header_exiblo",{"path":638,"title":639,"date":640,"tags":6,"category":641,"featureImage":642},"\u002Fposts\u002Fhow-government-monetary-policy-erodes-the-value-of-money","How government monetary policy erodes the value of money","2025-12-01","bitcoin",{"url":643,"title":639},"v1719908027\u002Fbitcoin_szcm1m",{"path":645,"title":646,"date":647,"tags":648,"category":641,"featureImage":652},"\u002Fposts\u002Fbitaxe-touch-genesis-batch","Bitaxe Touch Genesis Batch","2025-07-23",[649,650,651],"bitaxe","mining","solo",{"url":653,"title":646},"v1690313878\u002Fbitaxe-touch_c6qrjd",{"path":655,"title":656,"date":657,"tags":658,"category":641,"featureImage":662},"\u002Fposts\u002Fbitcoin-is-not-a-ponzi-scheme","Bitcoin is not a Ponzi Scheme","2025-07-22",[659,660,661],"ponzi","economics","investment",{"url":643,"title":656},{"path":664,"title":665,"date":657,"tags":666,"category":641,"featureImage":668},"\u002Fposts\u002Fgetting-started-with-public-pool-mining","Getting started with Public Pool Mining",[650,651,667],"lottery",{"url":643,"title":665},{"path":670,"title":671,"date":672,"tags":673,"category":641,"featureImage":674},"\u002Fposts\u002Fgetting-started-with-solo-mining","Getting started with solo mining","2025-07-19",[649,650,651,667],{"url":643,"title":671},{"path":676,"title":677,"date":672,"tags":678,"category":641,"featureImage":679},"\u002Fposts\u002Fwhat-is-bitcoin-mining","What is Bitcoin mining",[650,641],{"url":643,"title":677},{"path":681,"title":682,"date":672,"tags":683,"category":641,"featureImage":684},"\u002Fposts\u002Fwhat-is-solo-mining","What is solo mining",[651],{"url":643,"title":682},{"path":686,"title":687,"date":688,"tags":689,"category":641,"featureImage":692},"\u002Fposts\u002Fhow-to-run-a-bitcoin-node","How to run a Bitcoin Node with Umbrel Home","2025-07-14",[690,691],"node","umbrel",{"url":643,"title":693},"How to run a Bitcoin node",{"path":695,"title":696,"date":697,"tags":698,"category":559,"featureImage":699},"\u002Fposts\u002Fhow-to-get-started-with-nostr","How to get started with Nostr","2024-10-09",[559,563,561,562],{"url":565,"title":696},{"path":701,"title":702,"date":703,"tags":6,"category":431,"featureImage":704},"\u002Fposts\u002Fhow-to-use-layouts-and-pages-in-nuxt","How to use layouts and pages in Nuxt","2024-10-08",{"url":705,"title":702},"v1690313878\u002Fnuxt-header_tbc9cp",{"path":707,"title":708,"date":709,"tags":6,"category":431,"featureImage":710},"\u002Fposts\u002Fhow-to-add-tailwindcss-to-nuxt","How to add tailwindcss to nuxt","2024-10-07",{"url":705,"title":711},"Getting started with Nuxt",{"path":713,"title":711,"date":714,"tags":6,"category":431,"featureImage":715},"\u002Fposts\u002Fgetting-started-with-nuxt","2024-10-06",{"url":705,"title":711},{"path":717,"title":718,"date":714,"tags":6,"category":431,"featureImage":719},"\u002Fposts\u002Fhow-to-store-terraform_state-in-digital-ocean-space","How to store Terraform state in DigitalOcean Spaces",{"url":720,"title":718},"v1690313893\u002Fterraform-header_ixmkgg",{"path":467,"title":466,"date":722,"tags":6,"category":431,"featureImage":723},"2024-10-05",{"url":720,"title":466},{"path":725,"title":726,"date":727,"tags":6,"category":561,"featureImage":728},"\u002Fposts\u002Fhow-to-add-fathom-analytics-to-nuxt","How to add Fathom Analytics to Nuxt","2024-07-01",{"url":705,"title":726},{"path":730,"title":731,"date":727,"tags":6,"category":561,"featureImage":732},"\u002Fposts\u002Fimportance-of-privacy-in-web-analytics","The Importance of Privacy in Web Analytics",{"url":733,"title":731},"v1690313893\u002Fanalytics_nlew9f",{"path":735,"title":736,"date":727,"tags":737,"category":559,"featureImage":738},"\u002Fposts\u002Fwhat-is-a-nip-07-signer","What is a NIP-07 signer?",[559,604,603,572],{"url":565,"title":736},{"path":740,"title":741,"date":727,"tags":742,"category":559,"featureImage":744},"\u002Fposts\u002Fwhat-is-nostr","What is Nostr?",[559,743,561,588],"relays",{"url":565,"title":741},{"path":746,"title":747,"date":727,"tags":6,"category":561,"featureImage":748},"\u002Fposts\u002Fwhy-choose-privacy-focused-analytics","Why choose privacy focused Analytics",{"url":749,"title":747},"v1690313893\u002Fblog\u002Ffathom-header_y7s0x2",{"path":751,"title":752,"date":753,"tags":6,"category":431,"featureImage":754},"\u002Fposts\u002Fwhat-is-api-integration","What is API Integration?","2024-06-04",{"url":755,"title":756},"v1719908247\u002Fapi_f3f1mh","What is API integration?",{"path":758,"title":759,"date":760,"tags":761,"category":641,"featureImage":763},"\u002Fposts\u002Fhow-blockchain-uses-cryptography","How Blockchain uses Cryptography","2024-05-18",[762,614],"blockchain",{"url":764,"title":765},"v1690313893\u002Fblockchain_tfrcrd","What is blockchain?",{"path":767,"title":768,"date":769,"tags":6,"category":431,"featureImage":770},"\u002Fposts\u002Fhow-to-create-a-websocket-server-in-dotnet","How to create a WebSocket server in dotnet","2024-05-15",{"url":436,"title":768},{"path":772,"title":773,"date":769,"tags":774,"category":641,"featureImage":775},"\u002Fposts\u002Fwhat-is-blockchain","What is Blockchain",[762,641],{"url":764,"title":765},{"path":777,"title":778,"date":779,"tags":780,"category":641,"featureImage":782},"\u002Fposts\u002Fintroduction-to-public-and-private-key-cryptography","Public Key Cryptography Explained: A Beginner's Guide","2024-05-12",[781,641,559],"encryption",{"url":764,"title":783},"Introduction to public and private key cryptography",{"path":785,"title":786,"date":779,"tags":787,"category":641,"featureImage":788},"\u002Fposts\u002Fwhat-is-bitcoin","What is Bitcoin?",[762,641],{"url":643,"title":786},{"path":441,"title":5,"date":432,"tags":6,"category":431,"featureImage":790},{"url":436,"title":437},{"path":792,"title":793,"date":794,"tags":6,"category":431,"featureImage":795},"\u002Fposts\u002Fwhat-is-api-first","What is API First?","2023-07-13",{"url":755,"title":793},{"path":797,"title":798,"date":799,"tags":6,"category":431,"featureImage":800},"\u002Fposts\u002Fapi-gateway-pattern","API Gateway Pattern","2023-06-10",{"url":755,"title":798},{"path":802,"title":803,"date":799,"tags":6,"category":431,"featureImage":804},"\u002Fposts\u002Fbackend-for-frontend-design-pattern","Backend for Frontend Design Pattern",{"url":755,"title":803},{"path":806,"title":807,"date":808,"tags":6,"category":431,"featureImage":809},"\u002Fposts\u002Fguide-api-development","An introductory guide to API Development","2023-06-05",{"url":755,"title":810},"API Development",{"path":472,"title":471,"date":808,"tags":6,"category":431,"featureImage":812},{"url":755,"title":813},"What is an API?",{"path":815,"title":813,"date":816,"tags":6,"category":431,"featureImage":817},"\u002Fposts\u002Fwhat-is-an-api","2023-06-01",{"url":755,"title":813},{"path":819,"title":820,"date":816,"tags":6,"category":431,"featureImage":821},"\u002Fposts\u002Fwhat-is-api-development","What is API Development ?",{"url":755,"title":822},"What is API development?",[824,825],{"label":496,"description":497,"icon":498,"to":499},{"label":501,"description":502,"icon":503,"to":504},[827,828],{"label":483,"icon":484,"description":485,"to":486},{"label":488,"icon":489,"description":490,"to":491},[830],{"label":509,"icon":510,"description":511,"to":512},[832,835,838,841,844],{"path":833,"title":834},"\u002Flegals\u002Fcookie-policy","Cookie Policy",{"path":836,"title":837},"\u002Flegals\u002Fcopyright","Copyright",{"path":839,"title":840},"\u002Flegals\u002Fcustomer-support","Customer Support",{"path":842,"title":843},"\u002Flegals\u002Fprivacy-policy","Privacy Policy",{"path":845,"title":846},"\u002Flegals\u002Fterms-of-service","Terms of Service",1793132669438]