├── .npmrc ├── src ├── routes │ ├── jobs │ │ ├── +layout.svelte │ │ ├── new │ │ │ └── +page.svelte │ │ ├── [ids] │ │ │ └── +page.svelte │ │ ├── my │ │ │ └── +page.svelte │ │ └── +page.svelte │ ├── +layout.ts │ ├── dvms │ │ ├── [id] │ │ │ └── +page.svelte │ │ └── +page.svelte │ ├── +layout.svelte │ ├── magic │ │ └── +page.svelte │ └── +page.svelte ├── lib │ ├── utils │ │ ├── nip90.ts │ │ ├── nip89.ts │ │ ├── index.ts │ │ └── login.ts │ ├── stores │ │ ├── current-user.ts │ │ ├── settings.ts │ │ ├── nip89.ts │ │ ├── jobRequests.ts │ │ ├── notifications.ts │ │ └── ndk.ts │ ├── modals │ │ ├── Nip89RecommendModal.svelte │ │ ├── JobRequestEditorModal.svelte │ │ └── Nip89AddParamModal.svelte │ ├── icons │ │ ├── Close.svelte │ │ ├── arrow-path.svg │ │ ├── Key.svelte │ │ ├── Lightning.svelte │ │ ├── Nostr.svelte │ │ ├── Gear.svelte │ │ └── Logo.svelte │ └── components │ │ ├── buttons │ │ ├── SubtleButton.svelte │ │ └── AttentionButton.svelte │ │ ├── jobs │ │ ├── JobRequestEditor │ │ │ ├── JobRequestEditorPayment.svelte │ │ │ ├── SelectDvms.svelte │ │ │ ├── TypeCard.svelte │ │ │ ├── JobRequestEditorParameters65002.svelte │ │ │ ├── AddInputButton.svelte │ │ │ ├── JobRequestEditorParameters65005.svelte │ │ │ ├── ParamInput.svelte │ │ │ ├── DvmTile.svelte │ │ │ ├── ParamSection.svelte │ │ │ ├── JobRequestEditorInput.svelte │ │ │ └── JobRequestEditor.svelte │ │ ├── JobStatusLabel.svelte │ │ ├── JobTypeIcon.svelte │ │ ├── JobCard.svelte │ │ ├── JobSummarization.svelte │ │ ├── AddJobButton.svelte │ │ ├── JobTextExtraction.svelte │ │ ├── PaymentRequiredButton.svelte │ │ ├── JobFeedbackRow.svelte │ │ ├── EventCard.svelte │ │ ├── JobResultRow.svelte │ │ ├── JobRequestCard.svelte │ │ └── JobDvmEventsCard.svelte │ │ ├── Notification.svelte │ │ ├── CurrentUser.svelte │ │ ├── Avatar.svelte │ │ ├── LoginGuestButton.svelte │ │ ├── CollapsableDropdown.svelte │ │ ├── ElementConnector.svelte │ │ ├── LoginNip07Button.svelte │ │ ├── NotificationButton.svelte │ │ ├── ModalWrapper.svelte │ │ ├── LoginDropdown.svelte │ │ ├── dvms │ │ ├── DvmCard.svelte │ │ ├── DvmListItem.svelte │ │ └── Nip89Tool │ │ │ ├── Nip89Tool.svelte │ │ │ └── Nip89Form.svelte │ │ ├── Navbar.svelte │ │ ├── UserDropdown.svelte │ │ └── feed │ │ └── FeedItem.svelte ├── app.d.ts ├── app.html ├── app.postcss └── svg.d.ts ├── static ├── favicon.png └── fonts │ └── Inter-VariableFont_slnt,wght.woff2 ├── renovate.json ├── justfile ├── vite.config.ts ├── .eslintignore ├── .prettierignore ├── tests └── test.ts ├── .gitignore ├── .prettierrc ├── playwright.config.ts ├── postcss.config.cjs ├── tsconfig.json ├── .vscode └── extensions.json ├── .eslintrc.cjs ├── svelte.config.js ├── package.json ├── tailwind.config.cjs └── README.md /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | resolution-mode=highest 3 | -------------------------------------------------------------------------------- /src/routes/jobs/+layout.svelte: -------------------------------------------------------------------------------- 1 |
23 | Range (for audio/video) 24 | Optional 25 |
26 |{name}
23 |Once a Nostr app supports DVMs that means that they get immediate access to all features, 24 | algorithms, and crazy inventions all DVMs support.
25 | 26 |27 | Don't like your client's default Trending algorithm? Pick from hundreds of different 28 | algorithms. Your Highlighter client doesn't work well when trying to read an obscure PDF? 29 | Use a DVM that has better support for it. 30 |
31 | 32 |33 | You say the spam filtering in your client is too aggressive? or not aggressive enough? Just choose 34 | from a different spam-filtering DVM! 35 |
36 |Because discoverability of these algorithms is solved by the very use of Nostr, we can easily imagine 46 | a future where there are thousands of very specific, very niche and abundantly weird DVMs providing all 47 | kinds of obscure functionalities.
48 | 49 |50 | Even if a DVM only had a handful of users, it would still be worth it for its users and for the DVM. 51 |
52 |62 | Every time a Nostr client autotranslates a note, it pings a specific API endpoint to get the 63 | result translated. 64 |
65 | 66 |67 | Over, and over. The same text being translated by each user. 68 |
69 | 70 |71 | Since Data Vending Machine results are public by default, once a note has been translated, 72 | all clients can choose to reuse the same translation. 73 |
74 |{JSON.stringify(rawEvent, null, 4)}
107 |
20 |
21 | 47 | Data Vending Machines are data-processing tools. You give them some data, a few sats, 48 | and they give you back some data. 49 |
50 | 51 |52 | The magic of DVMs 53 | comes from a few key properties: 54 |
55 | 56 |62 | Jobs don't need to be specifically directed to any DVM; users simply request a 63 | certain job to be done and available DVMs pick it up. 64 |
65 |72 | Jobs can be chained together, so that the output of one job is the input of 73 | another. This allows for complex data-processing pipelines to be built. 74 |
75 |83 | The fact that there is no registration, no signups or approvals, the fact 84 | 85 | that 86 | anyone can create a DVM and immediately monetize it with zero-intermediaries 87 | , in an ever-growing marketplace that is beaming with new users coming from 88 | all types of use cases in mind, means that the DVM market is the freest market of 89 | data-processing AIs in the world. 90 |
91 |132 | {input[1]} 133 |
134 | {/if} 135 |170 | input: 171 | {#if input[2] === 'job'} 172 | output of 173 | 174 | #{input[1]?.slice(0, 8)} 175 | 176 | (job chaining) 177 | {:else if input[2] === 'event'} 178 | #{input[1]?.slice(0, 8)} 179 | {:else} 180 | {input[1]} 181 | {/if} 182 |
183 | {/each} 184 | 185 | {#if item.tagValue('output')} 186 |187 | output: 188 | {item.tagValue('output')} 189 |
190 | {/if} 191 |