State A: collapse-to-answered-summary UI, with entrance animation

Answering a question collapses it to a one-line green summary with a
"Change" link; the next question/instructions animate in below. This
is the checkpoint to compare against the "always-visible options,
grows downward" experiment (State B).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DyvzxcY41RmRYDebTWxuFo
This commit is contained in:
jonwiseandClaude Sonnet 5 committed 2026-09-04 16:04:58 -04:00
commit c6dda40681
37 files changed
+1483

No files matched your search

+1
View File
@@ -0,0 +1 @@
.DS_Store
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

+52
View File
@@ -0,0 +1,52 @@
Step 1) Is your PC setup: can you list devices over novacom?
- Yes: Go to Step 2
- No: - Install Java, Install Drivers, Do novacom -l from command line
Step 2) Is your device activated and healthy? Or do you need to activate, reset or upgrade?
- Healthy: Go to Step 5
- Activate/Reset: Go to Step 3
Step 3) Identify your device:
- Old Phones: Pre, Pre Plus, Pixi, Pixi Plus
- Reset: How to use Doctor (with filenames)
- Activate: Go to Step 4
- Later Phones: Pre2, Pre3, Veer
- Reset or Upgrade: How to use Doctor (with filenames)
- Activate: Go to Step 4
- Touchpad 10” (WiFi or 4G)
- Reset to Stock: How to use Doctor (with filenames), then Step 4
- Upgrade to 3.1.0: How to use Doctor (with filenames), NO Step 4-5
- Touchpad Go 8” (4G)
- Reset to Stock: How to use Doctor (with filenames), then Step 4
Step 4) Activate with deviceTool
- use deviceTool from Command Line, then Step 5
Step 5) Install App Stores
- install Preware from command line
- Install App Catalog from command line
- Go to Step 6-type variant
Step 6 Old Phones)
- No modern internet, HTTP only, Classic for PalmOS, lots of games to play!
Step 6 Later Phones)
- Modern HTTPS through Preware
- Retro browser rendering limitations
- Many games, some functional apps (Podcasts, etc…)
Step 6 Touchpad Go)
- Modern HTTPS through Preware
- 2018-era browser in Preware
- USB, Bluetooth game controllers, many games are compatible (some are not), almost all Touchpad apps work on Go
Step 6 Touchpad 10”)
- Modern HTTPS pre-installed
- Modern browsers available
- Tons of games, including ports from Pre, Linux, and iOS being made by community
- Tons of apps, new and restored apps from community
Step 7) Developing and hacking webOS
- SDK
- MCP
- Porting guides
+336
View File
@@ -0,0 +1,336 @@
/* Plain ES5 -- no arrow functions, let/const, template literals, or
Array/Object niceties newer than what a 2010/2011 WebKit ships. */
var STORAGE_KEY = "wosaHelpFlowState2";
/* Every step card is always visible; collapsedSteps just tracks which
ones are collapsed to their header. Step 1 starts open, the rest
start collapsed -- expand as you go, or jump straight to any step. */
function wosaDefaultState() {
var collapsedSteps = {};
if (typeof FLOW !== "undefined") {
for (var i = 0; i < FLOW.length; i++) {
if (FLOW[i].id !== 1) { collapsedSteps[FLOW[i].id] = true; }
}
}
return { path: {}, deviceFilter: null, collapsedSteps: collapsedSteps };
}
function wosaLoadState() {
try {
if (window.localStorage) {
var raw = window.localStorage.getItem(STORAGE_KEY);
if (raw) {
var parsed = JSON.parse(raw);
if (parsed && parsed.path && parsed.collapsedSteps) {
if (parsed.deviceFilter === undefined) { parsed.deviceFilter = null; }
return parsed;
}
}
}
} catch (e) {
/* localStorage unavailable or corrupt -- fall back to defaults */
}
return wosaDefaultState();
}
var wosaState = wosaLoadState();
function wosaSaveState() {
try {
if (window.localStorage) {
window.localStorage.setItem(STORAGE_KEY, JSON.stringify(wosaState));
}
} catch (e) {
/* ignore */
}
}
function wosaFindStep(id) {
for (var i = 0; i < FLOW.length; i++) {
if (FLOW[i].id === id) { return FLOW[i]; }
}
return null;
}
/* Steps in FILTER_STEP_IDS all ask the same top-level "which device"
question. Once it's been answered anywhere, seed that answer into
any other filter step that hasn't been asked yet, so it isn't
asked over and over. */
function wosaGetPath(stepId) {
if (!wosaState.path[stepId]) { wosaState.path[stepId] = []; }
var isFilterStep = (typeof FILTER_STEP_IDS !== "undefined" && FILTER_STEP_IDS.indexOf(stepId) !== -1);
var hasFilter = (wosaState.deviceFilter !== null && wosaState.deviceFilter !== undefined);
if (isFilterStep && hasFilter && wosaState.path[stepId].length === 0) {
wosaState.path[stepId] = [wosaState.deviceFilter];
}
return wosaState.path[stepId];
}
function wosaScrollToStep(stepId) {
var el = document.getElementById("step-" + stepId);
if (el && el.scrollIntoView) {
el.scrollIntoView();
}
}
/* Every step card is always on the page -- "going to" a step just
means making sure it's expanded, then scrolling to it. */
function wosaGoto(stepId) {
wosaState.collapsedSteps[stepId] = false;
wosaSaveState();
wosaRender();
wosaScrollToStep(stepId);
}
/* Resets any step whose own node.options function reads the device
filter (FILTER_DEPENDENT_STEP_IDS) -- called whenever the filter
changes, so a stale numeric index can never silently point at a
different option once that step's filtered choice list reshuffles. */
function wosaInvalidateFilterDependents() {
if (typeof FILTER_DEPENDENT_STEP_IDS === "undefined") { return; }
for (var i = 0; i < FILTER_DEPENDENT_STEP_IDS.length; i++) {
wosaState.path[FILTER_DEPENDENT_STEP_IDS[i]] = [];
}
}
/* Pick option `idx` at nesting level `level` within step `stepId`.
Truncates any deeper choices previously made under this level. */
function wosaChoose(stepId, level, idx) {
var p = wosaGetPath(stepId);
wosaState.path[stepId] = p.slice(0, level);
wosaState.path[stepId][level] = idx;
/* Answering the shared "which device" question at its top level
updates the remembered filter, and carries the answer over to
any other filter step so it doesn't have to be asked again. */
var isFilterStep = (typeof FILTER_STEP_IDS !== "undefined" && FILTER_STEP_IDS.indexOf(stepId) !== -1);
if (isFilterStep && level === 0) {
wosaState.deviceFilter = idx;
for (var i = 0; i < FILTER_STEP_IDS.length; i++) {
var otherId = FILTER_STEP_IDS[i];
if (otherId !== stepId) {
wosaState.path[otherId] = [idx];
}
}
wosaInvalidateFilterDependents();
}
wosaSaveState();
wosaRender();
}
/* Clears the remembered device filter and the top-level answer on
every filter step, so the "which device" question is asked fresh
again wherever it appears. Doesn't save/render -- callers do that. */
function wosaClearFilterState() {
wosaState.deviceFilter = null;
if (typeof FILTER_STEP_IDS !== "undefined") {
for (var i = 0; i < FILTER_STEP_IDS.length; i++) {
wosaState.path[FILTER_STEP_IDS[i]] = [];
}
}
wosaInvalidateFilterDependents();
}
function wosaClearDeviceFilter() {
wosaClearFilterState();
wosaSaveState();
wosaRender();
}
/* Re-open a previously answered level so it can be changed. Reopening
a filter step's top level (the shared "which device" question) also
clears the remembered filter -- otherwise wosaGetPath would just
re-seed the answer we're about to clear, right back where it was. */
function wosaReopen(stepId, level) {
var p = wosaGetPath(stepId);
wosaState.path[stepId] = p.slice(0, level);
var isFilterStep = (typeof FILTER_STEP_IDS !== "undefined" && FILTER_STEP_IDS.indexOf(stepId) !== -1);
if (isFilterStep && level === 0) {
wosaClearFilterState();
}
wosaSaveState();
wosaRender();
}
/* A step's header is always clickable to collapse/expand its body. */
function wosaToggleStepCollapse(stepId) {
wosaState.collapsedSteps[stepId] = !wosaState.collapsedSteps[stepId];
wosaSaveState();
wosaRender();
}
function wosaSetAllCollapsed(collapsed) {
for (var i = 0; i < FLOW.length; i++) {
wosaState.collapsedSteps[FLOW[i].id] = collapsed;
}
wosaSaveState();
wosaRender();
}
function wosaExpandAll() {
wosaSetAllCollapsed(false);
}
function wosaCollapseAll() {
wosaSetAllCollapsed(true);
}
function wosaReset() {
wosaState = wosaDefaultState();
wosaSaveState();
wosaRender();
}
/* node.options is usually a plain array, but can also be a function
(evaluated at render time, e.g. against the current device filter)
for a node whose choices depend on state. */
function wosaResolveOptions(node) {
if (typeof node.options === "function") { return node.options(); }
return node.options;
}
/* Renders one question node (and, once answered, its collapsed summary,
the chosen answer's instructions, and -- recursively -- whatever
sub-question comes next). Returns an HTML string. */
function wosaRenderNode(node, path, stepId, level) {
var html = "";
var options = wosaResolveOptions(node);
var chosenIdx = path[level];
var hasChoice = (chosenIdx !== undefined && chosenIdx !== null && options[chosenIdx]);
if (!hasChoice) {
html += '<div class="node-block">';
if (node.q) {
html += '<p class="node-question">' + node.q + '</p>';
}
if (node.code) {
html += '<pre><code>' + node.code + '</code></pre>';
}
if (node.info) {
html += '<div class="node-info">' + node.info + '</div>';
}
html += '<div class="opt-list">';
for (var i = 0; i < options.length; i++) {
html += '<button type="button" class="opt-btn" onclick="wosaChoose(' + stepId + ',' + level + ',' + i + ')">' +
'<img class="chevron" src="images/chevron.png" alt="">' + options[i].label + '</button>';
}
html += '</div></div>';
return html;
}
var opt = options[chosenIdx];
html += '<div class="node-block answered">';
html += '<div class="answered-summary" onclick="wosaReopen(' + stepId + ',' + level + ')">' +
'<span class="change-hint">Change</span>' +
(node.q ? node.q + ' &rarr; ' : '') + '<strong>' + opt.label + '</strong>' +
'</div>';
if (opt.content) {
html += '<div class="leaf-content">' + opt.content + '</div>';
}
if (opt.next) {
html += wosaRenderNode(opt.next, path, stepId, level + 1);
}
html += '</div>';
return html;
}
/* Renders a topics list (Step 7 / Step 8) as one continuous scrolling
document -- a heading per topic, its content always visible below,
like the original docs pages, rather than a click-to-expand list. */
function wosaRenderTopics(node) {
var html = "";
for (var i = 0; i < node.topics.length; i++) {
var topic = node.topics[i];
html += '<div class="node-block">';
html += '<h3 class="node-question">' + topic.label + '</h3>';
html += '<div class="leaf-content">' + topic.content + '</div>';
html += '</div>';
}
if (node.after) {
html += '<div class="node-block"><div class="leaf-content">' + node.after + '</div></div>';
}
return html;
}
/* Flattens the chosen-answer chain for a step into a short breadcrumb,
shown on its collapsed header. Topics steps have no single "answer,"
so they never show a breadcrumb. */
/* Strips any markup (e.g. the device icon baked into device option
labels) down to plain text -- the collapsed header's summary strip
is a single condensed line, not the place for an icon. */
function wosaPlainText(html) {
return html.replace(/<[^>]*>/g, "");
}
function wosaStepSummary(step) {
if (step.node.topics) { return ""; }
var path = wosaGetPath(step.id);
var node = step.node;
var parts = [];
var lvl = 0;
while (node && path[lvl] !== undefined) {
var options = wosaResolveOptions(node);
if (!options || !options[path[lvl]]) { break; }
parts.push(wosaPlainText(options[path[lvl]].label));
node = options[path[lvl]].next;
lvl++;
}
return parts.join(" &rarr; ");
}
function wosaRenderStepCard(step) {
var html = '<div class="step-card" id="step-' + step.id + '">';
var collapsed = !!wosaState.collapsedSteps[step.id];
if (!collapsed) {
html += '<div class="step-header clickable-header" onclick="wosaToggleStepCollapse(' + step.id + ')">' +
'<img class="disclosure" src="images/disclosure-open.png" alt="">' +
'Step ' + step.id + ': ' + step.title +
'</div>';
var body = step.node.topics ?
wosaRenderTopics(step.node) :
wosaRenderNode(step.node, wosaGetPath(step.id), step.id, 0);
html += '<div class="step-body">' + body + '</div>';
} else {
var summary = wosaStepSummary(step);
html += '<div class="step-header clickable-header" onclick="wosaToggleStepCollapse(' + step.id + ')">' +
'<img class="disclosure" src="images/disclosure-closed.png" alt="">' +
'Step ' + step.id + ': ' + step.title +
(summary ? ' &mdash; <span class="summary-text">' + summary + '</span>' : '') +
'</div>';
}
html += '</div>';
return html;
}
/* Updates the removable "Device: ___" chip in #controls. */
function wosaRenderDeviceFilterBar() {
var el = document.getElementById("deviceFilterBar");
if (!el) { return; }
var hasFilter = (wosaState.deviceFilter !== null && wosaState.deviceFilter !== undefined);
if (!hasFilter) {
el.innerHTML = "";
return;
}
var label = (typeof DEVICE_CATEGORY_SHORT !== "undefined" && DEVICE_CATEGORY_SHORT[wosaState.deviceFilter]) || "set";
var iconSrc = (typeof DEVICE_CATEGORY_ICONS !== "undefined" && DEVICE_CATEGORY_ICONS[wosaState.deviceFilter]) || "";
var iconHtml = iconSrc ? "<img class='filter-chip-icon' src='" + iconSrc + "' alt=''>" : "";
el.innerHTML = '<span class="filter-chip">' + iconHtml + 'Device: <strong>' + label + '</strong> &nbsp;' +
'<a href="#" class="filter-clear" onclick="wosaClearDeviceFilter(); return false;">Remove filter</a></span>';
}
function wosaRender() {
var app = document.getElementById("app");
var html = "";
wosaRenderDeviceFilterBar();
for (var i = 0; i < FLOW.length; i++) {
html += wosaRenderStepCard(FLOW[i]);
}
app.innerHTML = html;
}
wosaRender();
+570
View File
@@ -0,0 +1,570 @@
/* Content lives here, separate from the renderer in app.js, so it can be
edited without touching any logic. Plain ES5 objects/strings only.
A "node" is one question: { q, code, info, options: [...] }
An "option" is one answer: { label, content, next }
- content: HTML shown once this answer is picked
- next: optional nested node (a follow-up question)
A "step" is a top-level, numbered row: { id, title, node }
Links: relative for anything on this site; plain http:// (not https://)
for webosarchive.org resources so we never force a protocol upgrade on
a device that can't do modern TLS; external third-party links keep
whatever scheme they require. */
var STEP1_NODE = {
q: "From a command line on your computer, run:",
code: "novacom -l",
info: "<p>This lists any webOS devices connected over USB. An empty result is fine &mdash; it just means nothing's plugged in yet. What matters is whether the computer recognizes the command at all.</p>",
options: [
{
label: "It ran (recognized the command &mdash; even with no devices listed)",
content: "<p>Good &mdash; your computer already has what it needs.</p>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(2)'>Continue to Step 2 &rarr;</button></p>"
},
{
label: "Command not found / I've never set this up",
next: {
q: "What kind of computer are you using?",
options: [
{
label: "Windows",
content: "<p>You'll need two things &mdash; install Java first, since novacom itself depends on it.</p>" +
"<ul>" +
"<li>Java 8 &mdash; <a href='https://www.java.com/download/ie_manual.jsp'>download here</a></li>" +
"<li>novacom driver &mdash; <a href='http://www.webosarchive.org/activation/drivers/novacom-win-32/'>32-bit</a> (tested on Windows 7) or <a href='http://www.webosarchive.org/activation/drivers/novacom-win-64/'>64-bit</a> (tested on Windows 10/11)</li>" +
"</ul>" +
"<p>Use a good quality micro USB cable plugged directly into your computer, not a hub &mdash; OEM cables have a small silver indented circle near the connector.</p>" +
"<p>Once installed, open a command line and try <code>novacom -l</code> again.</p>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(2)'>Continue to Step 2 &rarr;</button></p>"
},
{
label: "macOS",
content: "<p>Modern macOS (Catalina and later, including Apple Silicon) needs a community-rebuilt driver. Install Java first &mdash; novacom itself depends on it.</p>" +
"<ol>" +
"<li>Install <a href='https://support.apple.com/en-us/HT204036'>Java</a>.</li>" +
"<li>Install <a href='https://brew.sh/'>Homebrew</a>, then run <code>brew install libusb libusb-compat</code> in Terminal.</li>" +
"<li>Download and run the <a href='http://www.webosarchive.org/activation/drivers/novacom-macos-64/'>64-bit driver installer</a>. (On very old macOS up to Mojave, use the <a href='http://www.webosarchive.org/activation/drivers/novacom-osx-32/'>32-bit installer</a> instead.)</li>" +
"<li>macOS will probably block the installer at first &mdash; approve it under System Preferences &rarr; Security.</li>" +
"</ol>" +
"<p>Test it: plug in your device with a good cable and run <code>novacom -l</code> in Terminal.</p>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(2)'>Continue to Step 2 &rarr;</button></p>"
},
{
label: "Linux",
content: "<p>Install Java first &mdash; novacom itself depends on it.</p>" +
"<ul>" +
"<li>Java 8 &mdash; <a href='https://www.fosstechnix.com/install-oracle-java-8-on-ubuntu-20-04/'>install guide</a></li>" +
"<li>novacom driver &mdash; <a href='http://www.webosarchive.org/activation/drivers/novacom-linux-32/'>32-bit</a> or <a href='http://www.webosarchive.org/activation/drivers/novacom-linux-64/'>64-bit</a> DEB package (tested on Ubuntu)</li>" +
"</ul>" +
"<p>Use a good quality micro USB cable plugged directly into your computer, not a hub.</p>" +
"<p>Once installed, try <code>novacom -l</code> again.</p>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(2)'>Continue to Step 2 &rarr;</button></p>"
}
]
}
}
]
};
var STEP2_NODE = {
q: "Is your device working normally right now?",
options: [
{
label: "Yes, it works fine",
content: "<p>Nothing to fix &mdash; you're ready to move on.</p>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(5)'>Continue to Step 5 &rarr;</button></p>"
},
{
label: "It works, but I want to reset or upgrade it",
content: "<p>No rush &mdash; head to Step 3 and pick your device to see the reset or upgrade option that fits it.</p>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(3)'>Continue to Step 3 &rarr;</button></p>"
},
{
label: "It boots, but I can't activate it or get to the Launcher",
content: "<p>That's expected, not a problem with your device &mdash; Palm/HP's activation servers have been offline for years, so it gets stuck trying (and failing) to activate itself. This is solved with a computer tool called deviceTool, which the next couple of steps walk through.</p>" +
"<p>Make sure <a href='#' onclick='wosaGoto(1); return false;'>Step 1</a> (computer + drivers) is done, then continue.</p>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(3)'>Continue to Step 3 &rarr;</button></p>"
},
{
label: "It boots, but I'm locked out (forgot the PIN)",
content: "<p>You can clear the passcode from the command line &mdash; but first, run deviceTool to make sure the device is developer-unlocked. Follow <a href='#' onclick='wosaGoto(4); return false;'>Step 4</a>'s instructions to get into recovery mode and run deviceTool (this works even though you can't get past the lock screen), then come back here.</p>" +
"<p>Once that's done, get a shell on the device:</p>" +
"<ul>" +
"<li>Boot the device normally and connect it to your computer with a good USB cable.</li>" +
"<li>On Mac or Linux, run <code>novaterm</code> from a command line. On Windows, run <code>C:\\Program Files\\Palm, Inc\\terminal\\novaterm.bat</code>.</li>" +
"</ul>" +
"<p>From that shell, enter:</p>" +
"<pre><code>luna-send -f -n 1 palm://com.palm.systemmanager/setDevicePasscode '{\"passCode\":\"\", \"lockMode\":\"none\"}'</code></pre>" +
"<p>You should see <code>{ \"returnValue\": true }</code>. If you get <code>false</code> instead (common on enterprise setups, which require a PIN), set a new one instead of removing it:</p>" +
"<pre><code>luna-send -f -n 1 palm://com.palm.systemmanager/setDevicePasscode '{\"passCode\":\"1234\", \"lockMode\":\"pin\"}'</code></pre>" +
"<p>Then reboot from the same shell:</p>" +
"<pre><code>reboot</code></pre>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(5)'>Continue to Step 5 &rarr;</button></p>"
},
{
label: "It boots, but won't load webOS (or a Doctor won't finish) &mdash; often after trying LuneOS, Android, etc.",
content: "<p class='note'>TouchPad only.</p>" +
"<p>The Touchpad Toolbox loads a rescue environment so you can wipe the partitions and start fresh.</p>" +
"<ul>" +
"<li>Get the toolbox from the <a href='https://xdaforums.com/t/tools-touchpad-toolbox-updated-2015-02-25.2756314/'>original XDA post</a>, or a <a href='http://www.webosarchive.org/activation/TPToolbox-2015-01-08-v42.zip'>backup copy from webOS Archive</a> if that link ever goes stale.</li>" +
"<li>Make sure novacom is working on your computer (<a href='#' onclick='wosaGoto(1); return false;'>Step 1</a>).</li>" +
"<li>Power off the TouchPad. Hold Volume Up, then press and hold Power until the screen lights up (about 5 seconds), then release both when the USB symbol appears.</li>" +
"<li>Run the matching <code>tptb_</code> startup script for your computer's OS from a terminal or command prompt.</li>" +
"<li>Once the Toolbox boots on the TouchPad, use the hardware Volume keys and Home button to navigate. Choose <strong>Complete Data Reset</strong> and confirm, then <strong>Create webOS Volumes</strong> and confirm that too.</li>" +
"<li>Reboot back into recovery mode (hold Volume Up while powering on).</li>" +
"</ul>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(3)'>Continue to Step 3 &rarr;</button> (to run a fresh Doctor)</p>"
},
{
label: "It won't power on or show anything at all",
next: {
q: "TouchPads have a known battery-chip quirk that can look like a dead device. Let's try charging it back to life first.",
info: "<p>Use a <strong>lower-power</strong> charger than the original &mdash; something like a 5V/1A phone charger, not the stock 5.3V/2A one. (A drained A6 battery chip can refuse a high-power charge.) Plug it in and wait.</p>" +
"<p>Give it 2&ndash;3 days, up to a week. Watch for the home button light alternating, or a low-battery symbol &mdash; either is a good sign. If you see one, switch to a higher-power charger (5.3V/2A) to finish charging.</p>" +
"<p class='note'>Have a phone instead of a TouchPad? There's no documented deep-rescue path here &mdash; try a different known-good charger and cable, let it sit for a few hours, and reach out to the <a href='#' onclick='wosaGoto(7); return false;'>Community (Step 7)</a> if it still won't wake up.</p>",
options: [
{
label: "It powered on",
content: "<p>Good news &mdash; now go run a Doctor.</p>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(3)'>Continue to Step 3 &rarr;</button></p>"
},
{
label: "Still nothing after about a week",
next: {
q: "Try some button combinations before assuming the worst:",
info: "<ul>" +
"<li>Power alone, 30 seconds</li>" +
"<li>Power + Home, 30 seconds</li>" +
"<li>Power, then rapidly press Home 15+ times</li>" +
"<li>Home, then rapidly press Power 15+ times</li>" +
"<li>Power + Home + Volume Up (or Down), 30 seconds</li>" +
"</ul>" +
"<p class='note'>Careful: Power + Volume Up alone boots into webOS recovery, not a rescue mode.</p>",
options: [
{
label: "It powered on",
content: "<p>Now go run a Doctor.</p>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(3)'>Continue to Step 3 &rarr;</button></p>"
},
{
label: "Still dead, or showing a white battery with a &lsquo;?&rsquo;",
content: "<p>That usually means the battery chip firmware itself is corrupted, and needs reflashing with a tool called <strong>TP Debrick</strong>. It runs from a bootable USB drive on a separate computer &mdash; that drive will be erased in the process, so back it up first.</p>" +
"<ul>" +
"<li>Read the <a href='https://forum.xda-developers.com/t/hp-touchpad-debrick-linux-live-cd.4189245/'>XDA thread</a> for background, or watch the <a href='https://www.youtube.com/watch?v=WKrXu99XvA0'>video walkthrough</a>.</li>" +
"<li>Download the <a href='https://drive.google.com/file/d/1XUJNWqvkfH6WwMi0cTDn99JB1pdf3q-y/view?usp=sharing'>TP Debrick v005 ISO</a> and write it to a USB drive (at least 1GB, will be erased) with <a href='https://unetbootin.github.io/'>UNetbootin</a>.</li>" +
"<li>Boot your computer from that USB drive (enable Legacy Boot / disable Secure Boot in the BIOS if needed) and follow the on-screen instructions. The password is <code>1234</code>.</li>" +
"<li>Reconnect the TouchPad to its original charger (5.3V/2A) afterward and give it another week.</li>" +
"</ul>" +
"<p>Still nothing after that? It's likely beyond what can be fixed remotely &mdash; worth asking the <a href='#' onclick='wosaGoto(7); return false;'>Community (Step 7)</a>, someone may have ideas.</p>"
}
]
}
}
]
}
}
]
};
/* Shared across Step 3 and Step 6, in this exact order, so a device
category picked in one step can be remembered and reused in the
other (see FILTER_STEP_IDS / the device filter chip in app.js). */
var DEVICE_CATEGORY_LABELS = [
"Older Phone: Pre, Pre Plus, Pixi, or Pixi Plus",
"Later Phone: Pre 2, Pre 3, or Veer",
"TouchPad 10&quot; (WiFi or 4G)",
"TouchPad Go 7&quot; (4G)"
];
var DEVICE_CATEGORY_SHORT = [
"Older Phone",
"Later Phone",
"TouchPad 10&quot;",
"TouchPad Go"
];
var DEVICE_CATEGORY_ICONS = [
"DeviceIcons/ml-pre-small.png",
"DeviceIcons/ml-pre3-small.png",
"DeviceIcons/ml-touchpad-small.png",
"DeviceIcons/ml-touchpad-go.png"
];
var FILTER_STEP_IDS = [3, 6];
/* Steps whose node.options is a function that reads the device filter
(see STEP4_NODE below) rather than steps that ask the category
question itself. Their answers must be invalidated whenever the
filter changes -- otherwise a stale numeric index could silently
point at the wrong option once the filtered list re-shuffles. */
var FILTER_DEPENDENT_STEP_IDS = [4];
function wosaDeviceIconLabel(i) {
return "<img class='device-icon' src='" + DEVICE_CATEGORY_ICONS[i] + "' alt=''>" + DEVICE_CATEGORY_LABELS[i];
}
var STEP3_RESET_PLACEHOLDER = "<div class='callout'>If your device is currently usable, consider doing an app inventory before you reset or upgrade it &mdash; you might be carrying apps the archive is still missing. See <a href='#' onclick='wosaGoto(7); return false;'>Contribute to the Archive (Step 7)</a> for how.</div>" +
"<p>Doctor instructions (with the right file for your specific device and carrier) are coming soon here. In the meantime, see the <a href='https://archive.org/details/webOSDoctors'>archived webOS Doctors</a> and their readme to find the right file, then run it the same way as deviceTool: <code>java -jar NAMEOFDOCTOR.jar</code>.</p>";
var STEP3_NODE = {
q: "Which best describes your device?",
options: [
{
label: wosaDeviceIconLabel(0),
next: {
q: "What do you need to do?",
options: [
{
label: "Just activate it (it boots fine, just stuck at setup)",
content: "<p><button type='button' class='continue-btn' onclick='wosaGoto(4)'>Continue to Step 4 &rarr;</button></p>"
},
{
label: "Reset it to stock / wipe it",
content: STEP3_RESET_PLACEHOLDER
}
]
}
},
{
label: wosaDeviceIconLabel(1),
next: {
q: "What do you need to do?",
options: [
{
label: "Just activate it (it boots fine, just stuck at setup)",
content: "<p><button type='button' class='continue-btn' onclick='wosaGoto(4)'>Continue to Step 4 &rarr;</button></p>"
},
{
label: "Reset or upgrade it",
content: STEP3_RESET_PLACEHOLDER
}
]
}
},
{
label: wosaDeviceIconLabel(2),
next: {
q: "What do you need to do?",
options: [
{
label: "Just activate it (it boots fine, just stuck at setup)",
content: "<p><button type='button' class='continue-btn' onclick='wosaGoto(4)'>Continue to Step 4 &rarr;</button></p>"
},
{
label: "Reset it to stock",
content: STEP3_RESET_PLACEHOLDER
},
{
label: "Upgrade to webOS 3.1.0 Community Edition",
content: "<p class='note'>This replaces Steps 4 and 5 entirely &mdash; the Community Edition doctor leaves the device activated and ready to use.</p>" + STEP3_RESET_PLACEHOLDER
}
]
}
},
{
label: wosaDeviceIconLabel(3),
next: {
q: "What do you need to do?",
options: [
{
label: "Just activate it (it boots fine, just stuck at setup)",
content: "<p><button type='button' class='continue-btn' onclick='wosaGoto(4)'>Continue to Step 4 &rarr;</button></p>"
},
{
label: "Reset it to stock",
content: STEP3_RESET_PLACEHOLDER
}
]
}
}
]
};
var STEP4_RUN_TOOL_NODE = {
q: "Now run deviceTool from your computer.",
info: "<p>Make sure <a href='#' onclick='wosaGoto(1); return false;'>Step 1</a> (Java + drivers) is done first.</p>" +
"<ul>" +
"<li>Download <a href='http://www.webosarchive.org/activation/devicetool/devicetoolAIO.jar'>devicetoolAIO.jar</a>.</li>" +
"<li>From a command line, navigate to the folder you downloaded it to.</li>" +
"<li>Run: <code>java -jar devicetoolAIO.jar</code></li>" +
"<li>Wait while it updates and reboots your device &mdash; this can take a few minutes.</li>" +
"</ul>" +
"<p class='note'>If it doesn't detect your device, the novacom driver probably isn't working &mdash; double check <a href='#' onclick='wosaGoto(1); return false;'>Step 1</a>.</p>",
options: [
{
label: "It finished and rebooted",
content: "<p>Once it restarts, join your WiFi network using the built-in Settings &mdash; webOS works with 2.4GHz networks and common security types, including WPA.</p>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(5)'>Continue to Step 5 &rarr;</button></p>"
}
]
};
var STEP4_OPT_BATTERY_PHONE = {
label: "Phone with a removable battery (Pre, Pre Plus, Pixi, Pixi Plus, Pre 2, Pre 3)",
content: "<ol>" +
"<li>Unplug the USB cable from the device end (leave it plugged into your computer).</li>" +
"<li>Remove the battery.</li>" +
"<li>Hold down the Volume Up button.</li>" +
"<li>Plug the USB cable into the device.</li>" +
"<li>Reinsert the battery.</li>" +
"<li>Release Volume Up.</li>" +
"</ol>",
next: STEP4_RUN_TOOL_NODE
};
var STEP4_OPT_BROKEN_COVER = {
label: "Phone where I can't or don't want to remove the fragile cover (eg: Pre3)",
content: "<p class='note'>Especially common on the Pre3 &mdash; its back cover cracks easily once removed, which destroys wireless (Touchstone) charging. If yours won't come off cleanly, don't force it; use this instead.</p>" +
"<ol>" +
"<li>Hold down the Power button.</li>" +
"<li>While still holding Power, toggle the mute switch off, then on, three times in a row. This forces a reboot.</li>" +
"<li>As soon as it restarts, release Power and hold Volume Up.</li>" +
"<li>Keep holding Volume Up until you see the USB symbol.</li>" +
"</ol>",
next: STEP4_RUN_TOOL_NODE
};
var STEP4_OPT_TOUCHPAD_VEER = {
label: "TouchPad or Veer (no removable battery)",
content: "<ol>" +
"<li>Reboot the device &mdash; on TouchPad, hold Home + Power to force a reboot and keep holding; on Veer, power off completely, wait a few seconds, then press and hold Power to turn it back on.</li>" +
"<li>As soon as it restarts, release Power (and Home, on TouchPad) and hold Volume Up.</li>" +
"<li>Keep holding Volume Up until you see the USB symbol.</li>" +
"</ol>",
next: STEP4_RUN_TOOL_NODE
};
var STEP4_NODE = {
q: "First, get your device into recovery mode so deviceTool can see it.",
info: "<p>Connect a good quality micro-USB cable directly between your device and computer &mdash; not through a hub. (OEM cables are recognizable by a small silver indented circle near the connector.)</p>",
/* Options narrow based on the remembered device filter (see
FILTER_STEP_IDS): an Older Phone always has a plain removable
back/battery, so the broken-cover variant only makes sense for
Later Phones (Pre 2/Pre 3) -- and neither phone option applies
to a TouchPad or Veer. With no filter set, show everything. */
options: function () {
var filter = (typeof wosaState !== "undefined") ? wosaState.deviceFilter : null;
if (filter === 0) {
return [STEP4_OPT_BATTERY_PHONE];
}
if (filter === 2 || filter === 3) {
return [STEP4_OPT_TOUCHPAD_VEER];
}
/* Later Phone (1), or no filter set at all. */
return [STEP4_OPT_BATTERY_PHONE, STEP4_OPT_BROKEN_COVER, STEP4_OPT_TOUCHPAD_VEER];
}
};
var STEP5_WOSQI_NODE = {
q: "Install WOSQI, Preware, and an App Store.",
info: "<ul>" +
"<li>Download <a href='http://www.webosarchive.org/activation/webOSQuickInstall-4.6.0.jar'>webOS Quick Install (WOSQI) 4.6.0</a> and run it: <code>java -jar webOSQuickInstall-4.6.0.jar</code> (double-clicking the jar also works in some environments). With your device plugged in normally (not USB Drive mode), WOSQI should see it.</li>" +
"<li>Download <a href='http://www.webosarchive.org/activation/org.webosinternals.preware_1.9.18_arm.ipk'>Preware 1.9.18</a>, drag it onto the WOSQI window (or use the + button), and press Install. This is the original homebrew app store and gives you access to almost everything else.</li>" +
"<li>Install an App Store the same way: <a href='https://appcatalog.webosarchive.org/?latest'>download the App Catalog or App Museum II</a> and drag it onto WOSQI. App Catalog is the restored original store (best for webOS 2.2.4/3.0.5+); App Museum II works on any Enyo-capable device, including LuneOS.</li>" +
"<li>webOS 1.x devices can skip WOSQI for the app store step &mdash; just open <a href='http://appcatalog.webosarchive.org'>appcatalog.webosarchive.org</a> in the built-in browser instead.</li>" +
"</ul>",
options: [
{
label: "Done &mdash; apps are installed on my device",
content: "<p>You won't need WOSQI or your computer again &mdash; from here on, just use Preware or App Museum II on the device itself, over WiFi.</p>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(6)'>Continue to Step 6 &rarr;</button></p>"
}
]
};
var STEP5_DEVMODE_NODE = {
q: "Which webOS version?",
options: [
{
label: "webOS 1.0 (original Pre)",
content: "<p>From the Launcher, start typing: <code>webos20090606</code>. Tap the Developer Mode icon that appears, and turn it On.</p>",
next: STEP5_WOSQI_NODE
},
{
label: "webOS 2.0 and later (Pre 2, Pre 3, Veer, TouchPad)",
content: "<p>Use \"Just Type\" on the Launcher and type: <code>upupdowndownleftrightleftrightbastart</code>. Tap the Developer Mode icon that appears and turn it On. When prompted for a password, just hit Enter.</p>",
next: STEP5_WOSQI_NODE
}
]
};
var STEP5_NODE = {
q: "Did your device just finish Step 4 (deviceTool)?",
options: [
{
label: "Yes",
content: "<p>Good &mdash; deviceTool already enables homebrew installs, so there's nothing extra to turn on.</p>",
next: STEP5_WOSQI_NODE
},
{
label: "No, it was already activated and working",
content: "<p>You'll need to turn on Developer Mode first, to allow homebrew app installs.</p>",
next: STEP5_DEVMODE_NODE
}
]
};
var STEP6_NODE = {
q: "Which best describes your device?",
options: [
{
label: wosaDeviceIconLabel(0),
content: "<p>webOS 1.x can't run the Modern TLS Updates, so you're mostly limited to plain HTTP &mdash; but there's still plenty to do.</p>" +
"<ul>" +
"<li>In Preware, search for <strong>Root Certs Update</strong> and install it &mdash; this fixes the out-of-date certificate trust store.</li>" +
"<li>Install the <a href='http://www.webosarchive.org/activation/org.webosinternals.openssl-updater_0.9.8-6_armv7.ipk'>OpenSSL Updater</a> via WOSQI &mdash; it won't get you to the modern web, but it widens what still connects over HTTPS.</li>" +
"<li>For what's left over plain HTTP, DuckDuckGo Lite, <a href='http://68k.news/'>68k.news</a>, and <a href='http://www.frogfind.com/'>FrogFind</a> are good starting points.</li>" +
"<li>Install the <a href='http://appcatalog.webosarchive.org/app/ClassicEmulator'>Classic Emulator</a> for a huge catalog of vintage PalmOS apps and games.</li>" +
"</ul>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(7)'>Continue to Step 7 &rarr;</button></p>"
},
{
label: wosaDeviceIconLabel(1),
content: "<p>On webOS 2.2.4, your phone can speak modern TLS natively &mdash; no proxy or certificate juggling.</p>" +
"<ul>" +
"<li>Still on 2.2.0 or 2.1.0? Upgrade to 2.2.4 first with a Super Doctor &mdash; see <a href='#' onclick='wosaGoto(3); return false;'>Step 3</a>.</li>" +
"<li>In Preware, add the modernize feed if you don't already have it: <code>http://stacks.webosarchive.org/feeds/modernize/ipkgs/</code> (turn on Compressed/gzip), then choose Update Feeds.</li>" +
"<li>Search for <strong>TLS 1.3 Updates (Phones)</strong> and install it, confirming any prerequisites Preware offers. This covers the browser, apps, mail, curl, the download manager, current root certificates, automatic clock sync, and the restored App Catalog.</li>" +
"<li>The stock browser is dated. On a Pre3, search Preware for <strong>WebBrowser</strong> (nizovn's homebrew browser) for better rendering.</li>" +
"</ul>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(7)'>Continue to Step 7 &rarr;</button></p>"
},
{
label: wosaDeviceIconLabel(2),
content: "<p>Your TouchPad can speak modern TLS natively.</p>" +
"<ul>" +
"<li>In Preware, add the modernize feed if needed: <code>http://stacks.webosarchive.org/feeds/modernize/ipkgs/</code> (Compressed/gzip on), then Update Feeds.</li>" +
"<li>Search for <strong>TLS 1.3 Updates (TouchPad)</strong> and install it. This covers browser/app/mail/curl/download-manager TLS, current root certs, automatic clock sync, the restored App Catalog, plus the restored on-device Help, USB Settings, and Bluetooth gamepad support.</li>" +
"<li>Search Preware for <strong>Atlas</strong> and install it &mdash; a genuinely modern browser engine for pages the stock browser can't render.</li>" +
"</ul>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(7)'>Continue to Step 7 &rarr;</button></p>"
},
{
label: wosaDeviceIconLabel(3),
content: "<p>Your TouchPad Go can speak modern TLS natively, same as the 10&quot; TouchPad.</p>" +
"<ul>" +
"<li>In Preware, add the modernize feed if needed: <code>http://stacks.webosarchive.org/feeds/modernize/ipkgs/</code> (Compressed/gzip on), then Update Feeds.</li>" +
"<li>Search for <strong>TLS 1.3 Updates (TouchPad)</strong> and install it &mdash; the same package covers both TouchPad sizes.</li>" +
"<li>Search Preware for <strong>Atlas</strong> and install it for modern browser rendering.</li>" +
"</ul>" +
"<p><button type='button' class='continue-btn' onclick='wosaGoto(7)'>Continue to Step 7 &rarr;</button></p>"
}
]
};
var STEP7_NODE = {
topics: [
{
label: "Websites &amp; Browsing",
content: "<p>More and more websites are moving to newer encryption over HTTPS as the only way in. On webOS 2.2.4 and above, the <a href='#' onclick='wosaGoto(6); return false;'>Modern TLS Updates</a> solve this outright; on older devices you're more limited. Here are some common sites that still work, or ways to work around the ones that don't:</p>" +
"<p><strong>Google</strong>'s website no longer works. Try <a href='https://duckduckgo.com/html'>DuckDuckGo Lite</a> instead.</p>" +
"<p><strong>YouTube</strong>'s website no longer works, but there's an app for that called MeTube (see Games &amp; Apps below), or you can try a retro-friendly <a href='https://invidious.io/'>Invidious</a> provider.</p>" +
"<p><img src='images/reddit.png' align='right' style='padding-left: 8px'><strong>Reddit</strong> still works once your device can reach HTTPS, via <a href='http://old.reddit.com'>old.reddit.com</a> or the excellent IAmA Reddit app. Reddit videos can also be watched in MeTube.</p>" +
"<p><strong>Wikipedia</strong> works great once you have HTTPS. For older devices, webOS Archive provides a &ldquo;tiny&rdquo; version at <a href='http://wikipedia.webosarchive.org'>wikipedia.webosarchive.org</a>.</p>" +
"<p><strong>RSS:</strong> many sites can be reached through their RSS feed using the FeedSpider app, and a free service like <a href='http://www.inoreader.com'>InoReader</a>.</p>" +
"<p><strong>Google News:</strong> retro-computer enthusiast Action Retro built an excellent text-only Google News web app that works on almost anything &mdash; check out <a href='http://68k.news/'>68k.news</a>.</p>" +
"<p><strong>Text-Only Web:</strong> many popular sites have a text-only version that works well on retro devices. Sijmen J. Mulder keeps a good list at <a href='http://sjmulder.nl/en/textonly.html'>sjmulder.nl/en/textonly.html</a>.</p>" +
"<p><strong>FrogFind:</strong> also by Action Retro, is a <a href='http://www.frogfind.com/'>search engine for older devices</a> that renders a simplified version of most sites in its results.</p>" +
"<p>For anything else, <a href='https://github.com/tenox7/wrp'>Web Rendering Proxy (WRP)</a> uses Chrome on a PC you run yourself to render pages as images, sidestepping SSL/JS/HTML issues entirely &mdash; no video or interactive content, but a lot of the modern web becomes viewable.</p>"
},
{
label: "Email, Calendars &amp; Contacts",
content: "<img src='images/touchpad-pim.png' align='right' width='300' style='width:300px; padding-left: 8px'>" +
"<p>webOS has a first-class email client (arguably the best Exchange client for any Linux) that still works in some cases. Success varies with the server infrastructure.</p>" +
"<p><strong>IMAP and POP mail</strong> still work, provided the server's encryption is compatible with webOS.</p>" +
"<p><strong>Exchange Web Access:</strong> private and hosted Exchange servers that provide EAS can still be used.</p>" +
"<p><strong>Office365:</strong> Microsoft has moved to modern authentication, including an OAuth sign-in page that can't be rendered on webOS. As a work-around, <a href='https://davmail.sourceforge.net/'>DavMail</a> lets you run a proxy on a PC or server using non-proprietary standards.</p>" +
"<p><strong>Gmail:</strong> add it as a plain IMAP account using a <a href='https://myaccount.google.com/apppasswords'>Google App Password</a> rather than your normal password (this requires 2-Step Verification).</p>" +
"<p><img src='images/zoho.png' align='right' width='128' style='width:128px; padding-left: 8px'><strong>Zoho</strong> provides a cost-effective, full-featured alternative to Office365 and Google, with support for custom domains and Exchange ActiveSync. It works perfectly with webOS, no hacks required &mdash; webOS Archive's top recommendation if you have a choice in mail providers.</p>" +
"<p><strong>iCloud:</strong> you may be able to get IMAP access to your iCloud inbox.</p>" +
"<p>The Calendar app on webOS is still one of the best out there, particularly on the TouchPad's extra screen real estate. <strong>Exchange Web Access</strong> works the same as mail; <strong>Zoho</strong> syncs via EAS too. For a one-way sync of a public calendar (Google, iCloud, Outlook.com, Canvas), install <strong>WebCal Sync</strong> from the App Museum.</p>" +
"<p><img src='images/caldav.png' align='right' width='128' style='width:128px; padding-left: 8px'>If you host your own calendar and contacts in a WebDAV-compatible service like ownCloud or NextCloud, the <strong>C+Dav</strong> app does a one-way or two-way sync.</p>"
},
{
label: "Games &amp; Apps",
content: "<img src='images/angrybirds.jpg' align='right' style='padding-left: 8px'>" +
"<p>webOS had a great library of games, and you don't have to worry about in-app-purchases and spyware &mdash; just great mobile classics, including offerings from big publishers like Gameloft and EA. You'll find plenty in the <a href='http://appcatalog.webosarchive.org/showMuseum.php?category=Games&count=1030'>games section of the App Museum</a>, including Angry Birds, SCUMMVM, The Sims 3, Snes9X EX, Assassin's Creed, Oregon Trail, and Miriel.</p>" +
"<p><img src='images/metube-icon.png' align='right' style='padding-left: 8px'><strong>Watch (Some) Videos:</strong> YouTube doesn't officially support webOS, but thanks to the open source community it's still available &mdash; MeTube fetches short YouTube videos on demand. FlixNet plays Public Domain movies from archive.org, and Plex for webOS streams from your own server (no transcoding, so only natively-supported formats).</p>" +
"<p><img src='images/retropodcasts.png'></p>" +
"<p><strong>Podcasts:</strong> a TouchPad in Touchstone with a Bluetooth speaker, or a little Pre or Veer in your pocket, makes a great podcast player. The webOS Archive <a href='http://podcasts.webosarchive.org'>Podcast Directory</a> solves the HTTPS problem many podcasts now require.</p>" +
"<p><img src='images/LampsPrePhoto.png' style='width:300px'></p>" +
"<p><strong>The Ultimate Night Stand App:</strong> Philips Hue lights are some of the best smart bulbs out there, and a little Pre or Veer &mdash; or even a TouchPad &mdash; makes a great companion, letting you control them in a dark room without a smart speaker listening to you sleep. <strong>One Night Stand</strong> turns your device into a light controller with a tap.</p>" +
"<p><strong>Rock Out:</strong> Pandora and third-party Pandora apps still work. On TouchPad, <strong>Retune</strong> remote-controls Apple Music/iTunes, including HomePods and AppleTVs.</p>" +
"<p><img src='images/kindle.png' align='right' style='padding-left: 8px'><strong>Read a Book:</strong> the TouchPad makes a great reading device. Amazon's <strong>Kindle Beta</strong> app is fully functional &mdash; watch for a One-Time Password on your second login attempt. <strong>Papyrus eReader</strong> is a modern take on DRM-free ePub reading, derived from the Kindle app and an older indie project.</p>" +
"<p><strong>Be an Exhibitionist:</strong> webOS 2.0 and up have an Exhibition mode that shows content continuously while docked &mdash; a photo slideshow, or Accuweather's gorgeous weather Exhibition.</p>" +
"<p><strong>Remote Control:</strong> the App Museum has apps for remotely controlling Windows, Mac and Linux machines via Splashtop, Remote Desktop, or VNC, plus Roku and iTunes remotes.</p>" +
"<p><img src='images/palm-logo.png' align='right' style='padding-left: 8px'><strong>Classic:</strong> the Classic Emulator gives you access to a huge catalog of vintage PalmOS apps and games. Install Classic Emulator from the App Museum, plus (webOS 2.0+) Classic Container via WOSQI. It expires weekly &mdash; run it in Airplane Mode, and when it expires, delete <code>/usr/lib/palmos/expired.rgba</code> from a shell to re-arm it.</p>" +
"<p><strong>Make Something New:</strong> webOS is an easy platform to learn to develop on, especially with modern AI tools. See <a href='#' onclick='wosaGoto(8); return false;'>Dev &amp; Hack (Step 8)</a> to get started.</p>"
},
{
label: "Join the Community",
content: "<img src='images/discord.png' align='right' style='padding-left: 8px'>" +
"<p>There's still an active webOS community, swapping notes on devices and patches, and even building new apps.</p>" +
"<p><strong>Discord + SimpleChat:</strong> the most active community of webOS users is on a modern webOS app called SimpleChat, which is also connected to a <a href='http://www.webosarchive.org/discord'>Discord server</a>. Join in the conversation from both old and new devices.</p>" +
"<p><img src='images/twitter.png' align='right' style='padding-left: 8px'><strong>Bluesky:</strong> webOS Archive has officially eXited Twitter, but you can follow along on <a href='https://bsky.app/profile/webosarchive.org'>Bluesky</a>.</p>" +
"<p><strong>Fediverse + RSS:</strong> webOS Archive is on <a href='https://palm.weboslives.eu/users/webosarchive'>Mastodon</a>, thanks to a community-hosted server, and also followable via RSS with FeedSpider.</p>" +
"<p><strong>Forums:</strong> the old webOS Nation forums have been archived by the Wayback Machine, with a handy shortcut at <a href='http://forums.webosarchive.org'>forums.webosarchive.org</a>. In 2023, the community started rebuilding at the <a href='https://forums.weboslives.eu/'>webOS Lives Forums</a>.</p>"
},
{
label: "Patches and Hacks",
content: "<img src='images/patch.png' align='right' width='128' style='width:128px; padding-left: 8px'>" +
"<p>webOS was an extremely customizable operating system, with community-created patches for a wide variety of modifications. Most patches can still be found in <a href='#' onclick='wosaGoto(5); return false;'>Preware</a> and should be installed from there, since they were created by contemporaneous developers.</p>" +
"<p>webOS Archive has produced a series of patches that hide dead pre-installed apps that stopped working after HP's servers shut down, for a tidier Launcher. These are meant to be installed with WOSQI from a PC, <em>not</em> from within Preware.</p>" +
"<p><strong>Hardware mods</strong> (advanced, requires micro-soldering): community member Alan Morford has guides to <a href='https://pivotce.com/2024/09/25/guide-converting-the-touchpads-micro-usb-port-to-usb-c/'>converting the TouchPad's micro-USB port to USB-C</a> and <a href='https://pivotce.com/2024/12/05/guide-create-an-original-barrel-charging-wire-for-your-hp-touchpad/'>building a warning-free charging cable</a>.</p>"
},
{
label: "Shell Access",
content: "<p>webOS may have a beautiful user interface and an easy JavaScript-based programming environment, but underneath it all is a powerful Linux-based operating system. Unlocking the command line lets you control your device in fun and helpful ways &mdash; no jailbreaking required, all from bits found in Preware.</p>" +
"<p><strong>On device:</strong> install <strong>Xecutah</strong> from Preware (confirm its prerequisites), then launch it from the Launcher. On TouchPad, tap the screen with three fingers to bring up the keyboard &mdash; tap again to hide it. The Tweaks app can reserve space for the keyboard so it doesn't keep scrolling out of view.</p>" +
"<p><strong>From a computer:</strong> the official Developer Tools give shell access over USB from a connected PC or Mac. The Homebrew community has also built and published an OpenSSH server, installable from Preware.</p>"
},
{
label: "Contribute to the Archive",
content: "<img src='images/appscanner.png' align='right' style='padding-left: 8px'>" +
"<p>Many apps are still missing from the Museum. If you have a device with apps that might be unique, follow these steps to pull an inventory, so we can check for anything the archive needs.</p>" +
"<p>Once you have Preware on your device, the easiest way is to install <strong>App Scanner</strong> from the App Catalog or App Museum II &mdash; it automatically inventories your device and compares against the list of missing apps.</p>" +
"<p>Or do it manually: with Java and novacom set up (<a href='#' onclick='wosaGoto(1); return false;'>Step 1</a>), connect your device (stay in regular mode, not USB Drive mode) and run <code>java -jar webos-tools.jar palm-log -l</code> (Windows) or <code>java -jar ./webos-tools.jar palm-log -l</code> (Mac/Linux) to get a full list of installed apps.</p>" +
"<p>Share the list in the Community section above &mdash; if anything's unique, you can back it up over a shell with <code>cp -R /media/cryptofs/apps/usr/palm/applications/&lt;app-id&gt; /media/internal</code>, then copy it off in USB Drive mode.</p>"
}
],
after: "<p><button type='button' class='continue-btn' onclick='wosaGoto(8)'>Continue to Step 8 &rarr;</button></p>"
};
var STEP8_NODE = {
topics: [
{
label: "SDK &amp; PDK",
content: "<p>webOS apps are built in JavaScript (the <strong>SDK</strong>: Mojo on older devices, Enyo from webOS 2.0 on, with NodeJS-backed Luna services); performance-critical code (mostly games and media) used the <strong>PDK</strong>, C/C++ with more direct hardware access.</p>" +
"<ul>" +
"<li>Developer Mode is covered in <a href='#' onclick='wosaGoto(5); return false;'>Step 5</a> if you haven't turned it on yet.</li>" +
"<li><a href='http://sdk.webosarchive.org'>sdk.webosarchive.org</a> has the restored SDK/PDK, documentation, and emulator downloads.</li>" +
"<li>webOS is easy to learn on, especially with modern AI tools &mdash; if you can build (or vibe-code) a web page, you can build an app for webOS.</li>" +
"<li>The 2009 O'Reilly book <em>Palm webOS: The Insider's Guide</em> is free on <a href='https://books.google.com/books?id=sHT6PeMp1k8C&printsec=frontcover'>Google Books</a>. Tuts+ also has a still-useful <a href='https://web.archive.org/web/20140309041556/https://code.tutsplus.com/series/introduction-to-webos-sdk-development--mobile-22879'>5-part Mojo series</a>.</li>" +
"</ul>"
},
{
label: "webOS MCP (AI-Assisted Development)",
content: "<p><a href='https://github.com/webOSArchive/webos-mcp'>webos-mcp</a> is a Model Context Protocol server for webOS &mdash; it gives AI coding assistants direct access to webOS SDK docs and tooling, so they can actually help you build and debug webOS apps instead of guessing.</p>"
},
{
label: "Emulator",
content: "<p>webOS Archive repackaged the original SDK emulator as an OVA Virtual Appliance for current VirtualBox (and probably other virtualization tools). It emulates a TouchPad.</p>" +
"<ul>" +
"<li><a href='https://github.com/webOSArchive/webos-emulator/releases'>Download from GitHub</a>.</li>" +
"<li>Keyboard shortcuts simulate hardware: End = Launcher, Esc = back gesture, Home = minimize/maximize card, Left/Right = switch cards, F6&ndash;F9 = orientation.</li>" +
"<li>Not supported: audio, camera, Bluetooth, multi-touch, the gesture area, and <strong>HTTPS</strong> (the proxy-setting APIs aren't present in the emulated OS, and it's x86 so ARM-native PDK apps won't run).</li>" +
"<li>Preware needs its own <a href='http://www.webosarchive.org/activation'>i686 build</a> to run in the emulator.</li>" +
"</ul>"
}
],
after: "<p>That's the whole flow &mdash; thanks for exploring webOS.</p><p><a href='#' onclick='wosaReset(); return false;'>Start Over</a></p>"
};
var FLOW = [
{ id: 1, title: "Computer Setup", node: STEP1_NODE },
{ id: 2, title: "Is Your Device Healthy?", node: STEP2_NODE },
{ id: 3, title: "Identify Your Device", node: STEP3_NODE },
{ id: 4, title: "Activate", node: STEP4_NODE },
{ id: 5, title: "Install App Stores", node: STEP5_NODE },
{ id: 6, title: "What Your Device Can Do", node: STEP6_NODE },
{ id: 7, title: "Things to Try", node: STEP7_NODE },
{ id: 8, title: "Dev & Hack", node: STEP8_NODE }
];
Binary file not shown.

