Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fani

FANi is a Function Addressable Compute Network implementation. This repository is strongly inspired on ipfs-compute.

Status

Currently just a very rough POC.

Overview

The goal of this project is to extend the proof of concept linked above to provide an easy to use CLI and framework to deploy functions to the IPFS-FAN network, and an (ideally) WASM-compatible basic node implementation to execute FAN computations

Like ipfs-compute, FANi utilizes an ipfs-lite peer to interact with the network.

WASM Function Compatibility

This project is currently using the excellent sat and subo tools from suborbital to execute wasm modules. Any "runnable" built using the subo CLI should work out of the box.

While FANi currently deals only with the wasm modules directly. So while you may develop your functions using subo/atmo, the directives or runnable.yaml files will not be used at all.

Integrating the CLI with suborbital directives or perhaps a more generic configuration/declaration could be a possibility to orchestrate more complex computations and provide metadata about how individual functions should be executed.

Usage

Follow the subo documentation to create a basic helloworld rust function wasm module.

➜ subo create runnable rs-runnable
➜ subo build rs-runnable

Then deploy the compiled wasm function

➜ ./fani deploy rs-hello rs-runnable/rs-runnable.wasm
created libp2p host: QmTw68adhzSKncUW4y79kmvhcjEnezwJBo8xL1boYaGojC
listenting on: /ip4/192.168.86.54/tcp/37551
added bytecode bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom
added abi bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
sitting idle to provide deployed dag

Keep fani running, so it's ipfs-lite peer can provide the function content

In a second terminal, call the function via it's ABI CID

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
created libp2p host: QmTtxyw8tji2Ncae7tNjPGPChvb7hH8MbGr3WZvLAGpbVM
listenting on: /ip4/192.168.86.54/tcp/37795
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello
result added to network: bafybeiauirvsiecy5h6spipofhjsqpz26mxj65yazekpvw4w3askiflr2i

You may also pass args after the function CID. They will be added to the network, and their content retrieved via CID will be passed to the function

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m "world, \nlove fani"
created libp2p host: QmXsBCLexfzRbRitkmKjWomiAwFhAsmL9axjxQMgX1y8CT
listenting on: /ip4/192.168.86.54/tcp/36715
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
discovered new peer: QmZeEFgBZivfHc4cXig99MgaWWR2MkYHbvAvajvdGoL2ah
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello world, \nlove fani
result added to network: bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy

You can then open a third terminal, and retrieve the result from ipfs

➜ ipfs cat bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy
hello world, \nlove fani

About

ipfs-FAN implemtation

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fani

FANi is a Function Addressable Compute Network implementation. This repository is strongly inspired on ipfs-compute.

Status

Currently just a very rough POC.

Overview

The goal of this project is to extend the proof of concept linked above to provide an easy to use CLI and framework to deploy functions to the IPFS-FAN network, and an (ideally) WASM-compatible basic node implementation to execute FAN computations

Like ipfs-compute, FANi utilizes an ipfs-lite peer to interact with the network.

WASM Function Compatibility

This project is currently using the excellent sat and subo tools from suborbital to execute wasm modules. Any "runnable" built using the subo CLI should work out of the box.

While FANi currently deals only with the wasm modules directly. So while you may develop your functions using subo/atmo, the directives or runnable.yaml files will not be used at all.

Integrating the CLI with suborbital directives or perhaps a more generic configuration/declaration could be a possibility to orchestrate more complex computations and provide metadata about how individual functions should be executed.

Usage

Follow the subo documentation to create a basic helloworld rust function wasm module.

➜ subo create runnable rs-runnable
➜ subo build rs-runnable

Then deploy the compiled wasm function

➜ ./fani deploy rs-hello rs-runnable/rs-runnable.wasm
created libp2p host: QmTw68adhzSKncUW4y79kmvhcjEnezwJBo8xL1boYaGojC
listenting on: /ip4/192.168.86.54/tcp/37551
added bytecode bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom
added abi bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
sitting idle to provide deployed dag

Keep fani running, so it's ipfs-lite peer can provide the function content

