|
| 1 | +<!doctype html> |
| 2 | + |
| 3 | +<html lang="en"> |
| 4 | +<head> |
| 5 | + <meta charset="utf-8"> |
| 6 | + <meta name="viewport" content="width=device-width, initial-scale=1"> |
| 7 | + |
| 8 | + <title>Olaki - A list of Android devices by compatible operating systems</title> |
| 9 | + <meta name="description" content="An aggregated list of Android devices by compatible operating systems."> |
| 10 | + <meta name="author" content="kedio-labs"> |
| 11 | + |
| 12 | + <meta property="og:title" content="Olaki - Aggregated list of Android devices by compatible operating systems"> |
| 13 | + <meta property="og:type" content="website"> |
| 14 | + <meta property="og:url" content="https://kedio-labs.github.io/olaki"> |
| 15 | + <meta property="og:description" content="An aggregated list of Android devices by compatible operating systems."> |
| 16 | + <style> |
| 17 | + :root { |
| 18 | + --body-backrgound-color: #ffff; |
| 19 | + --table-border: 1px solid black; |
| 20 | + --table-odd-row-backrgound-color: #d9b1ea; |
| 21 | + --table-even-row-backrgound-color: #e5e3e3; |
| 22 | + --appendix-code-backrgound-color: #d0d0d0; |
| 23 | + } |
| 24 | + |
| 25 | + html, body { |
| 26 | + font-family: sans-serif; |
| 27 | + font-size: 1em; |
| 28 | + color: #0c0c0c; |
| 29 | + background-color: var(--body-backrgound-color); |
| 30 | + padding: 0 10px 10px 10px; |
| 31 | + } |
| 32 | + |
| 33 | + #table-container { |
| 34 | + width: 1300px; |
| 35 | + } |
| 36 | + |
| 37 | + table { |
| 38 | + font-size: 0.95rem; |
| 39 | + border-top: var(--table-border); |
| 40 | + border-left: var(--table-border); |
| 41 | + border-spacing: 0; |
| 42 | + width: 100%; |
| 43 | + } |
| 44 | + |
| 45 | + /* attempt to target mobile devices */ |
| 46 | + @media (hover: none), (hover: on-demand) { |
| 47 | + #table-container { |
| 48 | + overflow: auto; |
| 49 | + height: 450px; |
| 50 | + } |
| 51 | + } |
| 52 | + |
| 53 | + th, td { |
| 54 | + padding: 10px 0; |
| 55 | + border-bottom: var(--table-border); |
| 56 | + border-right: var(--table-border); |
| 57 | + word-wrap: break-word; |
| 58 | + text-align: center; |
| 59 | + } |
| 60 | + |
| 61 | + th { |
| 62 | + /* safari */ |
| 63 | + position: -webkit-sticky; |
| 64 | + position: sticky; |
| 65 | + top: 0; |
| 66 | + background-color: var(--table-even-row-backrgound-color); |
| 67 | + z-index: 10; |
| 68 | + } |
| 69 | + |
| 70 | + /* device name column */ |
| 71 | + tr th:first-child, tr td:first-child { |
| 72 | + width: 160px; |
| 73 | + padding: 10px; |
| 74 | + } |
| 75 | + |
| 76 | + /* codename name column */ |
| 77 | + tr th:nth-child(2), tr td:nth-child(2) { |
| 78 | + width: 103px; |
| 79 | + } |
| 80 | + |
| 81 | + tbody tr:nth-child(odd) { |
| 82 | + background-color: var(--table-odd-row-backrgound-color); |
| 83 | + } |
| 84 | + |
| 85 | + tbody tr:nth-child(even) { |
| 86 | + background-color: var(--table-even-row-backrgound-color); |
| 87 | + } |
| 88 | + |
| 89 | + .back-to-top { |
| 90 | + margin-left: 10px; |
| 91 | + font-size: 0.85rem; |
| 92 | + } |
| 93 | + |
| 94 | + footer .code { |
| 95 | + background-color: var(--appendix-code-backrgound-color); |
| 96 | + width: 355px; |
| 97 | + padding: 5px 10px; |
| 98 | + line-height: 1.5rem; |
| 99 | + } |
| 100 | + |
| 101 | + h1, h2 { |
| 102 | + border-bottom: 1px solid #a2a9b1; |
| 103 | + } |
| 104 | + </style> |
| 105 | +</head> |
| 106 | + |
| 107 | +<body> |
| 108 | +<header> |
| 109 | + <h1>Welcome to Olaki.</h1> |
| 110 | + <p> |
| 111 | + An automatically generated list of Android devices by compatible operating systems. For each device, a link to the |
| 112 | + corresponding OS image or project page is provided. See the source code <a href="https://github.com/kedio-labs/olaki" |
| 113 | + target="_blank">here.</a> |
| 114 | + </p> |
| 115 | + <p> |
| 116 | + Sensible defaults are defined to try and only include <code>(device, OS)</code> pairs with high enough compatibility rates. |
| 117 | + See the <a href="#appendix-header">Appendix</a> for more details. |
| 118 | + </p> |
| 119 | + <p>Last update: <span id="last-update-date"></span>.</p> |
| 120 | + <p>Please <a href="https://github.com/kedio-labs/olaki" target="_blank">contribute</a> if you'd like to see other operating |
| 121 | + systems listed here. |
| 122 | + </p> |
| 123 | + <div class="contents-container"> |
| 124 | + <span class="contents">Contents:</span> |
| 125 | + <ul> |
| 126 | + <li><a href="#olaki-table-header">Table</a></li> |
| 127 | + <li><a href="#appendix-header">Appendix</a></li> |
| 128 | + <li><a href="#faq-header">F.A.Q.</a></li> |
| 129 | + </ul> |
| 130 | + </div> |
| 131 | +</header> |
| 132 | +<main> |
| 133 | + <h2 id="olaki-table-header">Table</h2> |
| 134 | + <p id="quick-table-stats"></p> |
| 135 | + <div id="table-container"> |
| 136 | + <table id="olaki-table"> |
| 137 | + <thead> |
| 138 | + <tr> |
| 139 | + <th>Device name</th> |
| 140 | + <th>Codename</th> |
| 141 | + <th class="os-column-header">crDroid</th> |
| 142 | + <th class="os-column-header">Murena</th> |
| 143 | + <th class="os-column-header">Kali<br>Linux</th> |
| 144 | + <th class="os-column-header">Lineage<br>OS</th> |
| 145 | + <th class="os-column-header">OmniROM</th> |
| 146 | + <th class="os-column-header">postmarket<br>OS</th> |
| 147 | + <th class="os-column-header">Ubuntu<br>Touch</th> |
| 148 | + <th class="os-column-header">Calyx<br>OS</th> |
| 149 | + <th class="os-column-header">Graphene<br>OS</th> |
| 150 | + </tr> |
| 151 | + </thead> |
| 152 | + <tbody> |
| 153 | + </tbody> |
| 154 | + </table> |
| 155 | + </div> |
| 156 | + <footer> |
| 157 | + <h2 id="appendix-header"><span>Appendix - Parameters used to build this table</span><span class="back-to-top">[ <a href="#">back to top</a> ]</span> |
| 158 | + </h2> |
| 159 | + <h3>crDroid</h3> |
| 160 | + <div class="code" id="crdroid-parameters"> |
| 161 | + N/A |
| 162 | + </div> |
| 163 | + <h3>Murena</h3> |
| 164 | + <div class="code" id="eos-parameters"></div> |
| 165 | + <h3>Kali Linux</h3> |
| 166 | + <div class="code" id="kali-parameters"></div> |
| 167 | + <h3>LineageOS</h3> |
| 168 | + <div class="code" id="lineageos-parameters"></div> |
| 169 | + <h3>OmniROM</h3> |
| 170 | + <div class="code" id="omnirom-parameters"></div> |
| 171 | + <h3>postmarketOS</h3> |
| 172 | + <div class="code" id="pmos-parameters"></div> |
| 173 | + <h3>Ubuntu Touch</h3> |
| 174 | + <div class="code" id="ubuntutouch-parameters"></div> |
| 175 | + <h2 id="faq-header"><span>F.A.Q.</span><span class="back-to-top">[ <a href="#">back to top</a> ]</span> |
| 176 | + </h2> |
| 177 | + <h3>Why should I install a custom OS on my Android device?</h3> |
| 178 | + <div> |
| 179 | + <span>You could benefit from some of the following</span> |
| 180 | + <ul> |
| 181 | + <li>Increase the lifespan of your device |
| 182 | + <ul> |
| 183 | + <li>Once your device's manufacturer stops providing OS updates, you may not be able to install apps that require a |
| 184 | + newer OS version. |
| 185 | + </li> |
| 186 | + <li>You phone may also not receive further security updates, which poses a risk.</li> |
| 187 | + </ul> |
| 188 | + </li> |
| 189 | + <li>Sustainability |
| 190 | + <ul> |
| 191 | + <li>Mining and manufacturing processes involved in making smartphones have a sizeable impact on the environment. Using |
| 192 | + them as long as practically possible helps reduce that impact. |
| 193 | + </li> |
| 194 | + </ul> |
| 195 | + </li> |
| 196 | + <li>Increased privacy |
| 197 | + <ul> |
| 198 | + <li>With most of the custom OSes listed above, you can unGoogle your smartphone. This means not having to install |
| 199 | + Google apps or services. |
| 200 | + </li> |
| 201 | + </ul> |
| 202 | + </li> |
| 203 | + <li>Repurpose your device |
| 204 | + <ul> |
| 205 | + <li>If your phone is not fitted to be used as such anymore, you can repurpose it as a small computer, a small gaming |
| 206 | + device, a glorified remote control for connected devices, etc. You can also achieve some of these without a custom |
| 207 | + OS if relevant apps are compatible with your Android OS version (i.e. it's not too old). |
| 208 | + </li> |
| 209 | + </ul> |
| 210 | + </li> |
| 211 | + </ul> |
| 212 | + </div> |
| 213 | + |
| 214 | + <h3>Is it easy to install a custom OS on my Android device?</h3> |
| 215 | + <p>Your mileage may vary. It will require learning about concepts such as rooting, bootloader, flashing, ROM, etc. Luckily, |
| 216 | + many people have been through this before so there is extensive documentation on the internet and the list above is aimed at |
| 217 | + providing <code>(device, os)</code> pairs with high compatibility rates.</p> |
| 218 | + <h3>Can you please add OS [XYZ] to the list?</h3> |
| 219 | + <p>Sounds like a plan. :) Please raise <a href="https://github.com/kedio-labs/olaki/issues" target="_blank">an issue</a> |
| 220 | + once you've |
| 221 | + confirmed it's not a duplicate or, if you have coding |
| 222 | + skills, raise <a href="https://github.com/kedio-labs/olaki/pulls" target="_blank">a PR!</a> |
| 223 | + </p> |
| 224 | + <h3>I have found a bug/inconsistency!</h3> |
| 225 | + <p>Well, thank you for spotting that! Please let us know by raising <a href="https://github.com/kedio-labs/olaki/issues" |
| 226 | + target="_blank">an |
| 227 | + issue</a> once you've |
| 228 | + confirmed it's not a duplicate or better still, raise <a href="https://github.com/kedio-labs/olaki/pulls" |
| 229 | + target="_blank">a PR</a> if |
| 230 | + that's possible. |
| 231 | + </p> |
| 232 | + <h3>I want to repurpose my phone as a headless single-board computer à la Raspberry Pi without installing a custom OS</h3> |
| 233 | + <p>There are several ways to achieve that. The easiest option is to install <a href="https://termux.com/" target="_blank">termux</a> |
| 234 | + if your smartphone OS version is not too old. And if you'd like to play with linux distros within termux, have a look at <a |
| 235 | + href="https://github.com/termux/proot-distro#supported-distributions" target="_blank">proot-distro.</a></p> |
| 236 | + <p>Another option is to check in the list above if your phone is compatible with postmarketOS, which is a flavour of Alpine. |
| 237 | + You can thus run many applications, including for self-hosting, as explored in <a |
| 238 | + href="https://blog.kedio.co/post/how-to-run-a-server-on-postmarketos" target="_blank">this blog post.</a></p> |
| 239 | + <p>If you'd like your phone to be always on, an important aspect to consider is how to run your phone without a battery. |
| 240 | + Manufacturers most likely don't design their phones with that in mind. See the question below for a quick tip.</p> |
| 241 | + <h3>How do I run my phone without a battery?</h3> |
| 242 | + <p>The easiest is to keep the battery and simply use a plug timer so that the phone is not constantly being charged.</p> |
| 243 | + <p>Alternatively, there are ways for some phones to remove the battery and simulate its presence so that the device still |
| 244 | + boots up and runs normally. This is a case-by-case basis though. Doing some research online for your specific device may |
| 245 | + give you pointers. For example, here is how to achieve <a |
| 246 | + href="https://blog.kedio.co/post/how-to-run-a-oneplus-6t-without-battery" target="_blank">a battery-less setup for OnePlus |
| 247 | + 6T devices.</a></p> |
| 248 | + </footer> |
| 249 | +</main> |
| 250 | + |
| 251 | +<script src="olaki-data.js"></script> |
| 252 | +<script> |
| 253 | + // |
| 254 | + // populate last updated timestamp |
| 255 | + // |
| 256 | + document.getElementById("last-update-date").innerText = new Date(olakiData.lastUpdated).toUTCString(); |
| 257 | + |
| 258 | + // |
| 259 | + // populate table |
| 260 | + // |
| 261 | + let numberOfDeviceToOsPairs = 0; |
| 262 | + const populateOsCell = (osCell, url, urlText) => { |
| 263 | + numberOfDeviceToOsPairs++; // mutating a variable outside this function. Sorry :p |
| 264 | + const link = getOsDownloadATag(url, urlText); |
| 265 | + osCell.append(link); |
| 266 | + }; |
| 267 | + const tbody = document.getElementById("olaki-table").getElementsByTagName("tbody")[0]; |
| 268 | + |
| 269 | + const getOsDownloadATag = (url, text) => { |
| 270 | + const link = document.createElement("a"); |
| 271 | + link.href = url; |
| 272 | + link.target = "_blank"; |
| 273 | + link.innerText = text; |
| 274 | + return link; |
| 275 | + }; |
| 276 | + |
| 277 | + for (const deviceSummary of olakiData.deviceSummaries) { |
| 278 | + const row = tbody.insertRow(); |
| 279 | + row.insertCell().append(deviceSummary.vendor + " " + deviceSummary.name); |
| 280 | + row.insertCell().append(deviceSummary.codename); |
| 281 | + |
| 282 | + let nextOsCell = row.insertCell(); |
| 283 | + if (deviceSummary.crdroid) { |
| 284 | + populateOsCell(nextOsCell, deviceSummary.crdroid.url, `version ${deviceSummary.crdroid.latestAvailableVersion}`); |
| 285 | + } |
| 286 | + |
| 287 | + nextOsCell = row.insertCell(); |
| 288 | + if (deviceSummary.eos) { |
| 289 | + populateOsCell(nextOsCell, deviceSummary.eos.url, deviceSummary.eos.maturity); |
| 290 | + } |
| 291 | + |
| 292 | + nextOsCell = row.insertCell(); |
| 293 | + if (deviceSummary.kali) { |
| 294 | + populateOsCell(nextOsCell, deviceSummary.kali.url, deviceSummary.kali.isStable ? "stable" : "latest"); |
| 295 | + } |
| 296 | + |
| 297 | + nextOsCell = row.insertCell(); |
| 298 | + if (deviceSummary.lineageos) { |
| 299 | + populateOsCell(nextOsCell, deviceSummary.lineageos.url, deviceSummary.lineageos.isMaintained ? "maintained" : "unmaintained"); |
| 300 | + } |
| 301 | + |
| 302 | + nextOsCell = row.insertCell(); |
| 303 | + if (deviceSummary.omnirom) { |
| 304 | + populateOsCell(nextOsCell, deviceSummary.omnirom.url, deviceSummary.omnirom.isOfficial ? "official" : "unofficial"); |
| 305 | + } |
| 306 | + |
| 307 | + nextOsCell = row.insertCell(); |
| 308 | + if (deviceSummary.pmos) { |
| 309 | + populateOsCell(nextOsCell, deviceSummary.pmos.url, deviceSummary.pmos.category); |
| 310 | + } |
| 311 | + |
| 312 | + nextOsCell = row.insertCell(); |
| 313 | + if (deviceSummary.ubuntutouch) { |
| 314 | + populateOsCell(nextOsCell, deviceSummary.ubuntutouch.url, deviceSummary.ubuntutouch.progress + "%"); |
| 315 | + } |
| 316 | + |
| 317 | + nextOsCell = row.insertCell(); |
| 318 | + if (deviceSummary.calyxos) { |
| 319 | + populateOsCell(nextOsCell, deviceSummary.calyxos.url, 'yes'); |
| 320 | + } |
| 321 | + |
| 322 | + nextOsCell = row.insertCell(); |
| 323 | + if (deviceSummary.grapheneos) { |
| 324 | + populateOsCell(nextOsCell, deviceSummary.grapheneos.url, 'yes'); |
| 325 | + } |
| 326 | + } |
| 327 | + |
| 328 | + // |
| 329 | + // populate table stats |
| 330 | + // |
| 331 | + document.getElementById("quick-table-stats").innerHTML = |
| 332 | + `Quick stats: ${Object.keys(olakiData.deviceSummaries).length} devices. ${document.getElementsByClassName("os-column-header").length} operating systems. ${numberOfDeviceToOsPairs} <code>(device, OS)</code> pairs available.`; |
| 333 | + |
| 334 | + |
| 335 | + // |
| 336 | + // populate appendix |
| 337 | + // |
| 338 | + const populateAppendixSectionForOS = (os) => document.getElementById(`${os}-parameters`).innerText = JSON.stringify(olakiData.appConfig[os], null, " "); |
| 339 | + |
| 340 | + populateAppendixSectionForOS("eos"); |
| 341 | + populateAppendixSectionForOS("kali"); |
| 342 | + populateAppendixSectionForOS("lineageos"); |
| 343 | + populateAppendixSectionForOS("omnirom"); |
| 344 | + populateAppendixSectionForOS("pmos"); |
| 345 | + populateAppendixSectionForOS("ubuntutouch"); |
| 346 | + // no need for an appendix section for CalyxOS |
| 347 | + // no need for an appendix section for GrapheneOS |
| 348 | + |
| 349 | +</script> |
| 350 | +</body> |
| 351 | +</html> |
0 commit comments