Roughtime

A fork of Google's Roughtime protocol and utilities for building Roughtime clients. This repository also implements the IETF version.

For more information about Roughtime and tips for writing your own client or server, visit the developer documentation.

Note on status

This repository currently supports draft-ietf-ntp-roughtime-11 and draft-ietf-ntp-roughtime-08. Backwards compatibility with this version is not guaranteed; users should expect breaking changes as the IETF process continues. Likewise, the API should be regarded as unstable.

If you want to use this code and the protocol please join the NTP WG mailing list so that you are aware of the evolution of the protocol and issues that others discover.

** DO NOT USE IN PRODUCTION SOFTWARE **

Ecosystem guidelines

We welcome pull requests for adding your Roughtime service to our list. Your PR should do the following:

  • Add your server's configuration to ecosystem.json. The list of servers will be alphabetized by the "name" field.

  • Add some information about your service to ecosystem.md. (This is also kept in alphabetical order.) This should include details about how your service is provisioned:

    1. how you synchronize your server's clock;
    2. if your code is open source, a link to the code;
    3. where in the world your server is located; and
    4. whether you will guarantee up time, and if so, how you will do so.
    5. what version you run
  • Generate the ecosystem.json.go from the ecosystem.json. Use the go generate command for this.

A couple things to keep in mind:

  • To be healthy, the Roughtime ecosystem needs a diverse set of time sources. The list already contains servers that are synced with Google's NTP servers; as such, servers that expose new sources will be preferred. (An atomic clock would be cool!)

  • We reserve the right to prune this list at any time. (For example, if a server is unreliable, or its root secret key has been compromised.)

  • As new versions come out we may prune servers that do not update.

Finally, a disclaimer: the ecosystem is growing, and ours might not be the definitive list of who is serving Roughtime at any given time.

Contributing

We welcome your bug fixes, issues, and improvements to either the protocol or this code. Note that substantive changes to the protocol need to be discussed on the NTP WG mailing list.

About

A secure clock-synchronization protocol for when rough is enough.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

177 stars

Watchers

19 watching

Forks

Releases

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

Roughtime

A fork of Google's Roughtime protocol and utilities for building Roughtime clients. This repository also implements the IETF version.

For more information about Roughtime and tips for writing your own client or server, visit the developer documentation.

Note on status

This repository currently supports draft-ietf-ntp-roughtime-11 and draft-ietf-ntp-roughtime-08. Backwards compatibility with this version is not guaranteed; users should expect breaking changes as the IETF process continues. Likewise, the API should be regarded as unstable.

If you want to use this code and the protocol please join the NTP WG mailing list so that you are aware of the evolution of the protocol and issues that others discover.

** DO NOT USE IN PRODUCTION SOFTWARE **

Ecosystem guidelines

We welcome pull requests for adding your Roughtime service to our list. Your PR should do the following:

  • Add your server's configuration to ecosystem.json. The list of servers will be alphabetized by the "name" field.

  • Add some information about your service to ecosystem.md. (This is also kept in alphabetical order.) This should include details about how your service is provisioned:

    1. how you synchronize your server's clock;
    2. if your code is open source, a link to the code;
    3. where in the world your server is located; and
    4. whether you will guarantee up time, and if so, how you will do so.
    5. what version you run
  • Generate the ecosystem.json.go from the ecosystem.json. Use the go generate command for this.

A couple things to keep in mind:

  • To be healthy, the Roughtime ecosystem needs a diverse set of time sources. The list already contains servers that are synced with Google's NTP servers; as such, servers that expose new sources will be preferred. (An atomic clock would be cool!)

  • We reserve the right to prune this list at any time. (For example, if a server is unreliable, or its root secret key has been compromised.)

  • As new versions come out we may prune servers that do not update.

Finally, a disclaimer: the ecosystem is growing, and ours might not be the definitive list of who is serving Roughtime at any given time.

Contributing

We welcome your bug fixes, issues, and improvements to either the protocol or this code. Note that substantive changes to the protocol need to be discussed on the NTP WG mailing list.

About

A secure clock-synchronization protocol for when rough is enough.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

177 stars

Watchers

19 watching

Forks

Releases

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

Roughtime

A fork of Google's Roughtime protocol and utilities for building Roughtime clients. This repository also implements the IETF version.

For more information about Roughtime and tips for writing your own client or server, visit the developer documentation.

Note on status

This repository currently supports draft-ietf-ntp-roughtime-11 and draft-ietf-ntp-roughtime-08. Backwards compatibility with this version is not guaranteed; users should expect breaking changes as the IETF process continues. Likewise, the API should be regarded as unstable.

If you want to use this code and the protocol please join the NTP WG mailing list so that you are aware of the evolution of the protocol and issues that others discover.

** DO NOT USE IN PRODUCTION SOFTWARE **

Ecosystem guidelines

We welcome pull requests for adding your Roughtime service to our list. Your PR should do the following:

  • Add your server's configuration to ecosystem.json. The list of servers will be alphabetized by the "name" field.

  • Add some information about your service to ecosystem.md. (This is also kept in alphabetical order.) This should include details about how your service is provisioned:

    1. how you synchronize your server's clock;
    2. if your code is open source, a link to the code;
    3. where in the world your server is located; and
    4. whether you will guarantee up time, and if so, how you will do so.
    5. what version you run
  • Generate the ecosystem.json.go from the ecosystem.json. Use the go generate command for this.

A couple things to keep in mind:

  • To be healthy, the Roughtime ecosystem needs a diverse set of time sources. The list already contains servers that are synced with Google's NTP servers; as such, servers that expose new sources will be preferred. (An atomic clock would be cool!)

  • We reserve the right to prune this list at any time. (For example, if a server is unreliable, or its root secret key has been compromised.)

  • As new versions come out we may prune servers that do not update.

Finally, a disclaimer: the ecosystem is growing, and ours might not be the definitive list of who is serving Roughtime at any given time.

Contributing

We welcome your bug fixes, issues, and improvements to either the protocol or this code. Note that substantive changes to the protocol need to be discussed on the NTP WG mailing list.

About

A secure clock-synchronization protocol for when rough is enough.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

177 stars

Watchers

19 watching

Forks

Releases

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

Roughtime

A fork of Google's Roughtime protocol and utilities for building Roughtime clients. This repository also implements the IETF version.

For more information about Roughtime and tips for writing your own client or server, visit the developer documentation.

Note on status

This repository currently supports draft-ietf-ntp-roughtime-11 and draft-ietf-ntp-roughtime-08. Backwards compatibility with this version is not guaranteed; users should expect breaking changes as the IETF process continues. Likewise, the API should be regarded as unstable.

If you want to use this code and the protocol please join the NTP WG mailing list so that you are aware of the evolution of the protocol and issues that others discover.

** DO NOT USE IN PRODUCTION SOFTWARE **

Ecosystem guidelines

We welcome pull requests for adding your Roughtime service to our list. Your PR should do the following:

  • Add your server's configuration to ecosystem.json. The list of servers will be alphabetized by the "name" field.

  • Add some information about your service to ecosystem.md. (This is also kept in alphabetical order.) This should include details about how your service is provisioned:

    1. how you synchronize your server's clock;
    2. if your code is open source, a link to the code;
    3. where in the world your server is located; and
    4. whether you will guarantee up time, and if so, how you will do so.
    5. what version you run
  • Generate the ecosystem.json.go from the ecosystem.json. Use the go generate command for this.

A couple things to keep in mind:

  • To be healthy, the Roughtime ecosystem needs a diverse set of time sources. The list already contains servers that are synced with Google's NTP servers; as such, servers that expose new sources will be preferred. (An atomic clock would be cool!)

  • We reserve the right to prune this list at any time. (For example, if a server is unreliable, or its root secret key has been compromised.)

  • As new versions come out we may prune servers that do not update.

Finally, a disclaimer: the ecosystem is growing, and ours might not be the definitive list of who is serving Roughtime at any given time.

Contributing

We welcome your bug fixes, issues, and improvements to either the protocol or this code. Note that substantive changes to the protocol need to be discussed on the NTP WG mailing list.

About

A secure clock-synchronization protocol for when rough is enough.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

177 stars

Watchers

19 watching

Forks

Releases

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

Roughtime

A fork of Google's Roughtime protocol and utilities for building Roughtime clients. This repository also implements the IETF version.

For more information about Roughtime and tips for writing your own client or server, visit the developer documentation.

Note on status

This repository currently supports draft-ietf-ntp-roughtime-11 and draft-ietf-ntp-roughtime-08. Backwards compatibility with this version is not guaranteed; users should expect breaking changes as the IETF process continues. Likewise, the API should be regarded as unstable.

If you want to use this code and the protocol please join the NTP WG mailing list so that you are aware of the evolution of the protocol and issues that others discover.

** DO NOT USE IN PRODUCTION SOFTWARE **

Ecosystem guidelines

We welcome pull requests for adding your Roughtime service to our list. Your PR should do the following:

  • Add your server's configuration to ecosystem.json. The list of servers will be alphabetized by the "name" field.

  • Add some information about your service to ecosystem.md. (This is also kept in alphabetical order.) This should include details about how your service is provisioned:

    1. how you synchronize your server's clock;
    2. if your code is open source, a link to the code;
    3. where in the world your server is located; and
    4. whether you will guarantee up time, and if so, how you will do so.
    5. what version you run
  • Generate the ecosystem.json.go from the ecosystem.json. Use the go generate command for this.

A couple things to keep in mind:

  • To be healthy, the Roughtime ecosystem needs a diverse set of time sources. The list already contains servers that are synced with Google's NTP servers; as such, servers that expose new sources will be preferred. (An atomic clock would be cool!)

  • We reserve the right to prune this list at any time. (For example, if a server is unreliable, or its root secret key has been compromised.)

  • As new versions come out we may prune servers that do not update.

Finally, a disclaimer: the ecosystem is growing, and ours might not be the definitive list of who is serving Roughtime at any given time.

Contributing

We welcome your bug fixes, issues, and improvements to either the protocol or this code. Note that substantive changes to the protocol need to be discussed on the NTP WG mailing list.

About

A secure clock-synchronization protocol for when rough is enough.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

177 stars

Watchers

19 watching

Forks

Releases

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

Roughtime

A fork of Google's Roughtime protocol and utilities for building Roughtime clients. This repository also implements the IETF version.

For more information about Roughtime and tips for writing your own client or server, visit the developer documentation.

Note on status

This repository currently supports draft-ietf-ntp-roughtime-11 and draft-ietf-ntp-roughtime-08. Backwards compatibility with this version is not guaranteed; users should expect breaking changes as the IETF process continues. Likewise, the API should be regarded as unstable.

If you want to use this code and the protocol please join the NTP WG mailing list so that you are aware of the evolution of the protocol and issues that others discover.

** DO NOT USE IN PRODUCTION SOFTWARE **

Ecosystem guidelines

We welcome pull requests for adding your Roughtime service to our list. Your PR should do the following:

  • Add your server's configuration to ecosystem.json. The list of servers will be alphabetized by the "name" field.

  • Add some information about your service to ecosystem.md. (This is also kept in alphabetical order.) This should include details about how your service is provisioned:

    1. how you synchronize your server's clock;
    2. if your code is open source, a link to the code;
    3. where in the world your server is located; and
    4. whether you will guarantee up time, and if so, how you will do so.
    5. what version you run
  • Generate the ecosystem.json.go from the ecosystem.json. Use the go generate command for this.

A couple things to keep in mind:

  • To be healthy, the Roughtime ecosystem needs a diverse set of time sources. The list already contains servers that are synced with Google's NTP servers; as such, servers that expose new sources will be preferred. (An atomic clock would be cool!)

  • We reserve the right to prune this list at any time. (For example, if a server is unreliable, or its root secret key has been compromised.)

  • As new versions come out we may prune servers that do not update.

Finally, a disclaimer: the ecosystem is growing, and ours might not be the definitive list of who is serving Roughtime at any given time.

Contributing

We welcome your bug fixes, issues, and improvements to either the protocol or this code. Note that substantive changes to the protocol need to be discussed on the NTP WG mailing list.

About

A secure clock-synchronization protocol for when rough is enough.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

177 stars

Watchers

19 watching

Forks

Releases

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

Roughtime