In a second terminal, call the function via it's ABI CID

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
created libp2p host: QmTtxyw8tji2Ncae7tNjPGPChvb7hH8MbGr3WZvLAGpbVM
listenting on: /ip4/192.168.86.54/tcp/37795
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello
result added to network: bafybeiauirvsiecy5h6spipofhjsqpz26mxj65yazekpvw4w3askiflr2i

You may also pass args after the function CID. They will be added to the network, and their content retrieved via CID will be passed to the function

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m "world, \nlove fani"
created libp2p host: QmXsBCLexfzRbRitkmKjWomiAwFhAsmL9axjxQMgX1y8CT
listenting on: /ip4/192.168.86.54/tcp/36715
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
discovered new peer: QmZeEFgBZivfHc4cXig99MgaWWR2MkYHbvAvajvdGoL2ah
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello world, \nlove fani
result added to network: bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy

You can then open a third terminal, and retrieve the result from ipfs

➜ ipfs cat bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy
hello world, \nlove fani

About

ipfs-FAN implemtation

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fani

FANi is a Function Addressable Compute Network implementation. This repository is strongly inspired on ipfs-compute.

Status

Currently just a very rough POC.

Overview

The goal of this project is to extend the proof of concept linked above to provide an easy to use CLI and framework to deploy functions to the IPFS-FAN network, and an (ideally) WASM-compatible basic node implementation to execute FAN computations

Like ipfs-compute, FANi utilizes an ipfs-lite peer to interact with the network.

WASM Function Compatibility

This project is currently using the excellent sat and subo tools from suborbital to execute wasm modules. Any "runnable" built using the subo CLI should work out of the box.

While FANi currently deals only with the wasm modules directly. So while you may develop your functions using subo/atmo, the directives or runnable.yaml files will not be used at all.

Integrating the CLI with suborbital directives or perhaps a more generic configuration/declaration could be a possibility to orchestrate more complex computations and provide metadata about how individual functions should be executed.

Usage

Follow the subo documentation to create a basic helloworld rust function wasm module.

➜ subo create runnable rs-runnable
➜ subo build rs-runnable

Then deploy the compiled wasm function

➜ ./fani deploy rs-hello rs-runnable/rs-runnable.wasm
created libp2p host: QmTw68adhzSKncUW4y79kmvhcjEnezwJBo8xL1boYaGojC
listenting on: /ip4/192.168.86.54/tcp/37551
added bytecode bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom
added abi bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
sitting idle to provide deployed dag

Keep fani running, so it's ipfs-lite peer can provide the function content

In a second terminal, call the function via it's ABI CID

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
created libp2p host: QmTtxyw8tji2Ncae7tNjPGPChvb7hH8MbGr3WZvLAGpbVM
listenting on: /ip4/192.168.86.54/tcp/37795
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello
result added to network: bafybeiauirvsiecy5h6spipofhjsqpz26mxj65yazekpvw4w3askiflr2i

You may also pass args after the function CID. They will be added to the network, and their content retrieved via CID will be passed to the function

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m "world, \nlove fani"
created libp2p host: QmXsBCLexfzRbRitkmKjWomiAwFhAsmL9axjxQMgX1y8CT
listenting on: /ip4/192.168.86.54/tcp/36715
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
discovered new peer: QmZeEFgBZivfHc4cXig99MgaWWR2MkYHbvAvajvdGoL2ah
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello world, \nlove fani
result added to network: bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy

You can then open a third terminal, and retrieve the result from ipfs

➜ ipfs cat bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy
hello world, \nlove fani

About

ipfs-FAN implemtation

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fani

FANi is a Function Addressable Compute Network implementation. This repository is strongly inspired on ipfs-compute.

Status

Currently just a very rough POC.

Overview

The goal of this project is to extend the proof of concept linked above to provide an easy to use CLI and framework to deploy functions to the IPFS-FAN network, and an (ideally) WASM-compatible basic node implementation to execute FAN computations

Like ipfs-compute, FANi utilizes an ipfs-lite peer to interact with the network.

WASM Function Compatibility

This project is currently using the excellent sat and subo tools from suborbital to execute wasm modules. Any "runnable" built using the subo CLI should work out of the box.

While FANi currently deals only with the wasm modules directly. So while you may develop your functions using subo/atmo, the directives or runnable.yaml files will not be used at all.

