{"id":22093911,"url":"https://github.com/giszmo/nostroid","last_synced_at":"2025-07-24T20:33:06.693Z","repository":{"id":60704236,"uuid":"521408272","full_name":"Giszmo/nostroid","owner":"Giszmo","description":"A fast cross platform nostr client that even works offline","archived":false,"fork":false,"pushed_at":"2023-04-11T04:46:21.000Z","size":1851,"stargazers_count":45,"open_issues_count":25,"forks_count":10,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-01T16:55:55.441Z","etag":null,"topics":["nostr"],"latest_commit_sha":null,"homepage":"https://chat.nostr.info","language":"Svelte","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/Giszmo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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}},"created_at":"2022-08-04T20:34:00.000Z","updated_at":"2025-03-30T00:49:38.000Z","dependencies_parsed_at":"2024-12-01T03:24:56.599Z","dependency_job_id":"94e510c9-87d5-4f1d-b5cc-048bc4106fb6","html_url":"https://github.com/Giszmo/nostroid","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Giszmo/nostroid","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Giszmo%2Fnostroid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Giszmo%2Fnostroid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Giszmo%2Fnostroid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Giszmo%2Fnostroid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Giszmo","download_url":"https://codeload.github.com/Giszmo/nostroid/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Giszmo%2Fnostroid/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266902062,"owners_count":24003607,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-24T02:00:09.469Z","response_time":99,"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":["nostr"],"created_at":"2024-12-01T03:23:08.475Z","updated_at":"2025-07-24T20:33:06.247Z","avatar_url":"https://github.com/Giszmo.png","language":"Svelte","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Nostroid - The most performant cross platform nostr client\n\nThis [nostr](https://github.com/nostr-protocol/nostr) client was created using\n[Svelte](https://github.com/sveltejs/svelte), a novel tool to create web apps.\n\nAs a web app, it also works on all platforms - Windows, Linux, Mac, Android and\niPhone.\n\n# High level design goals\n\nThis client is meant to feel like Twitter. If you are used to Twitter, you\nshould feel at home with Nostroid.\n\n## Performance\n\nNostr relies on \"relays\" and Nostroid will remain compatible with random\nrelays. This means that the client has to verify content it receives and doesn't\nalways have the best control over what it will receive in which order. While\nthis is an overhead, it is an inherently anticipated overhead in the nostr\necosystem and we adapt to it by storing all relevant events locally ahead of the\nuser interacting with them. Once loaded, this content is not only fast to\nbrowse, it is even available offline. Ideally you could connect to the nostr\nnetwork for 20s and then read up on all your friends updates, reply to them,\nlike and re-post their posts to then sync with the network again, publishing\nyour interactions later.\n\n## Storage\n\nFor optimal performance, Nostroid needs about 200MB of local storage. It will\nwork with less but that will degrade the performance a bit.\n\n# The friends of my friends\n\nOne of the most annoying parts of Twitter is spam, impersonators, bots. What do\nthese have in common? **You don't follow them!**\n\nOccasionally you want people to be able to \"cold call\" you - to contact you out\nof the blue. But usually not. Nostroid draws a clear distinction between what is\nconsidered probably ok and what not: **How close in your network of follows is\nthe author of the event?**.\n\nIf an account has zero followers, how likely is it that you would want to hear\nfrom them? How much would that change if the account had a million followers,\nnone of which is followed by any of your friends' friends? Not zero? Well,\nNostroid explores who you follow and who they follow in turn and so on until\n10,000 accounts are reached and disregards any account outside of that group -\nwith a few exceptions. In summary:\n\n- nostr accounts are either in your in-group of 10,000 closest accounts or in\n  your out-group.\n- If your in-group replies/reacts, you will also see that post even if the author\n  is an obvious bot with zero followers. The author will be shown as such.\n- If you get DMs from your out-group, you will see them in your spam folder.\n- Reactions (:heart:, :+1:, :-1:, ...) from your out-group will not be shown or\n  counted.\n- Post replies from your out-group will not be shown unless somebody from your\n  in-group replies/reacts.\n\n# Infinite scroll - Reaching \"the end of the internet\"\n\nSocial networks tend to hold random content ready for the user to improve\nretention - to entertain the user while there is nothing relevant to show. While\nthis is vilified for hurting our attention spans, it probably is detrimentally\nimportant for success. And who knows? Maybe Twitter keeps us busy by showing us\na calculated amount of obvious scammers to get mad at? :laughing:\n\nNostroid will - for better or worse - give the user more control and make it\neasier to dismiss content from out-group accounts. It will show why that spammer\nis in your in-group, making it easier to mute not only these spammers but also\nyour friend of a friend that keeps following these spammers (for whatever\nreason). The cut-off at 10,000 accounts being arbitrary, the user can also tweak\nthis number.\n\n# Development\n\n## Tools\n\nNostroid is built with Svelte using Dexie and IndexedDB. It uses nostr-tools to\ncommunicate with the nostr relays via Websocket.\n\n## Information flow\n\n- Events are retrieved in a separate thread - a SharedWorker.\n- The SharedWorker determines what to fetch from the nostr network, opens\n  channels to relays and writes events into the local database in batches.\n- The UI is reactive to DB changes - multiple tabs detect when in the config the\n  \"current account\" changed and update their state accordingly.\n- The UI also writes to the DB. Events are signed in the UI thread but stored in\n  the DB for delivery by the SharedWorker that maintains the channels to the\n  relays. Missing pubkeys or event ids are signaled through profiles\n  `{missing: true}` or entries in `db.missingEvents` and subsequently fetched by\n  the SharedWorker.\n\n## Install dependencies\n\nThis project is well tested using [pnpm](https://pnpm.io/). It might work with\nold `npm`, too but if not, please try following the exact instructions here\nbefore filing issues.\n\n0. Make sure to have a modern version of `node`. v18.6.0 for example.\n1. `git submodule update --init`\n2. Get [pnpm](https://pnpm.io/)\n3. `pnpm install`\n\n## Run locally in dev mode\n\nCurrently only Chrome / Chromium supports running workers in dev mode. To start\nthe server on localhost, run:\n\n```\npnpm run dev\n```\n\nThe server updates automatically as soon as files change.\n\nTo test it in other browsers than Chrome, build and preview the project:\n\n```\npnpm run build\npnpm run preview\n```\n\n## Deployment\n\n1. Configure your nginx to host static files.\n   [This](https://vite-plugin-pwa.netlify.app/deployment/nginx.html) might be\n   helpful.\n2. `pnpm run build`\n3. Copy the `build` folder to your server\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgiszmo%2Fnostroid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgiszmo%2Fnostroid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgiszmo%2Fnostroid/lists"}