After

Width:  |  Height:  |  Size: 789 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

+42
View File
@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>webOS Help</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="style.css">
</head>
<body>
<div id="site-header">
<div class="content-inner">
<h1>webOS Help</h1>
<p class="tagline">Answer a few questions, get exactly the steps you need.</p>
</div>
</div>
<div id="controls">
<div class="content-inner">
<span class="link-group">
<a href="#" onclick="wosaExpandAll(); return false;">Expand all</a>
<a href="#" onclick="wosaCollapseAll(); return false;">Collapse all</a>
</span>
<a href="#" id="resetLink" onclick="wosaReset(); return false;">Start Over</a>
<div id="deviceFilterBar"><!-- device filter chip, filled in by app.js --></div>
</div>
</div>
<div id="wrap" class="content-inner">
<div id="app"><!-- step cards rendered here --></div>
</div>
<div id="site-footer">
<div class="content-inner">
<p>webOS Archive Help &middot; <a href="http://www.webosarchive.org">webosarchive.org</a></p>
</div>
</div>
<script src="flow-data.js"></script>
<script src="app.js"></script>
</body>
</html>
+452
View File
@@ -0,0 +1,452 @@
/* Styled after the Enyo 1 "Style Matters" sampler (sdk.webosarchive.org/enyo1sampler) --
gradient toolbar/header chrome, bold-caps blue divider labels with a hairline
rule, circular disclosure toggles, and flat edge-to-edge list rows instead of
boxed cards/buttons.
Still written to work on ancient WebKit (TouchPad 3.0.5, Pre3 2.1) as well as
modern browsers: no flexbox, no grid, no CSS variables, no rem units. */
/* keep any content image (Step 7/8 in particular) from overflowing a
narrow screen, whatever inline size it declares */
#app img {
max-width: 100%;
height: auto;
}
body {
margin: 0;
padding: 0;
background: #d7d7d5;
color: #333333;
font-family: Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 1.4;
}
/* Mobile-first: fluid, no cap, so Pre3 (480 wide) and anything narrower
fills its whole screen. Wider viewports get progressively more room,
breaking right at the Pre3 and TouchPad widths, capped before lines
get uncomfortably long on a desktop monitor.
.content-inner carries the width cap + centering and is reused inside
#site-header and #site-footer, so their text keeps the same margins
even though the header/footer bands themselves go full page width. */
.content-inner {
margin: 0 auto;
}
@media (min-width: 481px) {
.content-inner {
max-width: 760px;
}
}
@media (min-width: 1024px) {
.content-inner {
max-width: 1000px;
}
body {
font-size: 17px;
}
}
/* -- site header: mimics the Enyo gradient "Page Header" chrome -- */
#site-header {
padding: 14px 0 12px 0;
background-color: #d8d8d6;
background-image: -webkit-gradient(linear, left top, left bottom, from(#eeeeee), to(#c6c6c4));
background-image: -webkit-linear-gradient(top, #eeeeee, #c6c6c4);
background-image: linear-gradient(to bottom, #eeeeee, #c6c6c4);
border-bottom: 1px solid #a8a8a6;
}
#site-header .content-inner,
#controls .content-inner,
#site-footer .content-inner {
padding: 0 16px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
#site-header h1 {
font-size: 23px;
font-weight: normal;
color: #333333;
margin: 0 0 3px 0;
}
#site-header .tagline {
color: #5a5a5a;
margin: 0;
font-size: 14px;
}
#controls {
overflow: hidden;
padding: 10px 0;
background: #e3e3e1;
border-bottom: 1px solid #bbbbb9;
}
#controls .content-inner {
overflow: hidden;
}
.link-group {
float: left;
font-size: 13px;
}
.link-group a,
#resetLink {
color: #4a76a8;
text-decoration: none;
text-transform: uppercase;
font-weight: bold;
letter-spacing: 0.03em;
}
.link-group a {
margin-right: 16px;
}
#resetLink {
float: right;
font-size: 13px;
}
/* device filter chip: sits below the toggle/reset row, holds the
remembered device answer with its icon, and a link to remove it */
#deviceFilterBar {
clear: both;
}
.filter-chip {
display: inline-block;
margin-top: 10px;
padding: 6px 10px;
background: #e3ebf3;
border: 1px solid #b7c7d9;
-webkit-border-radius: 14px;
border-radius: 14px;
font-size: 13px;
color: #333333;
}
.filter-chip-icon {
max-height: 20px;
width: auto;
vertical-align: middle;
margin-right: 6px;
}
.filter-chip .filter-clear {
color: #4a76a8;
text-decoration: underline;
margin-left: 4px;
}
/* device icons on the Step 3 / Step 6 option rows */
.device-icon {
float: left;
max-height: 34px;
width: auto;
margin: 0 10px 4px 0;
}
#app {
padding: 10px 16px 16px 16px;
}
/* -- step cards: flat panels, gradient header bands like a toolbar -- */
.step-card {
background: #eeeeec;
border: 1px solid #b9b9b7;
margin-bottom: 14px;
}
.step-header {
padding: 12px 14px;
background-color: #d8d8d6;
background-image: -webkit-gradient(linear, left top, left bottom, from(#e9e9e7), to(#cccccb));
background-image: -webkit-linear-gradient(top, #e9e9e7, #cccccb);
background-image: linear-gradient(to bottom, #e9e9e7, #cccccb);
border-bottom: 1px solid #b9b9b7;
font-weight: bold;
font-size: 15px;
color: #333333;
}
/* every step header is clickable to collapse/expand its body --
right padding matches the base .step-header rule (14px), so the
disclosure icon sits a reasonable distance from the edge instead
of floating way inside it */
.step-header.clickable-header {
cursor: pointer;
overflow: hidden;
position: relative;
}
.step-header .summary-text {
font-weight: normal;
color: #555555;
}
/* disclosure toggle -- the actual Enyo "collapsible divider" arrow
icon (cropped from the Onyx theme's divider-arrow.png sprite in the
webOS SDK), not a Unicode glyph webOS's own browser may not have.
Height comes from the #app img rule above (auto, aspect-preserving). */
.disclosure {
float: right;
width: 28px;
margin-left: 8px;
margin-top: 3px;
}
.step-body {
padding: 14px;
}
/* -- question / option nodes -- */
.node-block {
margin-bottom: 4px;
}
/* question text styled like the sampler's bold-caps blue divider labels
with a hairline rule underneath */
.node-question {
font-weight: bold;
font-size: 15px;
color: #3a6288;
margin: 0 0 10px 0;
padding-bottom: 6px;
border-bottom: 1px solid #b7c7d9;
}
.node-info {
margin: 0 0 10px 0;
}
.node-info p {
margin: 0 0 8px 0;
}
.node-info .note,
.leaf-content .note {
color: #7a5a20;
font-style: italic;
margin: 0 0 8px 0;
}
/* noticeable callout box -- for a warning/tip that needs to stand out
without reading as a section header (see .node-question for that) */
.callout {
background: #fbf1dc;
border: 1px solid #d9b96c;
border-left: 4px solid #b8860b;
color: #5c4813;
padding: 10px 12px;
margin: 0 0 12px 0;
}
.callout a {
color: #4a76a8;
text-decoration: underline;
}
.opt-list {
margin: 0 0 4px 0;
border-top: 1px solid #c9d9ea;
}
/* option rows look like flat webOS list rows, not boxed buttons --
full width, disclosure chevron on the right. A light blue tint and
left accent bar mark them as tappable against the monotone gray
chrome, distinct from the settled look of .answered-summary. */
.opt-btn {
display: block;
width: 100%;
text-align: left;
padding: 12px 30px 12px 10px;
margin: 0;
background: #eaf3fb;
border: none;
border-left: 3px solid #7aa8d8;
border-bottom: 1px solid #c9d9ea;
-webkit-border-radius: 0;
border-radius: 0;
font-size: 15px;
color: #333333;
font-family: Helvetica, Arial, sans-serif;
cursor: pointer;
position: relative;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.opt-btn:active {
background: #cfe1f2;
}
/* the actual Enyo menu-item arrow icon, cropped from menuitem-arrow.png
in the webOS SDK, in place of a Unicode chevron. Height comes from
the #app img rule above (auto, aspect-preserving). */
.opt-btn .chevron {
float: right;
width: 10px;
margin-left: 8px;
margin-top: 4px;
}
/* primary "continue" action -- a rounded gradient button, like the
sampler's toolbar Back button, tinted with the accent blue */
.continue-btn {
display: inline-block;
padding: 9px 16px;
margin: 4px 0;
background-color: #5b90c4;
background-image: -webkit-gradient(linear, left top, left bottom, from(#7aa8d8), to(#4a7fb8));
background-image: -webkit-linear-gradient(top, #7aa8d8, #4a7fb8);
background-image: linear-gradient(to bottom, #7aa8d8, #4a7fb8);
color: #ffffff;
border: 1px solid #3a6699;
-webkit-border-radius: 5px;
border-radius: 5px;
font-size: 15px;
font-family: Helvetica, Arial, sans-serif;
cursor: pointer;
}
.continue-btn:active {
background-color: #3a6699;
background-image: none;
}
/* EXPERIMENTAL: entrance animation for content that appears after
answering a question, so it settles/reveals instead of snapping
into place. Plain CSS `animation` (not `transition`) so it plays on
insertion even though we render by replacing innerHTML wholesale --
no "before" DOM state needed. Caveat: since a render rebuilds every
step card, an already-open, unrelated step's content will also
replay this on any interaction elsewhere on the page. Fine if only
one step is open at a time; worth revisiting if "Expand all" makes
it feel noisy. */
@-webkit-keyframes wosaSettle {
from { background-color: #cfe9cf; }
to { background-color: #e9f5e9; }
}
@keyframes wosaSettle {
from { background-color: #cfe9cf; }
to { background-color: #e9f5e9; }
}
@-webkit-keyframes wosaReveal {
from { opacity: 0; -webkit-transform: translateY(6px); }
to { opacity: 1; -webkit-transform: translateY(0); }
}
@keyframes wosaReveal {
from { opacity: 0; transform: translateY(6px); }
to { opacity: 1; transform: translateY(0); }
}
/* pale green marks a confirmed choice, distinct from the blue "you can
pick this" tint on .opt-btn -- blue means pending, green means settled */
.answered-summary {
padding: 10px 14px 10px 10px;
background: #e9f5e9;
border-left: 3px solid #6faa74;
border-bottom: 1px solid #cfe4cf;
margin-bottom: 8px;
cursor: pointer;
overflow: hidden;
position: relative;
-webkit-animation: wosaSettle 300ms ease-out;
animation: wosaSettle 300ms ease-out;
}
/* text hint, not the expander icon -- reopening an answer to change it
is a different action from collapsing/expanding a step */
.change-hint {
float: right;
color: #4a76a8;
font-size: 12px;
text-decoration: underline;
margin-left: 8px;
}
.leaf-content {
padding: 2px 4px 10px 4px;
margin: 0 0 8px 0;
-webkit-animation: wosaReveal 200ms ease-out both;
animation: wosaReveal 200ms ease-out both;
}
.leaf-content p {
margin: 0 0 8px 0;
}
.leaf-content ul,
.leaf-content ol,
.node-info ul,
.node-info ol {
margin: 0 0 10px 0;
padding-left: 22px;
}
.leaf-content li,
.node-info li {
margin-bottom: 6px;
}
.leaf-content a,
.node-info a,
#site-footer a {
color: #4a76a8;
text-decoration: underline;
}
code {
font-family: monospace;
font-size: 13px;
background: #dde3e8;
padding: 1px 4px;
-webkit-border-radius: 3px;
border-radius: 3px;
}
pre {
background: #dde3e8;
padding: 8px;
margin: 0 0 10px 0;
white-space: pre-wrap;
word-wrap: break-word;
-webkit-border-radius: 3px;
border-radius: 3px;
}
pre code {
background: none;
padding: 0;
}
/* nested sub-questions get a light indent so the hierarchy is visible,
and reveal slightly after the leaf-content above them (a small
cascade: answer settles, then the next question appears) */
.node-block .node-block {
margin-left: 4px;
-webkit-animation: wosaReveal 200ms ease-out 100ms both;
animation: wosaReveal 200ms ease-out 100ms both;
}
#site-footer {
margin-top: 4px;
padding: 14px 0;
background: #e3e3e1;
border-top: 1px solid #bbbbb9;
font-size: 12px;
color: #666666;
text-align: center;
}
+30
View File
@@ -0,0 +1,30 @@
For help flashing your device, please visit www.webosarchive.com
webosdoctorp100ewwbellmo.jar - Palm Pre on Bell Mobility to 1.4.5
webosdoctorp100ewwsprint.jar - Palm Pre on Sprint to 1.4.5
webosdoctorp100ueu-wr.jar - Palm Pre on O2 or Movistar to 1.4.5
webosdoctorp101ewwatt.jar - Palm Pre Plus on AT&T to 1.4.5
webosdoctorp101ewwverizonwireless-1.4.5.1.jar - Palm Pre Plus on Verizon to 1.4.5.1
webosdoctorp101ueu-wr.jar - Palm Pre Plus on O2, Movistar, SFR France to 2.1.0
webosdoctorp101ueude-wr.jar - Palm Pre Plus on Vodafone to 2.1.0
webosdoctorp102verizonwireless.jar - Palm Pre 2 on Verizon to 2.1.0
webosdoctorp121ewwatt.jar - Palm Pixi Plus on AT&T to 1.4.5
webosdoctorp121ewweu-wr.jar - Palm Pixi Plus on EU Carriers to 1.4.5
webosdoctorp121ewwverizonwireless.jar - Palm Pixi Plus on Verizon to 1.4.5
webosdoctorp121pixiplus-verizon-2.1.0.jar - Super Doctor Pixi Plus on Verizon to 2.2.1
webosdoctorp121pixiplus-att-2.1.0.jar - Super Doctor Pixi Plus on AT&T to 2.2.1
webosdoctorp160unaatt-2.2.4.jar - Super Doctor Veer on AT&T to 2.2.4
webosdoctorp160unawr-2.2.4.jar - Super Doctor Veer ROW Carriers to 2.2.4
webosdoctorp160unaatt-veer.jar - HP Veer on AT&T to 2.1.1
webosdoctorp160unawr.jar - HP Veer on EU Carriers to 2.1.1
webosdoctorp160unawr-2.2.4.jar - Super Doctor Veer on EU Carriers to 2.2.4
webosdoctorp200ewwsprint.jar - Palm Pixi on Sprint to 1.4.5
webosdoctorp224mantaatt-pre3.jar - HP Pre 3 on AT&T to 2.2.4
webosdoctorp224mantaverizon.jar - HP Pre 3 on Verizon to 2.2.4
webosdoctorp224mantawr.jar - HP Pre 3 Unlocked or EU/ROW Carriers to 2.2.4
webosdoctorp224pre2-verizon-2.2.4.jar - Super Doctor Pre2 on Verizon to 2.2.4
webosdoctorp224pre2wr.jar - Palm Pre 2 Unlocked or on SFR France, Rogers to 2.2.4
webosdoctorp305hstnhatt.jar - HP TouchPad 10" AT&T 3.0.5
webosdoctorp305hstnhwifi.jar - HP TouchPad 10" 16gb, 32gb, 64gb WiFi 3.0.5
webosdoctoropal3gatt-3.0.5.jar - HP TouchPad Go 7" ALL radios to 3.0.5
webosdoctorp310hstnh-ce-600070.jar - HP TouchPad 10" AT&T 3.1.0 Community Edition
webosdoctorp310hstnhatt-ce-600071.jar - HP TouchPad 10" 16gb, 32gb, 64gb WiFi 3.1.0 Community Edition