/* Aljaweea — footer "Cookie Preferences" link opens the Complianz banner.
* Original by Digency (19 Aug 2026); amended 8 Sep 2026, runbook 5.14:
* - e.preventDefault() so the href="#" no longer scrolls the page to the top;
* - calls Complianz's own cmplz_set_banner_status('show') and falls back to
* clicking the (hidden) Manage-consent button if that function is absent.
* Rollback: restore the original 12-line version recorded in the runbook. */
document.addEventListener('click', function (e) {
var link = e.target.closest('.cmplz-show-banner');
if (!link) { return; }
e.preventDefault();
if (typeof cmplz_set_banner_status === 'function') {
cmplz_set_banner_status('show');
} else {
document.querySelectorAll('.cmplz-manage-consent').forEach(function (btn) { btn.click(); });
}
});
Air Loom is an innovative addition to the world of free real-time flight tracking apps, offering aviation enthusiasts a more advanced and engaging experience than ever before. It is the next generation of three-dimensional flight tracking. It is set to rival traditional trackers like Flightradar24 and FlightAware.
This hobby project started a few months ago when the American private pilot and Aviation enthusiast Ben Limner decided to build a free app to track flights.
Convinced that existing flight apps couldn’t truly capture the three-dimensional “magic” of a plane’s path, Ben announced the app in a Reddit post (an American social news aggregation, web content rating forum, and social media platform where registered users submit content such as links, text posts, images, and videos) and frequently discussing it on Reddit communities like r/flying and r/ADSB.
He stated, “I wanted to see what all of the air traffic around me looked like in 3D. I was so curious what my local pattern looked like, and how busy the airspace seemed, so I went a little wild and made this toy I’m calling Air Loom”.
He highlighted that with this app, users can watch live air traffic create dynamic, interactive 3D visualisations. He added that allowing patterns to build over time makes cityscapes appear especially impressive. Also, users can filter the view to track the continental movements of their favourite fleets.
He explained that all data is sourced from free ADS-B feeds, so users are encouraged to contribute and help enrich the experience for everyone. According to his X account, the app has attracted 117,000 users over the past 90 days.
In a message addressed to Aljaweea, Ben said, “When I started this as a hobby project, I never imagined the response would be this overwhelming”, ، adding, “The volume of interest has been incredible, and honestly, a bit humbling. I want to thank Aeroplanes.live for providing the initial data that powered this platform. They run an amazing community-focused service for aviation enthusiasts”.
He revealed that he is working to secure a reliable commercial data provider for his passion project. There are many flight tracking applications that provide faster and more accurate updates than official channels regarding aircraft movements and locations, which can be valuable for rescue efforts in the event of an accident. So what makes this new tool special?
Sharm El Sheikh International Airport – Air Loom 3D Flight Tracking / Credit: Ben Limner – Objective Unclear / Licence: Copyrighted (Fair Use) (Modified)
Rotatable Models and Dynamic Terrain
Air Loom provides an immersive, three-dimensional visualisation of global air traffic, displaying insights beyond the traditional two-dimensional maps we are used to seeing. The platform features 3D terrain that can be viewed as mesh or satellite images. The aircraft models are also 3D, whilst being fully rotatable and tilt-enabled. Users can therefore observe real-time flight parameters, such as altitude, direction, and holding patterns, from any angle.
Demystifying Complex Airspace
Uniquely, Air Loom incorporates an airspace feature for US airports that displays Class B, C, and D controlled airspace as translucent cylinders, effectively showing the complex “upside-down wedding cake” structure. This 3D, real-time display reveals the complex aircraft navigation and interaction within these critical regulated zones, which is traditionally challenging to grasp from flat aeronautical charts alone.
How Could Air Loom Change Airspace Training?
Beyond visualisations, Air Loom could be an exceptional educational tool, particularly for flight and air traffic control training. Features such as the 60,000+ airport database allow trainees to visualise operations at nearly any global airstrip, while the Record and Playback Tracks function is crucial for detailed post-flight debriefing and the study of complex air traffic flow. The reception from global educators has been enthusiastic, endorsing the platform as a “game changer for teaching airspace”, which underlines its power to help students visualise invisible corridors and restricted zones, ultimately clarifying the rationale behind air route and altitude structuring.
Reno-Tahoe International Airport – Air Loom 3D Flight Tracking / Credit: Ben Limner – Objective Unclear / Licence: Copyrighted (Fair Use) (Modified)
From Vision to Vital Tool: Next Steps
This advanced visualisation capability is essential for regions like the Middle East, which serves as a vital global aviation hub requiring the highest level of training and technological development. But let’s not forget this is a very recent project. It was launched online in September 2025. Any serious use in both aviation education and the aviation industry would require further development.
MENA Data: A Call for Input
Ben Limner (Reddit username u/NoCompetition2044) (https://x.com/benlimner) welcomes user suggestions for website improvements, actively develops the project, shares frequent updates, and seeks feedback from the aviation and development communities. While all major global airports are included, airspace data for Middle Eastern airports is currently unavailable, but will be added as data becomes available. Middle Eastern professionals and enthusiasts can actually influence the tracker by contacting him on Reddit with their requests. We therefore encourage our Aljaweea readers to reach out and contribute towards the project.
Stay informed. Get the latest aviation and space news from the Arab world on WhatsApp and Telegram as soon as it is published, or subscribe to our newsletter for a weekly round-up. You can also add us to your preferred sources to see more of our stories in Google Search.
We use cookies to run this site, to measure readership and to show the advertising that funds our journalism. In your region, non-essential cookies stay off until you accept them. Accept all, deny all, or choose by category. You can change your choice at any time via the Cookie Preferences link at the bottom of every page.
Functional Always active
Needed for the site to work: your language, your cookie choice, form security and the WordPress session. Always active.
Preferences
Remember settings you have chosen so that you do not have to set them again on your next visit.
Statistics
Google Analytics, to see which articles are read, from where and on which devices. IP addresses are shortened before storage.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
Advertising served by Google AdSense, embedded videos and social-media buttons, and measurement pixels for our own posts on social platforms.
We use cookies to run this site, to measure readership and to show the advertising that funds our journalism. They are active unless you deny them here. You can change your choice at any time via the Cookie Preferences link at the bottom of every page.
Functional Always active
Needed for the site to work: your language, your cookie choice, form security and the WordPress session. Always active.
Preferences
Remember settings you have chosen so that you do not have to set them again on your next visit.
Statistics
Google Analytics, to see which articles are read, from where and on which devices. IP addresses are shortened before storage.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
Advertising served by Google AdSense, embedded videos and social-media buttons, and measurement pixels for our own posts on social platforms.
var molongui_authorship_byline_params = {"byline_modifiers_enabled":"","byline_prefix":"","byline_suffix":"","byline_separator":",\u00a0","byline_last_separator":"\u00a0and\u00a0","byline_link_title":"View all posts by","byline_link_class":"","byline_dom_tree":"","byline_dom_prepend":"","byline_dom_append":"","byline_decoder":"v3","byline_data_url":"https://aljaweea.com/wp-json/molongui-authorship/v1/bylines","byline_rest_nonce":""};
//# sourceURL=molongui-authorship-byline-js-extra
var tie = {"is_rtl":"","ajaxurl":"https://aljaweea.com/wp-admin/admin-ajax.php?lang=en","is_side_aside_light":"","is_taqyeem_active":"","is_sticky_video":"1","mobile_menu_top":"","mobile_menu_active":"area_1","mobile_menu_parent":"","lightbox_all":"true","lightbox_gallery":"true","lightbox_skin":"dark","lightbox_thumb":"horizontal","lightbox_arrows":"true","is_singular":"1","autoload_posts":"","reading_indicator":"true","lazyload":"","select_share":"","select_share_twitter":"true","select_share_facebook":"true","select_share_linkedin":"true","select_share_email":"true","facebook_app_id":"5303202981","twitter_username":"","responsive_tables":"true","ad_blocker_detector":"","sticky_behavior":"default","sticky_desktop":"true","sticky_mobile":"true","sticky_mobile_behavior":"default","ajax_loader":"\u003Cdiv class=\"loader-overlay\"\u003E\u003Cdiv class=\"spinner-circle\"\u003E\u003C/div\u003E\u003C/div\u003E","type_to_search":"1","lang_no_results":"Nothing Found","sticky_share_mobile":"","sticky_share_post":"","sticky_share_post_menu":""};
//# sourceURL=tie-scripts-js-extra
let cmplzBlockedContent = document.querySelector('.cmplz-blocked-content-notice');
if ( cmplzBlockedContent) {
cmplzBlockedContent.addEventListener('click', function(event) {
event.stopPropagation();
});
}
//# sourceURL=cmplz-cookiebanner-js-after
/* Accessibility quick fixes (WCAG 2.2 AA test, 27 Oct 2026). Safe to switch off.
1 skip link · 2 form autofill · 3 language switcher name · 4 dark-mode button name and state
5 mobile menu state and focus · 6 heading levels for screen readers · 7 author photos
8 form errors linked to fields · 9 "opens in a new tab" for screen readers · 10 main content area */
(function () {
var isAr = (document.documentElement.lang || '').toLowerCase().indexOf('ar') === 0;
var T = isAr
? { skip: 'تخطَّ إلى المحتوى الرئيسي', dark: 'الوضع المظلم', newTab: ' (يُفتح في علامة تبويب جديدة)' }
: { skip: 'Skip to main content', dark: 'Dark mode', newTab: ' (opens in a new tab)' };function visible(el) {
if (!el) { return false; }
var r = el.getBoundingClientRect(), s = getComputedStyle(el);
return r.width > 0 && r.height > 0 && s.visibility !== 'hidden' && s.display !== 'none' && r.right > 0 && r.left < window.innerWidth;
}function run() {
/* 1. Skip link (WCAG 2.4.1): jumps to the first block after the site header */
var header = document.getElementById('theme-header');
var target = header ? header.nextElementSibling : null;
while (target && (target.tagName === 'SCRIPT' || target.tagName === 'STYLE')) { target = target.nextElementSibling; }
if (target && !document.querySelector('.aj-skip-link')) {
if (!target.id) { target.id = 'aj-main'; }
if (!target.hasAttribute('tabindex')) { target.setAttribute('tabindex', '-1'); }
var a = document.createElement('a');
a.className = 'aj-skip-link';
a.href = '#' + target.id;
a.textContent = T.skip;
a.addEventListener('click', function () { setTimeout(function () { target.focus({ preventScroll: true }); }, 0); });
document.body.insertBefore(a, document.body.firstChild);
}/* 10. Main content area (WCAG 1.3.1): pages with none (the home pages) get one */
if (target && !document.querySelector('main, [role="main"]') && !target.querySelector('footer, #footer')) {
target.setAttribute('role', 'main');
}/* 2. Form autofill (WCAG 1.3.5) */
var inputs = document.querySelectorAll('form input');
for (var i = 0; i < inputs.length; i++) {
var el = inputs[i];
if (el.getAttribute('autocomplete')) { continue; }
var n = (el.name || '').toLowerCase();
var l = ((el.labels && el.labels[0] && el.labels[0].textContent) || el.getAttribute('aria-label') || el.placeholder || '').toLowerCase().trim();
var v = null;
if (el.type === 'email') { v = 'email'; }
else if (el.type === 'tel' || (/phone|هاتف|جوال/.test(l) && !/mail|بريد/.test(l))) { v = 'tel'; }
else if (/first_name/.test(n)) { v = 'given-name'; }
else if (/last_name/.test(n)) { v = 'family-name'; }
else if (el.type === 'text' && /^(name|full name|الاسم|الإسم)\b/.test(l)) { v = 'name'; }
else if (el.type === 'url') { v = 'url'; }
if (v) { el.setAttribute('autocomplete', v); }
}/* 3. Language switcher (WCAG 2.4.4, 3.1.2): name the target language in that language */
var sw = document.querySelectorAll('a.lang-toggle');
for (var s = 0; s < sw.length; s++) {
var toAr = /\/ar(\/|$)/.test(sw[s].getAttribute('href') || '');
var name = toAr ? 'العربية' : 'English';
sw[s].setAttribute('aria-label', name);
sw[s].setAttribute('title', name);
sw[s].setAttribute('lang', toAr ? 'ar' : 'en');
sw[s].setAttribute('hreflang', toAr ? 'ar' : 'en');
var ims = sw[s].querySelectorAll('img');
for (var k = 0; k < ims.length; k++) { ims[k].setAttribute('alt', ''); }
}/* 4. Dark-mode button (WCAG 4.1.2): clear name, behaves as a toggle button that reports on/off */
var skins = document.querySelectorAll('a.change-skin');
function isDark() { return document.documentElement.classList.contains('dark-skin'); }
function syncSkin() { for (var q = 0; q < skins.length; q++) { skins[q].setAttribute('aria-pressed', isDark() ? 'true' : 'false'); } }
for (var d = 0; d < skins.length; d++) {
skins[d].setAttribute('role', 'button');
skins[d].setAttribute('aria-label', T.dark);
skins[d].setAttribute('title', T.dark);
skins[d].addEventListener('click', function () { setTimeout(syncSkin, 300); });
skins[d].addEventListener('keydown', function (e) { if (e.key === ' ') { e.preventDefault(); this.click(); } });
}
syncSkin();/* 5. Mobile menu (WCAG 4.1.2, 2.4.3): report open/closed, move focus in on open and back on close */
var btn = document.getElementById('mobile-menu-icon');
var panel = document.querySelector('.side-aside');
if (btn && panel) {
btn.setAttribute('role', 'button');
btn.setAttribute('aria-expanded', 'false');
if (!panel.id) { panel.id = 'aj-mobile-menu'; }
btn.setAttribute('aria-controls', panel.id);
var check = function (moveFocus) {
setTimeout(function () {
var open = visible(panel);
btn.setAttribute('aria-expanded', open ? 'true' : 'false');
if (open && moveFocus) {
var first = panel.querySelector('a[href]:not(.close-side-aside), button');
if (first) { first.focus(); }
}
if (!open && moveFocus === 'back') { btn.focus(); }
}, 450);
};
btn.addEventListener('click', function () { check(true); });
var closers = panel.querySelectorAll('.close-side-aside');
for (var c = 0; c < closers.length; c++) { closers[c].addEventListener('click', function () { check('back'); }); }
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape' && btn.getAttribute('aria-expanded') === 'true') {
setTimeout(function () {
/* the theme closes the menu on Escape in English but not in Arabic */
var x = panel.querySelector('.close-side-aside');
if (visible(panel) && x) { x.click(); }
check('back');
}, 150);
}
});
}/* 6. Heading levels (WCAG 1.3.1): no jumps for screen readers; looks unchanged */
var hs = document.querySelectorAll('h1, h2, h3, h4, h5, h6');
var prev = 0, hasH1 = !!document.querySelector('h1');
for (var h = 0; h < hs.length; h++) {
if (!visible(hs[h]) && !hs[h].closest('.side-aside')) { continue; }
var lvl = parseInt(hs[h].tagName.charAt(1), 10);
var eff = lvl;
if (!hasH1 && prev === 0) { eff = 1; }
else if (prev && lvl > prev + 1) { eff = prev + 1; }
if (eff !== lvl) { hs[h].setAttribute('aria-level', String(eff)); }
prev = eff;
}/* 7. Author photos: describe a linked photo by the author's name (it is the link's name); otherwise decorative */
var boxes = document.querySelectorAll('.about-author, .author-box, .m-a-box, .molongui-author-box');
for (var b = 0; b < boxes.length; b++) {
var pics = boxes[b].querySelectorAll('img');
for (var p = 0; p < pics.length; p++) {
var lk = pics[p].closest('a[href]');
var who = '';
if (lk) {
var byline = document.querySelector('a.author-name[href="' + lk.getAttribute('href') + '"]');
var strong = boxes[b].querySelector('.m-a-box-bio strong, [itemprop="name"]');
who = ((byline && byline.textContent) || (strong && strong.textContent) || '').trim();
}
if (lk && !who) { continue; } /* name not found: keep the existing description so the link keeps a name */
pics[p].setAttribute('alt', who);
}
}/* 9. "Opens in a new tab" for screen-reader users (W3C technique G201) */
var blanks = document.querySelectorAll('a[target="_blank"]');
for (var t = 0; t < blanks.length; t++) {
if (blanks[t].querySelector('.aj-newtab')) { continue; }
var sr = document.createElement('span');
sr.className = 'screen-reader-text aj-newtab';
sr.textContent = T.newTab;
blanks[t].appendChild(sr);
if (blanks[t].hasAttribute('aria-label')) { blanks[t].setAttribute('aria-label', blanks[t].getAttribute('aria-label') + T.newTab); }
}
}/* 8. Form errors (WCAG 3.3.1): link each error message to its field when it appears */
function linkErrors(root) {
var errs = (root || document).querySelectorAll('.ff-el-group .error, .ff-el-group .text-danger');
for (var e = 0; e < errs.length; e++) {
var grp = errs[e].closest('.ff-el-group');
var field = grp ? grp.querySelector('input:not([type=hidden]), select, textarea') : null;
if (!field) { continue; }
if (!errs[e].id) { errs[e].id = 'aj-err-' + Math.random().toString(36).slice(2, 9); }
var ids = (field.getAttribute('aria-describedby') || '').split(' ').filter(Boolean);
if (ids.indexOf(errs[e].id) === -1) { ids.push(errs[e].id); field.setAttribute('aria-describedby', ids.join(' ')); }
}
}
function watchForms() {
var forms = document.querySelectorAll('form.frm-fluent-form');
if (!window.MutationObserver) { return; }
for (var f = 0; f < forms.length; f++) {
new MutationObserver(function () { linkErrors(); }).observe(forms[f], { childList: true, subtree: true });
}
}function start() { run(); watchForms(); }
if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', start); } else { start(); }
})();
/* Aljaweea newsletter form (form 10): on Arabic pages, pre-select the Arabic edition.
2 Nov 2026 (Claude, runbook 8.82). Decision D-05 asks for the page language to be pre-selected through
the WPML translation of the field's default value; WPML does not offer that value for translation,
so this is the flagged fallback. The stored values stay "English" / "العربية" for the FluentCRM tag routing.
Rollback: set this snippet to Draft (the Arabic page then pre-selects English). */
(function () {
function run() {
if (!/^ar/i.test(document.documentElement.lang || '')) { return; }
var radios = document.querySelectorAll('form.fluent_form_10 input[type="radio"][name="dropdown"]');
for (var i = 0; i < radios.length; i++) {
if (radios[i].value === 'العربية') { radios[i].checked = true; radios[i].dispatchEvent(new Event('change', { bubbles: true })); }
}
}
/* Runs whether or not the page has finished loading (Breeze may delay scripts). */
if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', run); } else { run(); }
})();
/* Aljaweea forms: let Fluent Forms show its own error messages.
2 Nov 2026 (Claude, runbook 8.86; finding V-1 of the 8.85 test). Without this, the browser's own email check
stops the form when an address has no "@" and shows the browser's pop-up in the browser's language (English on
Arabic pages for most visitors), so our message from the forms standard (1.4) never appears.
"novalidate" switches off only the browser's own check: Fluent Forms still checks every field in the browser
and again on the server, so a badly formed address is still refused - now with our wording, in the page language.
Rollback: set this snippet to Draft. */
(function () {
function run() {
var forms = document.querySelectorAll('form.frm-fluent-form');
for (var i = 0; i < forms.length; i++) { forms[i].setAttribute('novalidate', 'novalidate'); }
}
/* Runs whether or not the page has finished loading (Breeze may delay scripts). */
if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', run); } else { run(); }
})();
ai_front = {"insertion_before":"BEFORE","insertion_after":"AFTER","insertion_prepend":"PREPEND CONTENT","insertion_append":"APPEND CONTENT","insertion_replace_content":"REPLACE CONTENT","insertion_replace_element":"REPLACE ELEMENT","visible":"VISIBLE","hidden":"HIDDEN","fallback":"FALLBACK","automatically_placed":"Automatically placed by AdSense Auto ads code","cancel":"Cancel","use":"Use","add":"Add","parent":"Parent","cancel_element_selection":"Cancel element selection","select_parent_element":"Select parent element","css_selector":"CSS selector","use_current_selector":"Use current selector","element":"ELEMENT","path":"PATH","selector":"SELECTOR"};