You must be logged in to sponsor sublabdev

Become a sponsor to Sublab

@sublabdev

Sublab

sublabdev
United States of America

We're mobile development professionals who try to make unreally perfect SDKs for Substrate ecosystem.

Some of us working in mobile development over decade, and know their business.
But still we're people and we're not ideal. Sometimes we do underestimate things, and even though our primary sponsor is Kusama treasury, we might run out of budget, because the more job we do, the more complicated things become and since we're trying to support all possible networks in Substrate ecosystem, the complexity of our works skyrockets every single day.

We're just small group of blockchain enthusiasts and would really appreciate any support from either developers who use our tools, or from any sympathetic users out here.

Extra support would help us to port most of our utilities from Java to Kotlin to reach true Kotlin multiplatformness.

Cheers to everyone!

Meet the team

Featured work

  1. sublabdev/sr25519-kotlin

    Rust's merlin and schnorrkel port to Kotlin

    Kotlin 3
  2. sublabdev/curve25519-kotlin

    Kotlin port of Java curve25519 implementation

    Kotlin 3
  3. sublabdev/scale-codec-kotlin

    Pure Kotlin library for Substrate's SCALE codec

    Kotlin 3
  4. sublabdev/scale-codec-swift

    Pure Swift library for Substrate's SCALE codec

    Swift 6
  5. sublabdev/substrate-client-kotlin

    Substrate SDK written in pure Kotlin

    Kotlin 6
  6. sublabdev/substrate-client-swift

    Substrate SDK written in pure Swift

    Swift 6

Select a tier

$ a month

Choose a custom amount.
, '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
You must be logged in to sponsor sublabdev

Become a sponsor to Sublab

@sublabdev

Sublab

sublabdev
United States of America

We're mobile development professionals who try to make unreally perfect SDKs for Substrate ecosystem.

Some of us working in mobile development over decade, and know their business.
But still we're people and we're not ideal. Sometimes we do underestimate things, and even though our primary sponsor is Kusama treasury, we might run out of budget, because the more job we do, the more complicated things become and since we're trying to support all possible networks in Substrate ecosystem, the complexity of our works skyrockets every single day.

We're just small group of blockchain enthusiasts and would really appreciate any support from either developers who use our tools, or from any sympathetic users out here.

Extra support would help us to port most of our utilities from Java to Kotlin to reach true Kotlin multiplatformness.

Cheers to everyone!

Meet the team

Featured work

  1. sublabdev/sr25519-kotlin

    Rust's merlin and schnorrkel port to Kotlin

    Kotlin 3
  2. sublabdev/curve25519-kotlin

    Kotlin port of Java curve25519 implementation

    Kotlin 3
  3. sublabdev/scale-codec-kotlin

    Pure Kotlin library for Substrate's SCALE codec

    Kotlin 3
  4. sublabdev/scale-codec-swift

    Pure Swift library for Substrate's SCALE codec

    Swift 6
  5. sublabdev/substrate-client-kotlin

    Substrate SDK written in pure Kotlin

    Kotlin 6
  6. sublabdev/substrate-client-swift

    Substrate SDK written in pure Swift

    Swift 6

Select a tier

$ a month

Choose a custom amount.
, '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
You must be logged in to sponsor sublabdev

Become a sponsor to Sublab

@sublabdev

Sublab

sublabdev
United States of America

We're mobile development professionals who try to make unreally perfect SDKs for Substrate ecosystem.

Some of us working in mobile development over decade, and know their business.
But still we're people and we're not ideal. Sometimes we do underestimate things, and even though our primary sponsor is Kusama treasury, we might run out of budget, because the more job we do, the more complicated things become and since we're trying to support all possible networks in Substrate ecosystem, the complexity of our works skyrockets every single day.

We're just small group of blockchain enthusiasts and would really appreciate any support from either developers who use our tools, or from any sympathetic users out here.

Extra support would help us to port most of our utilities from Java to Kotlin to reach true Kotlin multiplatformness.

Cheers to everyone!

Meet the team