A fork of Google's Roughtime protocol and utilities for building Roughtime clients. This repository also implements the IETF version.

For more information about Roughtime and tips for writing your own client or server, visit the developer documentation.

Note on status

This repository currently supports draft-ietf-ntp-roughtime-11 and draft-ietf-ntp-roughtime-08. Backwards compatibility with this version is not guaranteed; users should expect breaking changes as the IETF process continues. Likewise, the API should be regarded as unstable.

If you want to use this code and the protocol please join the NTP WG mailing list so that you are aware of the evolution of the protocol and issues that others discover.

** DO NOT USE IN PRODUCTION SOFTWARE **

Ecosystem guidelines

We welcome pull requests for adding your Roughtime service to our list. Your PR should do the following:

  • Add your server's configuration to ecosystem.json. The list of servers will be alphabetized by the "name" field.

  • Add some information about your service to ecosystem.md. (This is also kept in alphabetical order.) This should include details about how your service is provisioned:

    1. how you synchronize your server's clock;
    2. if your code is open source, a link to the code;
    3. where in the world your server is located; and
    4. whether you will guarantee up time, and if so, how you will do so.
    5. what version you run
  • Generate the ecosystem.json.go from the ecosystem.json. Use the go generate command for this.

A couple things to keep in mind:

  • To be healthy, the Roughtime ecosystem needs a diverse set of time sources. The list already contains servers that are synced with Google's NTP servers; as such, servers that expose new sources will be preferred. (An atomic clock would be cool!)

  • We reserve the right to prune this list at any time. (For example, if a server is unreliable, or its root secret key has been compromised.)

  • As new versions come out we may prune servers that do not update.

Finally, a disclaimer: the ecosystem is growing, and ours might not be the definitive list of who is serving Roughtime at any given time.

Contributing

We welcome your bug fixes, issues, and improvements to either the protocol or this code. Note that substantive changes to the protocol need to be discussed on the NTP WG mailing list.

About

A secure clock-synchronization protocol for when rough is enough.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

177 stars

Watchers

19 watching

Forks

Releases

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

Roughtime

A fork of Google's Roughtime protocol and utilities for building Roughtime clients. This repository also implements the IETF version.

For more information about Roughtime and tips for writing your own client or server, visit the developer documentation.

Note on status

This repository currently supports draft-ietf-ntp-roughtime-11 and draft-ietf-ntp-roughtime-08. Backwards compatibility with this version is not guaranteed; users should expect breaking changes as the IETF process continues. Likewise, the API should be regarded as unstable.

If you want to use this code and the protocol please join the NTP WG mailing list so that you are aware of the evolution of the protocol and issues that others discover.

** DO NOT USE IN PRODUCTION SOFTWARE **

Ecosystem guidelines

We welcome pull requests for adding your Roughtime service to our list. Your PR should do the following:

  • Add your server's configuration to ecosystem.json. The list of servers will be alphabetized by the "name" field.

  • Add some information about your service to ecosystem.md. (This is also kept in alphabetical order.) This should include details about how your service is provisioned:

    1. how you synchronize your server's clock;
    2. if your code is open source, a link to the code;
    3. where in the world your server is located; and
    4. whether you will guarantee up time, and if so, how you will do so.
    5. what version you run
  • Generate the ecosystem.json.go from the ecosystem.json. Use the go generate command for this.

A couple things to keep in mind:

  • To be healthy, the Roughtime ecosystem needs a diverse set of time sources. The list already contains servers that are synced with Google's NTP servers; as such, servers that expose new sources will be preferred. (An atomic clock would be cool!)

  • We reserve the right to prune this list at any time. (For example, if a server is unreliable, or its root secret key has been compromised.)

  • As new versions come out we may prune servers that do not update.

Finally, a disclaimer: the ecosystem is growing, and ours might not be the definitive list of who is serving Roughtime at any given time.

Contributing

We welcome your bug fixes, issues, and improvements to either the protocol or this code. Note that substantive changes to the protocol need to be discussed on the NTP WG mailing list.

About

A secure clock-synchronization protocol for when rough is enough.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

177 stars

Watchers

19 watching

Forks

Releases

Used by

Contributors

Languages