Zipeng365's picture
Publish DeTime static documentation mirror
ae97a0a verified
Raw
History Blame Contribute Delete
28.9 kB
<!DOCTYPE html>
<html lang="en" data-bs-theme="light">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Zipeng Wu">
<link rel="canonical" href="https://systems-mechanobiology.github.io/DeTime/tutorials/hot-trend-lab/data-sources/">
<link rel="shortcut icon" href="../../../img/favicon.ico">
<title>Real Data Sources - DeTime</title>
<link href="../../../css/bootstrap.min.css" rel="stylesheet">
<link href="../../../css/fontawesome.min.css" rel="stylesheet">
<link href="../../../css/brands.min.css" rel="stylesheet">
<link href="../../../css/solid.min.css" rel="stylesheet">
<link href="../../../css/v4-font-face.min.css" rel="stylesheet">
<link href="../../../css/base.css" rel="stylesheet">
<link id="hljs-light" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" >
<link id="hljs-dark" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github-dark.min.css" disabled>
<link href="../../../stylesheets/brand.css" rel="stylesheet">
<link href="../../../stylesheets/extra.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
<meta name="robots" content="index, follow, max-image-preview:large">
<meta name="keywords" content="DeTime, detime, de-time, time series decomposition, Python time series, SSA, MSSA, VMD, STL, decomposition software">
<meta property="og:site_name" content="DeTime">
<meta property="og:type" content="website">
<meta property="og:title" content="DeTime - workflow-oriented time-series decomposition for Python">
<meta property="og:description" content="DeTime is a Python and CLI toolkit for reproducible time-series decomposition across SSA, MSSA, VMD, STL, EMD, wavelet, and native C++ backed methods.">
<meta property="og:url" content="https://systems-mechanobiology.github.io/DeTime/">
<meta property="og:image" content="https://systems-mechanobiology.github.io/DeTime/assets/brand/detime-title-card.svg">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="DeTime - time-series decomposition for Python">
<meta name="twitter:description" content="Workflow-oriented Python and CLI software for reproducible trend, oscillation, residual, and component decomposition.">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebSite",
"@id": "https://systems-mechanobiology.github.io/DeTime/#website",
"name": "DeTime",
"alternateName": ["detime", "de-time", "De-Time"],
"url": "https://systems-mechanobiology.github.io/DeTime/",
"description": "DeTime documentation for workflow-oriented time-series decomposition software.",
"inLanguage": "en"
},
{
"@type": "SoftwareSourceCode",
"@id": "https://systems-mechanobiology.github.io/DeTime/#software",
"name": "DeTime",
"alternateName": ["detime", "de-time", "De-Time"],
"description": "Python and CLI toolkit for reproducible time-series decomposition with native C++ backed SSA, MSSA, VMD, STD, STDR, MA baseline, and Gabor clustering paths.",
"codeRepository": "https://github.com/systems-mechanobiology/DeTime",
"url": "https://systems-mechanobiology.github.io/DeTime/",
"programmingLanguage": ["Python", "C++"],
"applicationCategory": "Scientific software",
"keywords": "DeTime, time-series decomposition, Python, SSA, MSSA, VMD, STL, EMD, wavelet, native C++",
"author": {
"@type": "Person",
"name": "Zipeng Wu"
}
}
]
}
</script>
<link rel="stylesheet" href="../../../stylesheets/extra.css?v=7">
</head>
<body>
<div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="../../..">DeTime</a>
<!-- Expander button -->
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Expanded navigation -->
<div id="navbar-collapse" class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav">
<li class="nav-item">
<a href="../../.." class="nav-link">Home</a>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">Start</a>
<ul class="dropdown-menu">
<li>
<a href="../../../install/" class="dropdown-item">Install</a>
</li>
<li>
<a href="../../../quickstart/" class="dropdown-item">Quickstart</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">Methods</a>
<ul class="dropdown-menu">
<li>
<a href="../../../methods/" class="dropdown-item">Methods & Chooser</a>
</li>
<li>
<a href="../../../method-matrix/" class="dropdown-item">Method Matrix</a>
</li>
<li>
<a href="../../../method-references/" class="dropdown-item">Method References</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle active" aria-current="page" role="button" data-bs-toggle="dropdown" aria-expanded="false">Workflows</a>
<ul class="dropdown-menu">
<li>
<a href="../../../notebook-gallery/" class="dropdown-item">Notebook Gallery</a>
</li>
<li>
<a href="../../univariate/" class="dropdown-item">Univariate Tutorial</a>
</li>
<li>
<a href="../../multivariate/" class="dropdown-item">Multivariate Tutorial</a>
</li>
<li>
<a href="../../cli-and-profiling/" class="dropdown-item">CLI Guide</a>
</li>
<li class="dropdown-submenu">
<a href="#" class="dropdown-item">Quant Trading Tutorial</a>
<ul class="dropdown-menu">
<li>
<a href="../../quant-trading/" class="dropdown-item">Overview</a>
</li>
<li>
<a href="../../quant-trading/notebooks/" class="dropdown-item">Tutorial Notebooks</a>
</li>
<li>
<a href="../../quant-trading/notebooks/00_decomposition_first_quant_trading_roadmap/" class="dropdown-item">Tutorial 00 Roadmap</a>
</li>
<li class="dropdown-submenu">
<a href="#" class="dropdown-item">Strategy Lab</a>
<ul class="dropdown-menu">
<li>
<a href="../../quant-trading/two-strategy-families/" class="dropdown-item">Two Strategy Families</a>
</li>
<li>
<a href="../../quant-trading/notebooks/01_detime_trend_following_strategy_lab/" class="dropdown-item">01 Trend-Following Lab</a>
</li>
<li>
<a href="../../quant-trading/notebooks/02_detime_oscillation_reversion_strategy_lab/" class="dropdown-item">02 Oscillation-Reversion Lab</a>
</li>
</ul>
</li>
<li class="dropdown-submenu">
<a href="#" class="dropdown-item">Strategy Expansion</a>
<ul class="dropdown-menu">
<li>
<a href="../../quant-trading/method-specific-strategy-expansion/" class="dropdown-item">Method-Specific Strategy Expansion</a>
</li>
<li>
<a href="../../quant-trading/notebooks/03_detime_method_specific_strategy_variants/" class="dropdown-item">03 Method-Specific Variants</a>
</li>
<li>
<a href="../../quant-trading/notebooks/04_detime_component_pair_trading_cointegration/" class="dropdown-item">04 Component Pair Trading</a>
</li>
</ul>
</li>
<li class="dropdown-submenu">
<a href="#" class="dropdown-item">Tutorial Sequence</a>
<ul class="dropdown-menu">
<li>
<a href="../../quant-trading/notebooks/01_market_data_and_decomposition_feature_factory/" class="dropdown-item">01 Real Market Data and Feature Factory</a>
</li>
<li>
<a href="../../quant-trading/notebooks/02_decomposition_aware_moving_average_macd/" class="dropdown-item">02 Decomposition-aware MA and MACD</a>
</li>
<li>
<a href="../../quant-trading/notebooks/03_residual_mean_reversion_rsi_bollinger/" class="dropdown-item">03 Residual Mean Reversion</a>
</li>
<li>
<a href="../../quant-trading/notebooks/04_turtle_donchian_breakout_volume_confirmation/" class="dropdown-item">04 Donchian Breakout</a>
</li>
<li>
<a href="../../quant-trading/notebooks/05_pairs_spread_decomposition_stat_arb/" class="dropdown-item">05 Pair-Spread Stat-Arb</a>
</li>
<li>
<a href="../../quant-trading/notebooks/06_cross_sectional_rotation_portfolio/" class="dropdown-item">06 Cross-Sectional Rotation</a>
</li>
</ul>
</li>
<li class="dropdown-submenu">
<a href="#" class="dropdown-item">Native SSA Replay</a>
<ul class="dropdown-menu">
<li>
<a href="../../quant-trading/notebooks/07_native_ssa_high_return_low_drawdown_tutorial/" class="dropdown-item">07 Native SSA High-Return / Low-Drawdown</a>
</li>
</ul>
</li>
<li>
<a href="../../quant-trading/data/" class="dropdown-item">Real Data and Universes</a>
</li>
<li>
<a href="../../quant-trading/strategy-map/" class="dropdown-item">Strategy Map</a>
</li>
<li>
<a href="../../quant-trading/backtesting-frameworks/" class="dropdown-item">Backtesting Frameworks</a>
</li>
<li>
<a href="../../quant-trading/walkforward/" class="dropdown-item">Walk-Forward Validation</a>
</li>
</ul>
</li>
<li class="dropdown-submenu">
<a href="#" class="dropdown-item">Hot Trend Lab</a>
<ul class="dropdown-menu">
<li>
<a href="../" class="dropdown-item">Overview</a>
</li>
<li>
<a href="../notebooks/" class="dropdown-item">Rendered Notebooks</a>
</li>
<li>
<a href="../notebooks/00_hot_trend_lab_overview/" class="dropdown-item">00 Column Overview</a>
</li>
<li>
<a href="../notebooks/01_arxiv_category_pulse/" class="dropdown-item">01 arXiv Category Pulse</a>
</li>
<li>
<a href="../notebooks/02_arxiv_agent_research_pulse/" class="dropdown-item">02 arXiv Agent Research Pulse</a>
</li>
<li>
<a href="../notebooks/03_huggingface_open_model_pulse/" class="dropdown-item">03 Hugging Face Open-Model Pulse</a>
</li>
<li>
<a href="../notebooks/04_github_ai_agent_star_velocity/" class="dropdown-item">04 GitHub Star Velocity</a>
</li>
<li>
<a href="../notebooks/05_wikipedia_attention_hype_decay/" class="dropdown-item">05 Wikipedia Attention Decay</a>
</li>
<li>
<a href="../notebooks/06_crypto_stablecoin_liquidity_pulse/" class="dropdown-item">06 Crypto Stablecoin Liquidity</a>
</li>
<li>
<a href="../notebooks/07_ai_infrastructure_market_pulse/" class="dropdown-item">07 AI Infrastructure Market Pulse</a>
</li>
<li>
<a href="./" class="dropdown-item active" aria-current="page">Real Data Sources</a>
</li>
<li>
<a href="../arxiv-research-pulse/" class="dropdown-item">arXiv Research Pulse</a>
</li>
<li>
<a href="../open-model-and-developer-attention/" class="dropdown-item">Open Models and Developer Attention</a>
</li>
<li>
<a href="../wiki-market-crypto-attention/" class="dropdown-item">Public Attention, Markets, and Crypto</a>
</li>
<li>
<a href="../release-calendar/" class="dropdown-item">Release Calendar</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">Gallery</a>
<ul class="dropdown-menu">
<li>
<a href="../../../gallery/ssa/" class="dropdown-item">SSA</a>
</li>
<li>
<a href="../../../gallery/std/" class="dropdown-item">STD</a>
</li>
<li>
<a href="../../../gallery/stdr/" class="dropdown-item">STDR</a>
</li>
<li>
<a href="../../../gallery/mssa/" class="dropdown-item">MSSA</a>
</li>
<li>
<a href="../../../gallery/stl/" class="dropdown-item">STL</a>
</li>
<li>
<a href="../../../gallery/mstl/" class="dropdown-item">MSTL</a>
</li>
<li>
<a href="../../../gallery/robust-stl/" class="dropdown-item">ROBUST_STL</a>
</li>
<li>
<a href="../../../gallery/emd/" class="dropdown-item">EMD</a>
</li>
<li>
<a href="../../../gallery/ceemdan/" class="dropdown-item">CEEMDAN</a>
</li>
<li>
<a href="../../../gallery/vmd/" class="dropdown-item">VMD</a>
</li>
<li>
<a href="../../../gallery/wavelet/" class="dropdown-item">WAVELET</a>
</li>
<li>
<a href="../../../gallery/ma-baseline/" class="dropdown-item">MA_BASELINE</a>
</li>
<li>
<a href="../../../gallery/mvmd/" class="dropdown-item">MVMD</a>
</li>
<li>
<a href="../../../gallery/memd/" class="dropdown-item">MEMD</a>
</li>
<li>
<a href="../../../gallery/gabor-cluster/" class="dropdown-item">GABOR_CLUSTER</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">Reference</a>
<ul class="dropdown-menu">
<li>
<a href="../../../api/" class="dropdown-item">API Overview</a>
</li>
<li>
<a href="../../../config-reference/" class="dropdown-item">Config Reference</a>
</li>
<li>
<a href="../../../machine-api/" class="dropdown-item">Machine API</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">Project</a>
<ul class="dropdown-menu">
<li>
<a href="../../../comparisons/" class="dropdown-item">Compare Alternatives</a>
</li>
<li>
<a href="../../../reproducibility/" class="dropdown-item">Reproducibility</a>
</li>
<li>
<a href="../../../architecture/" class="dropdown-item">Architecture</a>
</li>
<li>
<a href="../../../migration/" class="dropdown-item">Migration from `tsdecomp`</a>
</li>
<li>
<a href="../../../contributing/" class="dropdown-item">Contributing</a>
</li>
<li>
<a href="../../../citation/" class="dropdown-item">Citation / Release Notes</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav ms-md-auto">
<li class="nav-item">
<a href="#" class="nav-link" data-bs-toggle="modal" data-bs-target="#mkdocs_search_modal">
<i class="fa fa-search"></i> Search
</a>
</li>
<li class="nav-item">
<a rel="prev" href="../notebooks/07_ai_infrastructure_market_pulse/" class="nav-link">
<i class="fa fa-arrow-left"></i> Previous
</a>
</li>
<li class="nav-item">
<a rel="next" href="../arxiv-research-pulse/" class="nav-link">
Next <i class="fa fa-arrow-right"></i>
</a>
</li>
<li class="nav-item">
<a href="https://github.com/systems-mechanobiology/DeTime" class="nav-link">systems-mechanobiology/DeTime</a>
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-3"><div class="navbar-expand-md bs-sidebar hidden-print affix" role="complementary">
<div class="navbar-header">
<button type="button" class="navbar-toggler collapsed" data-bs-toggle="collapse" data-bs-target="#toc-collapse" title="Table of Contents">
<span class="fa fa-angle-down"></span>
</button>
</div>
<div id="toc-collapse" class="navbar-collapse collapse card bg-body-tertiary">
<ul class="nav flex-column">
<li class="nav-item" data-bs-level="1"><a href="#hot-trend-lab-source-protocol" class="nav-link">Hot Trend Lab Source Protocol</a>
<ul class="nav flex-column">
<li class="nav-item" data-bs-level="2"><a href="#source-card" class="nav-link">Source card</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#source-registry" class="nav-link">Source registry</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#reliability-matrix" class="nav-link">Reliability matrix</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#api-cache-and-timestamp-rules" class="nav-link">API, cache, and timestamp rules</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#source-snapshot-rules" class="nav-link">Source snapshot rules</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#replacement-sources" class="nav-link">Replacement sources</a>
<ul class="nav flex-column">
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div></div>
<div class="col-md-9" role="main">
<h1 id="hot-trend-lab-source-protocol">Hot Trend Lab Source Protocol</h1>
<p>Every Hot Trend Lab chart starts with a source card. The card tells the reader
what the series measures, when it was collected, how much coverage it has, and
which claim it can support. This keeps the column readable without hiding the
measurement limits.</p>
<h2 id="source-card">Source card</h2>
<p>Use this checklist before publishing a chart or table:</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>What to record</th>
<th>Pass condition</th>
</tr>
</thead>
<tbody>
<tr>
<td>Source</td>
<td>API, endpoint, vendor, or cached public snapshot</td>
<td>the source can be named and re-fetched or inspected</td>
</tr>
<tr>
<td>Query</td>
<td>category, keyword, ticker basket, article title, or repo list</td>
<td>another reader can reproduce the selection</td>
</tr>
<tr>
<td>Timestamp</td>
<td>access date plus source time field</td>
<td>the collection date is visible in the table</td>
</tr>
<tr>
<td>Coverage</td>
<td>first timestamp, last timestamp, observation count, missing ratio</td>
<td>gaps are small enough for the intended chart</td>
</tr>
<tr>
<td>Refresh rule</td>
<td>per run, daily, weekly, or event-driven</td>
<td>cadence matches the claim being made</td>
</tr>
<tr>
<td>Interpretation</td>
<td>what the source measures and what it does not measure</td>
<td>the article sentence stays inside the evidence</td>
</tr>
</tbody>
</table>
<h2 id="source-registry">Source registry</h2>
<p>The registry is the live list of public feeds used by the notebooks. Each row
maps a source to its metric, notebook use, refresh rule, and interpretation
limit.</p>
<h2 id="reliability-matrix">Reliability matrix</h2>
<table>
<thead>
<tr>
<th>Source</th>
<th>Measures</th>
<th>Best use</th>
<th>Main limit</th>
<th>Publish threshold</th>
</tr>
</thead>
<tbody>
<tr>
<td>arXiv API</td>
<td>public preprint counts and metadata</td>
<td>research-output trend, deadline pulses, topic watchlists</td>
<td>preprints are not peer-reviewed; cross-listing and query wording change counts</td>
<td>query and date window shown; spike explained against deadline context</td>
</tr>
<tr>
<td>Hugging Face Hub API</td>
<td>model metadata, downloads, likes</td>
<td>current open-model attention and repeated snapshot retention</td>
<td>one snapshot is cross-sectional; downloads do not measure quality</td>
<td>snapshot date shown; repeated snapshots required for momentum language</td>
</tr>
<tr>
<td>GitHub REST API</td>
<td>repo metadata and stargazer timestamps</td>
<td>developer attention and launch-week velocity</td>
<td>token limits, page limits, bots, and repo selection bias</td>
<td>covered page/window shown; stars described as attention</td>
</tr>
<tr>
<td>Wikimedia Analytics API</td>
<td>article pageviews</td>
<td>public attention and hype-decay curves</td>
<td>article naming and media events can dominate the series</td>
<td>project, article, date range, and access type shown</td>
</tr>
<tr>
<td>DeFiLlama stablecoin API</td>
<td>stablecoin supply and chain distribution</td>
<td>liquidity context around crypto events</td>
<td>endpoint schema can change; supply is not execution liquidity</td>
<td>schema inspected and top-chain context shown</td>
</tr>
<tr>
<td>CoinGecko API</td>
<td>crypto price and market data</td>
<td>price residual context for BTC/ETH examples</td>
<td>public API rate limits and vendor methodology</td>
<td>market structure language; no trade recommendation</td>
</tr>
<tr>
<td>Yahoo Finance through <code>yfinance</code></td>
<td>public market prices</td>
<td>AI infrastructure price-proxy examples</td>
<td>unofficial public wrapper; not licensed point-in-time market data</td>
<td>basket definition shown; valuation claims excluded</td>
</tr>
</tbody>
</table>
<h2 id="api-cache-and-timestamp-rules">API, cache, and timestamp rules</h2>
<p>Public APIs change shape, paginate results, and rate-limit unauthenticated
requests. Each notebook records the endpoint or query context, then writes a
source audit table with first timestamp, last timestamp, observation count, and
missing ratio. Cached files are treated as dated public snapshots rather than
anonymous local data.</p>
<p>For snapshot sources, wording changes with depth:</p>
<table>
<thead>
<tr>
<th>Snapshot depth</th>
<th>Allowed wording</th>
<th>Avoid</th>
</tr>
</thead>
<tbody>
<tr>
<td>One dated snapshot</td>
<td>current public ranking or adoption proxy</td>
<td>momentum, acceleration, retention</td>
</tr>
<tr>
<td>Repeated snapshots</td>
<td>change in downloads, likes, stars, or attention over time</td>
<td>quality, production usage, valuation</td>
</tr>
<tr>
<td>Full source history or scheduled collection</td>
<td>trend, seasonality, residual events over the covered window</td>
<td>claims outside the source universe</td>
</tr>
</tbody>
</table>
<h2 id="source-snapshot-rules">Source snapshot rules</h2>
<p>Cached source snapshots keep the same source-card fields as freshly fetched
data: source, query, access date, time range, coverage, and interpretation
scope. A cache can support a chart only when its date and query are visible.</p>
<h2 id="replacement-sources">Replacement sources</h2>
<p>A notebook may use a better licensed or institutional source, but the result
still needs the same source card. For production work, add vendor name, point-in
time policy, revision policy, calendar, and redistribution limits.</p></div>
</div>
</div>
<footer class="col-md-12">
<hr>
<p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
</footer>
<script src="../../../js/bootstrap.bundle.min.js"></script>
<script>
var base_url = "../../..",
shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
</script>
<script src="../../../js/base.js"></script>
<script src="../../../search/main.js"></script>
<div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="searchModalLabel">Search</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>From here you can search these documents. Enter your search terms below.</p>
<form>
<div class="form-group">
<input type="search" class="form-control" placeholder="Search..." id="mkdocs-search-query" title="Type search term here">
</div>
</form>
<div id="mkdocs-search-results" data-no-results-text="No results found"></div>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table class="table">
<thead>
<tr>
<th style="width: 20%;">Keys</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td class="help shortcut"><kbd>?</kbd></td>
<td>Open this help</td>
</tr>
<tr>
<td class="next shortcut"><kbd>n</kbd></td>
<td>Next page</td>
</tr>
<tr>
<td class="prev shortcut"><kbd>p</kbd></td>
<td>Previous page</td>
</tr>
<tr>
<td class="search shortcut"><kbd>s</kbd></td>
<td>Search</td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
</body>
</html>