Featured work

  1. sublabdev/sr25519-kotlin

    Rust's merlin and schnorrkel port to Kotlin

    Kotlin 3
  2. sublabdev/curve25519-kotlin

    Kotlin port of Java curve25519 implementation

    Kotlin 3
  3. sublabdev/scale-codec-kotlin

    Pure Kotlin library for Substrate's SCALE codec

    Kotlin 3
  4. sublabdev/scale-codec-swift

    Pure Swift library for Substrate's SCALE codec

    Swift 6
  5. sublabdev/substrate-client-kotlin

    Substrate SDK written in pure Kotlin

    Kotlin 6
  6. sublabdev/substrate-client-swift

    Substrate SDK written in pure Swift

    Swift 6

Select a tier

$ a month

Choose a custom amount.
, '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
You must be logged in to sponsor sublabdev

Become a sponsor to Sublab

@sublabdev

Sublab

sublabdev
United States of America

We're mobile development professionals who try to make unreally perfect SDKs for Substrate ecosystem.

Some of us working in mobile development over decade, and know their business.
But still we're people and we're not ideal. Sometimes we do underestimate things, and even though our primary sponsor is Kusama treasury, we might run out of budget, because the more job we do, the more complicated things become and since we're trying to support all possible networks in Substrate ecosystem, the complexity of our works skyrockets every single day.

We're just small group of blockchain enthusiasts and would really appreciate any support from either developers who use our tools, or from any sympathetic users out here.

Extra support would help us to port most of our utilities from Java to Kotlin to reach true Kotlin multiplatformness.

Cheers to everyone!

Meet the team

Featured work

  1. sublabdev/sr25519-kotlin

    Rust's merlin and schnorrkel port to Kotlin

    Kotlin 3
  2. sublabdev/curve25519-kotlin

    Kotlin port of Java curve25519 implementation

    Kotlin 3
  3. sublabdev/scale-codec-kotlin

    Pure Kotlin library for Substrate's SCALE codec

    Kotlin 3
  4. sublabdev/scale-codec-swift

    Pure Swift library for Substrate's SCALE codec

    Swift 6
  5. sublabdev/substrate-client-kotlin

    Substrate SDK written in pure Kotlin

    Kotlin 6
  6. sublabdev/substrate-client-swift

    Substrate SDK written in pure Swift

    Swift 6

Select a tier

$ a month

Choose a custom amount.
, '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
You must be logged in to sponsor sublabdev

Become a sponsor to Sublab

@sublabdev

Sublab

sublabdev
United States of America

We're mobile development professionals who try to make unreally perfect SDKs for Substrate ecosystem.

Some of us working in mobile development over decade, and know their business.
But still we're people and we're not ideal. Sometimes we do underestimate things, and even though our primary sponsor is Kusama treasury, we might run out of budget, because the more job we do, the more complicated things become and since we're trying to support all possible networks in Substrate ecosystem, the complexity of our works skyrockets every single day.

We're just small group of blockchain enthusiasts and would really appreciate any support from either developers who use our tools, or from any sympathetic users out here.

Extra support would help us to port most of our utilities from Java to Kotlin to reach true Kotlin multiplatformness.

Cheers to everyone!

Meet the team

Featured work

  1. sublabdev/sr25519-kotlin

    Rust's merlin and schnorrkel port to Kotlin

    Kotlin 3
  2. sublabdev/curve25519-kotlin

    Kotlin port of Java curve25519 implementation

    Kotlin 3
  3. sublabdev/scale-codec-kotlin

    Pure Kotlin library for Substrate's SCALE codec

    Kotlin 3
  4. sublabdev/scale-codec-swift

    Pure Swift library for Substrate's SCALE codec

    Swift 6
  5. sublabdev/substrate-client-kotlin

    Substrate SDK written in pure Kotlin

    Kotlin 6
  6. sublabdev/substrate-client-swift

    Substrate SDK written in pure Swift

    Swift 6

Select a tier

$ a month

Choose a custom amount.
, '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
You must be logged in to sponsor sublabdev

Become a sponsor to Sublab

@sublabdev

Sublab

sublabdev
United States of America

We're mobile development professionals who try to make unreally perfect SDKs for Substrate ecosystem.

Some of us working in mobile development over decade, and know their business.
But still we're people and we're not ideal. Sometimes we do underestimate things, and even though our primary sponsor is Kusama treasury, we might run out of budget, because the more job we do, the more complicated things become and since we're trying to support all possible networks in Substrate ecosystem, the complexity of our works skyrockets every single day.

We're just small group of blockchain enthusiasts and would really appreciate any support from either developers who use our tools, or from any sympathetic users out here.

Extra support would help us to port most of our utilities from Java to Kotlin to reach true Kotlin multiplatformness.

Cheers to everyone!

Meet the team

Featured work

  1. sublabdev/sr25519-kotlin

    Rust's merlin and schnorrkel port to Kotlin

    Kotlin 3
  2. sublabdev/curve25519-kotlin

    Kotlin port of Java curve25519 implementation

    Kotlin 3
  3. sublabdev/scale-codec-kotlin

    Pure Kotlin library for Substrate's SCALE codec

    Kotlin 3
  4. sublabdev/scale-codec-swift

    Pure Swift library for Substrate's SCALE codec

    Swift 6
  5. sublabdev/substrate-client-kotlin

    Substrate SDK written in pure Kotlin

    Kotlin 6
  6. sublabdev/substrate-client-swift

    Substrate SDK written in pure Swift

    Swift 6

Select a tier

$ a month

Choose a custom amount.
, '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
You must be logged in to sponsor sublabdev

Become a sponsor to Sublab

@sublabdev

Sublab

sublabdev
United States of America

We're mobile development professionals who try to make unreally perfect SDKs for Substrate ecosystem.

Some of us working in mobile development over decade, and know their business.
But still we're people and we're not ideal. Sometimes we do underestimate things, and even though our primary sponsor is Kusama treasury, we might run out of budget, because the more job we do, the more complicated things become and since we're trying to support all possible networks in Substrate ecosystem, the complexity of our works skyrockets every single day.

We're just small group of blockchain enthusiasts and would really appreciate any support from either developers who use our tools, or from any sympathetic users out here.

Extra support would help us to port most of our utilities from Java to Kotlin to reach true Kotlin multiplatformness.

Cheers to everyone!

Meet the team

Featured work

  1. sublabdev/sr25519-kotlin

    Rust's merlin and schnorrkel port to Kotlin

    Kotlin 3
  2. sublabdev/curve25519-kotlin

    Kotlin port of Java curve25519 implementation

    Kotlin 3
  3. sublabdev/scale-codec-kotlin

    Pure Kotlin library for Substrate's SCALE codec

    Kotlin 3
  4. sublabdev/scale-codec-swift

    Pure Swift library for Substrate's SCALE codec

    Swift 6
  5. sublabdev/substrate-client-kotlin

    Substrate SDK written in pure Kotlin

    Kotlin 6
  6. sublabdev/substrate-client-swift

    Substrate SDK written in pure Swift

    Swift 6

Select a tier

$ a month

Choose a custom amount.
, '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
You must be logged in to sponsor sublabdev

Become a sponsor to Sublab

@sublabdev

Sublab

sublabdev
United States of America

We're mobile development professionals who try to make unreally perfect SDKs for Substrate ecosystem.

Some of us working in mobile development over decade, and know their business.
But still we're people and we're not ideal. Sometimes we do underestimate things, and even though our primary sponsor is Kusama treasury, we might run out of budget, because the more job we do, the more complicated things become and since we're trying to support all possible networks in Substrate ecosystem, the complexity of our works skyrockets every single day.

We're just small group of blockchain enthusiasts and would really appreciate any support from either developers who use our tools, or from any sympathetic users out here.

Extra support would help us to port most of our utilities from Java to Kotlin to reach true Kotlin multiplatformness.

Cheers to everyone!

Meet the team

Featured work

  1. sublabdev/sr25519-kotlin

    Rust's merlin and schnorrkel port to Kotlin

    Kotlin 3
  2. sublabdev/curve25519-kotlin

    Kotlin port of Java curve25519 implementation

    Kotlin 3
  3. sublabdev/scale-codec-kotlin

    Pure Kotlin library for Substrate's SCALE codec

    Kotlin 3
  4. sublabdev/scale-codec-swift

    Pure Swift library for Substrate's SCALE codec

    Swift 6
  5. sublabdev/substrate-client-kotlin

    Substrate SDK written in pure Kotlin

    Kotlin 6
  6. sublabdev/substrate-client-swift

    Substrate SDK written in pure Swift

    Swift 6

Select a tier

$ a month

Choose a custom amount.