Integrating the CLI with suborbital directives or perhaps a more generic configuration/declaration could be a possibility to orchestrate more complex computations and provide metadata about how individual functions should be executed.

Usage

Follow the subo documentation to create a basic helloworld rust function wasm module.

➜ subo create runnable rs-runnable
➜ subo build rs-runnable

Then deploy the compiled wasm function

➜ ./fani deploy rs-hello rs-runnable/rs-runnable.wasm
created libp2p host: QmTw68adhzSKncUW4y79kmvhcjEnezwJBo8xL1boYaGojC
listenting on: /ip4/192.168.86.54/tcp/37551
added bytecode bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom
added abi bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
sitting idle to provide deployed dag

Keep fani running, so it's ipfs-lite peer can provide the function content

In a second terminal, call the function via it's ABI CID

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
created libp2p host: QmTtxyw8tji2Ncae7tNjPGPChvb7hH8MbGr3WZvLAGpbVM
listenting on: /ip4/192.168.86.54/tcp/37795
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello
result added to network: bafybeiauirvsiecy5h6spipofhjsqpz26mxj65yazekpvw4w3askiflr2i

You may also pass args after the function CID. They will be added to the network, and their content retrieved via CID will be passed to the function

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m "world, \nlove fani"
created libp2p host: QmXsBCLexfzRbRitkmKjWomiAwFhAsmL9axjxQMgX1y8CT
listenting on: /ip4/192.168.86.54/tcp/36715
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
discovered new peer: QmZeEFgBZivfHc4cXig99MgaWWR2MkYHbvAvajvdGoL2ah
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello world, \nlove fani
result added to network: bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy

You can then open a third terminal, and retrieve the result from ipfs

➜ ipfs cat bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy
hello world, \nlove fani

About

ipfs-FAN implemtation

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fani

FANi is a Function Addressable Compute Network implementation. This repository is strongly inspired on ipfs-compute.

Status

Currently just a very rough POC.

Overview

The goal of this project is to extend the proof of concept linked above to provide an easy to use CLI and framework to deploy functions to the IPFS-FAN network, and an (ideally) WASM-compatible basic node implementation to execute FAN computations

Like ipfs-compute, FANi utilizes an ipfs-lite peer to interact with the network.

WASM Function Compatibility

This project is currently using the excellent sat and subo tools from suborbital to execute wasm modules. Any "runnable" built using the subo CLI should work out of the box.

While FANi currently deals only with the wasm modules directly. So while you may develop your functions using subo/atmo, the directives or runnable.yaml files will not be used at all.

Integrating the CLI with suborbital directives or perhaps a more generic configuration/declaration could be a possibility to orchestrate more complex computations and provide metadata about how individual functions should be executed.

Usage

Follow the subo documentation to create a basic helloworld rust function wasm module.

➜ subo create runnable rs-runnable
➜ subo build rs-runnable

Then deploy the compiled wasm function

➜ ./fani deploy rs-hello rs-runnable/rs-runnable.wasm
created libp2p host: QmTw68adhzSKncUW4y79kmvhcjEnezwJBo8xL1boYaGojC
listenting on: /ip4/192.168.86.54/tcp/37551
added bytecode bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom
added abi bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
sitting idle to provide deployed dag

Keep fani running, so it's ipfs-lite peer can provide the function content

In a second terminal, call the function via it's ABI CID

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
created libp2p host: QmTtxyw8tji2Ncae7tNjPGPChvb7hH8MbGr3WZvLAGpbVM
listenting on: /ip4/192.168.86.54/tcp/37795
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello
result added to network: bafybeiauirvsiecy5h6spipofhjsqpz26mxj65yazekpvw4w3askiflr2i

You may also pass args after the function CID. They will be added to the network, and their content retrieved via CID will be passed to the function

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m "world, \nlove fani"
created libp2p host: QmXsBCLexfzRbRitkmKjWomiAwFhAsmL9axjxQMgX1y8CT
listenting on: /ip4/192.168.86.54/tcp/36715
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
discovered new peer: QmZeEFgBZivfHc4cXig99MgaWWR2MkYHbvAvajvdGoL2ah
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello world, \nlove fani
result added to network: bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy

You can then open a third terminal, and retrieve the result from ipfs

➜ ipfs cat bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy
hello world, \nlove fani

About

ipfs-FAN implemtation

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fani

FANi is a Function Addressable Compute Network implementation. This repository is strongly inspired on ipfs-compute.

Status

Currently just a very rough POC.

Overview

The goal of this project is to extend the proof of concept linked above to provide an easy to use CLI and framework to deploy functions to the IPFS-FAN network, and an (ideally) WASM-compatible basic node implementation to execute FAN computations

Like ipfs-compute, FANi utilizes an ipfs-lite peer to interact with the network.

WASM Function Compatibility

This project is currently using the excellent sat and subo tools from suborbital to execute wasm modules. Any "runnable" built using the subo CLI should work out of the box.

While FANi currently deals only with the wasm modules directly. So while you may develop your functions using subo/atmo, the directives or runnable.yaml files will not be used at all.

Integrating the CLI with suborbital directives or perhaps a more generic configuration/declaration could be a possibility to orchestrate more complex computations and provide metadata about how individual functions should be executed.

Usage

Follow the subo documentation to create a basic helloworld rust function wasm module.

➜ subo create runnable rs-runnable
➜ subo build rs-runnable

Then deploy the compiled wasm function

➜ ./fani deploy rs-hello rs-runnable/rs-runnable.wasm
created libp2p host: QmTw68adhzSKncUW4y79kmvhcjEnezwJBo8xL1boYaGojC
listenting on: /ip4/192.168.86.54/tcp/37551
added bytecode bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom
added abi bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
sitting idle to provide deployed dag

Keep fani running, so it's ipfs-lite peer can provide the function content

In a second terminal, call the function via it's ABI CID

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
created libp2p host: QmTtxyw8tji2Ncae7tNjPGPChvb7hH8MbGr3WZvLAGpbVM
listenting on: /ip4/192.168.86.54/tcp/37795
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello
result added to network: bafybeiauirvsiecy5h6spipofhjsqpz26mxj65yazekpvw4w3askiflr2i

You may also pass args after the function CID. They will be added to the network, and their content retrieved via CID will be passed to the function

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m "world, \nlove fani"
created libp2p host: QmXsBCLexfzRbRitkmKjWomiAwFhAsmL9axjxQMgX1y8CT
listenting on: /ip4/192.168.86.54/tcp/36715
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
discovered new peer: QmZeEFgBZivfHc4cXig99MgaWWR2MkYHbvAvajvdGoL2ah
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello world, \nlove fani
result added to network: bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy

You can then open a third terminal, and retrieve the result from ipfs

➜ ipfs cat bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy
hello world, \nlove fani

About

ipfs-FAN implemtation

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fani

FANi is a Function Addressable Compute Network implementation. This repository is strongly inspired on ipfs-compute.

Status

Currently just a very rough POC.

Overview

The goal of this project is to extend the proof of concept linked above to provide an easy to use CLI and framework to deploy functions to the IPFS-FAN network, and an (ideally) WASM-compatible basic node implementation to execute FAN computations

Like ipfs-compute, FANi utilizes an ipfs-lite peer to interact with the network.

WASM Function Compatibility

This project is currently using the excellent sat and subo tools from suborbital to execute wasm modules. Any "runnable" built using the subo CLI should work out of the box.

While FANi currently deals only with the wasm modules directly. So while you may develop your functions using subo/atmo, the directives or runnable.yaml files will not be used at all.

Integrating the CLI with suborbital directives or perhaps a more generic configuration/declaration could be a possibility to orchestrate more complex computations and provide metadata about how individual functions should be executed.

Usage

Follow the subo documentation to create a basic helloworld rust function wasm module.

➜ subo create runnable rs-runnable
➜ subo build rs-runnable

Then deploy the compiled wasm function

➜ ./fani deploy rs-hello rs-runnable/rs-runnable.wasm
created libp2p host: QmTw68adhzSKncUW4y79kmvhcjEnezwJBo8xL1boYaGojC
listenting on: /ip4/192.168.86.54/tcp/37551
added bytecode bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom
added abi bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
sitting idle to provide deployed dag

