Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,14 @@ the MIT license, and needs no account.
| | Requirements | Get it |
| --- | --- | --- |
| **Windows** | Windows 10 (version 1809 or later) or Windows 11, 64-bit, with an NVIDIA, AMD or Intel GPU | [EternalMonitor-Setup.exe](https://github.com/sidebandstudio/EternalMonitor/releases/tag/v0.3.0) (v0.3.0 current stable) |
| **iPad** | iPadOS 17 or later | [TestFlight v0.3.0, build 143](https://testflight.apple.com/join/ppc9QfXc). External installation opens after Apple approves the build. |
| **iPad** | iPadOS 17 or later | [TestFlight v0.3.0, build 143](https://testflight.apple.com/join/ppc9QfXc). The public beta is open: install TestFlight, then open the link on your iPad. |

Install both apps from the same version. The older v0.1 releases use a different
protocol and cannot connect to the v0.3 iPad app.

Testing it? Send bugs and feedback through the [form on the download page](https://eternalmonitor.dev/download.html#feedback),
which emails hello@sideband.studio, or open a [GitHub issue](https://github.com/sidebandstudio/EternalMonitor/issues/new/choose).

The installer is not code-signed yet, so Windows SmartScreen asks before it runs.
Choose **More info**, then **Run anyway**, only after checking that the file's
SHA-256 matches the one on the [release page](https://github.com/sidebandstudio/EternalMonitor/releases).
Expand Down
6 changes: 3 additions & 3 deletions SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,12 @@ the Start menu. To have it open whenever you sign in to Windows, go to
## Step 2: Install EternalMonitor on your iPad

The iPad app installs through Apple's TestFlight app. Use v0.3.0, build 143,
with the current stable Windows release. External installation requires
Apple's beta review approval.
with the current stable Windows release. The beta is open to anyone with the
invite link.

1. On the iPad, install **TestFlight** from the App Store.
2. Open the [EternalMonitor TestFlight invite](https://testflight.apple.com/join/ppc9QfXc),
then tap **Accept** and **Install** once the build is available.
then tap **Accept** and **Install**.
3. Open **EternalMonitor** on the iPad.

## Step 3: Connect over Wi-Fi
Expand Down
14 changes: 10 additions & 4 deletions docs/beta-testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,12 @@ https://testflight.apple.com/join/ppc9QfXc

The App Store Connect app and CI signing credentials are already configured
for `sidebandstudio/EternalMonitor`. iPad v0.3.0, build 143, was uploaded and
submitted for external beta review on September 25, 2026. It belongs to the
submitted for external beta review on September 25, 2026, and Apple approved it
on September 26, 2026. It belongs to the
`FriendsExternal` group, whose public link and automatic tester notification
are enabled. The feedback and review contact email is `Whois.younes@gmail.com`.

External installation opens after Apple approves the build. Pair it with the
External installation is open. Pair it with the
[current stable Windows release](https://github.com/sidebandstudio/EternalMonitor/releases/tag/v0.3.0).
The setup instructions below are for maintaining or replacing that configuration.

Expand Down Expand Up @@ -139,8 +140,13 @@ Two links, and they must match:

- The v0.3.0 Windows installer, shown as the current stable release on
eternalmonitor.dev/download.html. Its bytes are unchanged from v0.3.0-rc.1.
- The TestFlight public link for iPad v0.3.0, build 143. External installation
requires Apple's beta review approval.
- The TestFlight public link for iPad v0.3.0, build 143. Apple approved it for
external testing on September 26, 2026.

Tell them where feedback goes: the form at
https://eternalmonitor.dev/download.html#feedback (it opens their mail app
addressed to hello@sideband.studio), TestFlight's Send Beta Feedback, or a
GitHub issue.

Use the matching release pair. v0.1 and v2 builds cannot stream together.
v0.3 keeps the v2 prefix and negotiates new features, but mixing older builds
Expand Down
94 changes: 87 additions & 7 deletions docs/download.html
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@
<section class="download-hero">
<div class="container">
<h1>Download EternalMonitor</h1>
<p>v0.3.0 is the current stable release. Install it on Windows with iPad v0.3.0, TestFlight build 143.</p>
<p>New to EternalMonitor? The <a href="https://github.com/sidebandstudio/EternalMonitor/blob/main/SETUP.md" target="_blank" rel="noopener">setup guide</a> walks through every step, including USB with Apple Devices.</p>
<p>v0.3.0 is the current stable release. Install it on Windows with iPad v0.3.0, TestFlight build 143. The iPad beta is open to everyone through TestFlight.</p>
<p>New to EternalMonitor? The <a href="https://github.com/sidebandstudio/EternalMonitor/blob/main/SETUP.md" target="_blank" rel="noopener">setup guide</a> walks through every step, including USB with Apple Devices. Found a bug? <a href="#feedback">Tell us below</a>.</p>
</div>
</section>

Expand All @@ -75,29 +75,109 @@ <h2>Windows</h2>
<span class="sha256-label">SHA-256</span>
<code id="sha256-value">70bd59be737423d636a53b27d7e0fbe9b9e8563ecc104d79f153b139be904a12</code>
</div>
<p class="download-note"><a href="https://github.com/sidebandstudio/EternalMonitor/releases/tag/v0.3.0" target="_blank" rel="noopener">Release notes and known issues</a></p>
<p class="download-note"><a href="https://github.com/sidebandstudio/EternalMonitor/releases/tag/v0.3.0" target="_blank" rel="noopener">Release notes and known issues</a> · <a href="#feedback">Report a problem</a></p>
</article>

<!-- iPad -->
<article class="download-card card">
<div class="download-card-header">
<span class="platform-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="4" y="2" width="16" height="20" rx="3"/><path d="M11 18.5h2"/></svg></span>
<h2>iPad</h2>
<span class="badge badge-muted">TestFlight</span>
<span class="badge badge-accent">TestFlight beta</span>
</div>
<p>v0.3.0, build 143. Shows your PC's screen and sends touch, Apple Pencil pressure and tilt, and keyboard input back. Use Drawing mode for Pencil input with palm rejection.</p>
<ul class="spec-list" aria-label="Requirements">
<li>iPadOS 17 or later</li>
<li>TestFlight from the App Store</li>
</ul>
<div class="download-btn-wrap">
<p id="testflight-status" class="testflight-status">Build 143 is awaiting Apple's beta review. External installation opens after approval.</p>
<a href="https://testflight.apple.com/join/ppc9QfXc" id="testflight-link" class="btn btn-primary btn-block" target="_blank" rel="noopener">Open TestFlight invite</a>
<p id="testflight-status" class="testflight-status testflight-status--open"><span class="eyebrow-dot" aria-hidden="true"></span><span>Build 143 passed Apple's beta review. Anyone with the link can install it now.</span></p>
<a href="https://testflight.apple.com/join/ppc9QfXc" id="testflight-link" class="btn btn-primary btn-block" target="_blank" rel="noopener">Join the TestFlight beta</a>
</div>
<ol class="install-steps" aria-label="How to install on the iPad">
<li>Install <strong>TestFlight</strong> from the App Store on your iPad.</li>
<li>Open the invite on the iPad, then tap <strong>Accept</strong> and <strong>Install</strong>.</li>
<li>Open EternalMonitor and pair it with your PC.</li>
</ol>
<a class="feedback-callout" href="#feedback">
<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4.5h14v9H8.5L5 16.5v-3H3z"/><path d="M7 8.5h6M7 11h3.5"/></svg>
<span><strong>Testing the beta?</strong> Send bugs and feedback with the form below, or email hello@sideband.studio.</span>
</a>
<p class="download-note">Developers can also <a href="https://github.com/sidebandstudio/EternalMonitor/tree/main/ios" target="_blank" rel="noopener">build it from source</a>.</p>
</article>
</div>
</section>

<section class="feedback-section" id="feedback">
<div class="container">
<div class="feedback-card card reveal">
<div class="feedback-intro">
<span class="feedback-kicker">Beta feedback</span>
<h2>Report a bug or share feedback</h2>
<p>Everything you send here goes to <a href="mailto:hello@sideband.studio">hello@sideband.studio</a>. Sending opens your mail app with the message filled in, so you can attach screenshots or the host log before it goes out.</p>
<p>Prefer GitHub? <a href="https://github.com/sidebandstudio/EternalMonitor/issues/new/choose" target="_blank" rel="noopener">Open an issue</a> instead. TestFlight's own <strong>Send Beta Feedback</strong> works too.</p>
<div class="status-note">
<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 2.5 18 16.5H2z"/><path d="M10 8v3.5"/><circle cx="10" cy="14" r=".6" fill="currentColor"/></svg>
<span>Leave out pairing codes and QR codes. If you paste the host log, click <strong>New code</strong> in the PC window afterwards.</span>
</div>
</div>

<form id="feedback-form" class="feedback-form" action="mailto:hello@sideband.studio" method="post" enctype="text/plain" data-release="Windows v0.3.0 · iPad v0.3.0, TestFlight build 143">
<fieldset class="field field--choice">
<legend>What is this about?</legend>
<div class="choice-group">
<label class="choice"><input type="radio" name="kind" value="Bug" checked><span>Bug report</span></label>
<label class="choice"><input type="radio" name="kind" value="Feedback"><span>General feedback</span></label>
</div>
</fieldset>
<div class="field">
<label for="fb-message">What happened, or what do you think?</label>
<textarea id="fb-message" name="message" rows="5" required placeholder="What you expected, what you saw instead, and any error message word for word."></textarea>
</div>
<div class="field" id="fb-steps-field">
<label for="fb-steps">Steps to reproduce <span class="optional">optional</span></label>
<textarea id="fb-steps" name="steps" rows="3" placeholder="1. Connect over USB&#10;2. Choose Extended display (iPad) and click Restart now&#10;3. ..."></textarea>
</div>
<div class="field-row">
<div class="field">
<label for="fb-ipad">iPad model and iPadOS</label>
<input id="fb-ipad" name="ipad" type="text" placeholder="iPad Pro 12.9-inch (M2), iPadOS 26.2" autocomplete="off">
</div>
<div class="field">
<label for="fb-pc">Windows version and GPU</label>
<input id="fb-pc" name="pc" type="text" placeholder="Windows 11 24H2, GeForce RTX 4070" autocomplete="off">
</div>
<div class="field">
<label for="fb-connection">Connection</label>
<select id="fb-connection" name="connection">
<option value="">Not sure</option>
<option>Wi-Fi</option>
<option>USB cable</option>
<option>Both</option>
</select>
</div>
</div>
<div class="feedback-actions">
<button type="submit" class="btn btn-primary" id="feedback-send">
<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M17 3 3 8.5l6.5 2 2 6.5z"/><path d="M17 3 9.5 10.5"/></svg>
Send to hello@sideband.studio
</button>
<p class="download-note">The release versions are added for you.</p>
</div>
</form>

<div class="feedback-fallback" id="feedback-fallback" hidden>
<p><strong>Your mail app should have opened.</strong> If it didn't, copy the message below and send it to <a href="mailto:hello@sideband.studio">hello@sideband.studio</a>.</p>
<pre><code id="feedback-preview"></code></pre>
<div class="feedback-fallback-actions">
<button type="button" class="btn btn-secondary btn-sm" id="feedback-copy">Copy message</button>
<span class="download-note" id="feedback-copied" role="status" hidden>Copied</span>
</div>
</div>
</div>
</div>
</section>

<section class="build-section">
<div class="container">
<details class="build-details card reveal">
Expand Down Expand Up @@ -134,7 +214,7 @@ <h3>iPad app</h3>
<div class="footer-links">
<a href="index.html">Home</a>
<a href="https://github.com/sidebandstudio/EternalMonitor" target="_blank" rel="noopener">GitHub</a>
<a href="mailto:aliyounes@eternalreverse.com">Contact</a>
<a href="mailto:hello@sideband.studio">Contact</a>
</div>
</div>
</footer>
Expand Down
10 changes: 7 additions & 3 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ <h3>
<div>
<span class="badge badge-accent">v0.3.0</span>
<h2>Current stable</h2>
<p>Version 0.3.0 includes USB, PC audio, pairing, keyboard control, Apple Pencil drawing and packet repair. Install the Windows release with iPad v0.3.0, TestFlight build 143. Get both on the <a href="download.html">download page</a>, including the current TestFlight availability.</p>
<p>Version 0.3.0 includes USB, PC audio, pairing, keyboard control, Apple Pencil drawing and packet repair. Install the Windows release with iPad v0.3.0, TestFlight build 143. The iPad beta is open to everyone, and both are on the <a href="download.html">download page</a>, along with a form for <a href="download.html#feedback">bug reports and feedback</a>.</p>
<p>See the <a href="https://github.com/sidebandstudio/EternalMonitor/releases/tag/v0.3.0" target="_blank" rel="noopener">release notes</a> for setup details and known issues.</p>
<div class="status-note">
<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 2.5 18 16.5H2z"/><path d="M10 8v3.5"/><circle cx="10" cy="14" r=".6" fill="currentColor"/></svg>
Expand Down Expand Up @@ -279,7 +279,11 @@ <h2>Questions</h2>
</details>
<details>
<summary>Where do I get the iPad app?</summary>
<p>The iPad app is distributed through TestFlight. The <a href="download.html">download page</a> has the public invite and availability for v0.3.0, build 143. Install it with the v0.3.0 Windows release. Developers can also build it from source.</p>
<p>The iPad app is distributed through TestFlight, and the v0.3.0 beta (build 143) is open to everyone. Install the TestFlight app on your iPad, then open the public invite from the <a href="download.html">download page</a>. Install it with the v0.3.0 Windows release. Developers can also build it from source.</p>
</details>
<details>
<summary>Found a bug, or have feedback?</summary>
<p>Use the <a href="download.html#feedback">feedback form</a> on the download page. It sends your report to hello@sideband.studio with the version details filled in. Bug reports are also welcome as <a href="https://github.com/sidebandstudio/EternalMonitor/issues/new/choose" target="_blank" rel="noopener">GitHub issues</a>.</p>
</details>
</div>
</div>
Expand Down Expand Up @@ -311,7 +315,7 @@ <h2>Put your iPad to work</h2>
<div class="footer-links">
<a href="download.html">Download</a>
<a href="https://github.com/sidebandstudio/EternalMonitor" target="_blank" rel="noopener">GitHub</a>
<a href="mailto:aliyounes@eternalreverse.com">Contact</a>
<a href="mailto:hello@sideband.studio">Contact</a>
</div>
</div>
</footer>
Expand Down
80 changes: 80 additions & 0 deletions docs/script.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,86 @@
});
});

/* --- Feedback form: opens the visitor's mail app with the report filled in --- */
var feedbackForm = document.getElementById('feedback-form');
if (feedbackForm) {
var FEEDBACK_TO = 'hello@sideband.studio';
var stepsField = document.getElementById('fb-steps-field');
var fallback = document.getElementById('feedback-fallback');
var preview = document.getElementById('feedback-preview');
var copyBtn = document.getElementById('feedback-copy');
var copied = document.getElementById('feedback-copied');

var feedbackKind = function () {
var checked = feedbackForm.querySelector('input[name="kind"]:checked');
return checked ? checked.value : 'Bug';
};
var fieldValue = function (id) {
var el = document.getElementById(id);
return el ? el.value.trim() : '';
};

// Steps only make sense for a bug.
var syncKind = function () {
if (stepsField) stepsField.hidden = feedbackKind() !== 'Bug';
};
Array.prototype.forEach.call(feedbackForm.querySelectorAll('input[name="kind"]'), function (radio) {
radio.addEventListener('change', syncKind);
});
syncKind();

var composeBody = function () {
var lines = [fieldValue('fb-message'), ''];
if (feedbackKind() === 'Bug' && fieldValue('fb-steps')) {
lines.push('Steps to reproduce:', fieldValue('fb-steps'), '');
}
lines.push(
'iPad: ' + (fieldValue('fb-ipad') || 'not given'),
'PC: ' + (fieldValue('fb-pc') || 'not given'),
'Connection: ' + (fieldValue('fb-connection') || 'not sure'),
'Release: ' + (feedbackForm.getAttribute('data-release') || ''),
'Sent from eternalmonitor.dev/download.html'
);
return lines.join('\n');
};

feedbackForm.addEventListener('submit', function (e) {
e.preventDefault();
if (!feedbackForm.reportValidity()) return;
var kind = feedbackKind() === 'Bug' ? 'bug' : 'feedback';
var firstLine = fieldValue('fb-message').split('\n')[0].slice(0, 70);
var subject = '[EternalMonitor ' + kind + '] ' + firstLine;
var body = composeBody();
if (preview) preview.textContent = 'To: ' + FEEDBACK_TO + '\nSubject: ' + subject + '\n\n' + body;
if (fallback) fallback.hidden = false;
window.location.href = 'mailto:' + FEEDBACK_TO +
'?subject=' + encodeURIComponent(subject) +
'&body=' + encodeURIComponent(body);
});

if (copyBtn) {
copyBtn.addEventListener('click', function () {
var text = preview ? preview.textContent : '';
var done = function () {
if (!copied) return;
copied.hidden = false;
setTimeout(function () { copied.hidden = true; }, 2000);
};
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(done, function () {});
} else if (preview) {
var range = document.createRange();
range.selectNodeContents(preview);
var selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
try { if (document.execCommand('copy')) done(); } catch (err) {}
selection.removeAllRanges();
}
});
}
}

/* --- GitHub Releases API Fetch --- */
var downloadBtn = document.getElementById('download-btn');
var versionEl = document.getElementById('release-version');
Expand Down
Loading
Loading