Keep fani running, so it's ipfs-lite peer can provide the function content

In a second terminal, call the function via it's ABI CID

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
created libp2p host: QmTtxyw8tji2Ncae7tNjPGPChvb7hH8MbGr3WZvLAGpbVM
listenting on: /ip4/192.168.86.54/tcp/37795
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello
result added to network: bafybeiauirvsiecy5h6spipofhjsqpz26mxj65yazekpvw4w3askiflr2i

You may also pass args after the function CID. They will be added to the network, and their content retrieved via CID will be passed to the function

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m "world, \nlove fani"
created libp2p host: QmXsBCLexfzRbRitkmKjWomiAwFhAsmL9axjxQMgX1y8CT
listenting on: /ip4/192.168.86.54/tcp/36715
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
discovered new peer: QmZeEFgBZivfHc4cXig99MgaWWR2MkYHbvAvajvdGoL2ah
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello world, \nlove fani
result added to network: bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy

You can then open a third terminal, and retrieve the result from ipfs

➜ ipfs cat bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy
hello world, \nlove fani

About

ipfs-FAN implemtation

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fani

FANi is a Function Addressable Compute Network implementation. This repository is strongly inspired on ipfs-compute.

Status

Currently just a very rough POC.

Overview

The goal of this project is to extend the proof of concept linked above to provide an easy to use CLI and framework to deploy functions to the IPFS-FAN network, and an (ideally) WASM-compatible basic node implementation to execute FAN computations

Like ipfs-compute, FANi utilizes an ipfs-lite peer to interact with the network.

WASM Function Compatibility

This project is currently using the excellent sat and subo tools from suborbital to execute wasm modules. Any "runnable" built using the subo CLI should work out of the box.

While FANi currently deals only with the wasm modules directly. So while you may develop your functions using subo/atmo, the directives or runnable.yaml files will not be used at all.

Integrating the CLI with suborbital directives or perhaps a more generic configuration/declaration could be a possibility to orchestrate more complex computations and provide metadata about how individual functions should be executed.

Usage

Follow the subo documentation to create a basic helloworld rust function wasm module.

➜ subo create runnable rs-runnable
➜ subo build rs-runnable

Then deploy the compiled wasm function

➜ ./fani deploy rs-hello rs-runnable/rs-runnable.wasm
created libp2p host: QmTw68adhzSKncUW4y79kmvhcjEnezwJBo8xL1boYaGojC
listenting on: /ip4/192.168.86.54/tcp/37551
added bytecode bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom
added abi bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
sitting idle to provide deployed dag

Keep fani running, so it's ipfs-lite peer can provide the function content

In a second terminal, call the function via it's ABI CID

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
created libp2p host: QmTtxyw8tji2Ncae7tNjPGPChvb7hH8MbGr3WZvLAGpbVM
listenting on: /ip4/192.168.86.54/tcp/37795
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello
result added to network: bafybeiauirvsiecy5h6spipofhjsqpz26mxj65yazekpvw4w3askiflr2i

You may also pass args after the function CID. They will be added to the network, and their content retrieved via CID will be passed to the function

➜ ./fani call bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m "world, \nlove fani"
created libp2p host: QmXsBCLexfzRbRitkmKjWomiAwFhAsmL9axjxQMgX1y8CT
listenting on: /ip4/192.168.86.54/tcp/36715
resolving ABI: bafybeicon5jwwcukiy7pyuqnjltbtrgyswv7iggqrghy6zndtrtmb5ir2m
discovered new peer: QmZeEFgBZivfHc4cXig99MgaWWR2MkYHbvAvajvdGoL2ah
{ID:rs-hello ByteCode:bafybeicfd7o3glgy6746vkhg54syzwaf5bvdplo5iz63df3w45h4ljunom Args:[]}
getting bytecode
result:
hello world, \nlove fani
result added to network: bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy

You can then open a third terminal, and retrieve the result from ipfs

➜ ipfs cat bafybeibwt4ul52ct2azbteljy2c6sp7iidqwiitdxfmacao6dvsgrd6cdy
hello world, \nlove fani

About

ipfs-FAN implemtation

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages