Brief reprieve for Tanzania's bloggers as court halts restrictive new rules

What you need to know:

Petitioners are asking the court to review these regulations on the basis of "ultra vires" - that is, the argument that the respective Minister acted outside his authority and that the new rules violate principles of natural justice. 

Dar es Salaam. The High Court in Mtwara Zone has issued a temporary injunction preventing the use of new online content regulations, which were set to come into effect on May 5. 

The court's decision, read early Friday (May 4), comes in the wake of a petition challenging the legality of the new regulations which was filed by six institutions on April 20 this year. 

Listed petitioners include the Legal and Human Rights Centre (LHRC), Tanzania Human Rights Defenders Coalition (THRDC), Media Council of Tanzania (MCT), Jamii Media, Tanzania Media Women’s Association (TAMWA) and Tanzania Editors Forum (TEF), according to TEF secretary Neville Meena.

“In the primary case, these institutions are asking the court to review (online) regulations," Meena told The Citizen's sister publication, Mwananchi early Friday. 

"We have lodged a case against the Minister for Information, Tanzania Communications Regulatory Authority (TCRA) and the Attorney General."

Petitioners are asking the court to review these regulations on the basis of "ultra vires" - that is, the argument that the respective Minister acted outside his authority and that the new rules violate principles of natural justice. 

These regulations are a contravention of freedom of expression, the right to be heard and the right of privacy, according to TEF's Meena. 

The primary case will be heard on May 10. 

* * If no #mcl-market-ticker element exists, the widget inserts itself right * after this var sel = thisScript && thisScript.getAttribute("data-target"); if (sel) { var t = document.querySelector(sel); if (t) return t; } // 2) A dedicated mount element the host page provides. var el = document.getElementById(CONFIG.targetId); if (el) return el; // 3) Fallback: insert right after this script tag. el = document.createElement("div"); el.id = CONFIG.targetId; if (thisScript && thisScript.parentNode) { thisScript.parentNode.insertBefore(el, thisScript.nextSibling); } else { document.body.appendChild(el); } return el; } // ---- Data pipeline (identical logic to the standalone banner) ------------ function apiUrl(path) { if (!path) return path; if (/^https?:\/\//i.test(path)) return path; return CONFIG.apiBase + (path.charAt(0) === "/" ? "" : "/") + path; } function toNum(v) { var n = parseFloat(String(v == null ? "" : v).replace(/,/g, "")); return isFinite(n) ? n : null; } function fmtNum(v) { var n = parseFloat(String(v).replace(/,/g, "")); if (!isFinite(n)) return String(v == null ? "" : v); var d = Math.abs(n) >= 1 ? 2 : 4; return n.toLocaleString("en-US", { minimumFractionDigits: d, maximumFractionDigits: d }); } function changeClass(d) { if (d == null || Math.abs(d) < 1e-9) return "flat"; return d > 0 ? "up" : "down"; } function arrow(d) { if (d == null || Math.abs(d) < 1e-9) return "▬"; return d > 0 ? "▲" : "▼"; } async function fetchFiles(category, count) { var res = await fetch(apiUrl("/api/files?category=" + category)); if (!res.ok) throw new Error("list " + category + " " + res.status); var list = await res.json(); return Array.isArray(list) ? list.slice(0, count || 1) : []; } async function parseSheet(meta) { var res = await fetch(apiUrl(meta.url)); if (!res.ok) throw new Error("download " + res.status); var buf = await res.arrayBuffer(); var wb = XLSX.read(buf, { type: "array" }); return XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], { defval: "" }); } function buildStocks(rows) { var items = []; rows.forEach(function (r) { var sym = r["Symbol"] || r["symbol"]; if (!sym) return; var close = toNum(r["Close"]); if (close == null) return; var prev = toNum(r["Prev Close"] || r["Previous Close"]); var delta = prev != null ? close - prev : null; var pct = (delta != null && prev) ? (delta / prev) * 100 : null; items.push({ sym: sym, val: fmtNum(close), delta: delta, pct: pct }); }); return items; } function buildForex(rows, prevRows) { var pmean = {}; (prevRows || []).forEach(function (r) { if (r["Currency"]) pmean[r["Currency"]] = toNum(r["Mean"]); }); var items = []; rows.forEach(function (r) { var cur = r["Currency"]; if (!cur) return; var mean = toNum(r["Mean"]), buy = toNum(r["Buying"]), sell = toNum(r["Selling"]); if (buy == null && sell == null && mean == null) return; var pv = pmean[cur]; var ref = mean != null ? mean : (buy != null && sell != null ? (buy + sell) / 2 : (buy != null ? buy : sell)); var delta = pv != null ? ref - pv : null; var pct = (delta != null && pv) ? (delta / pv) * 100 : null; items.push({ sym: cur, buy: buy != null ? fmtNum(buy) : "—", sell: sell != null ? fmtNum(sell) : "—", delta: delta, pct: pct }); }); var order = CONFIG.majorCurrencies; items.sort(function (a, b) { var ia = order.indexOf(a.sym), ib = order.indexOf(b.sym); if (ia === -1) ia = 999; if (ib === -1) ib = 999; if (ia !== ib) return ia - ib; return a.sym < b.sym ? -1 : 1; }); return items; } function chgHTML(it) { var cls = changeClass(it.delta); if (it.delta == null) return ''; var pctTxt = it.pct != null ? (it.pct >= 0 ? "+" : "") + it.pct.toFixed(2) + "%" : ""; return '' + arrow(it.delta) + " " + pctTxt + ""; } function stockHTML(it) { return '' + it.sym + '' + it.val + "" + chgHTML(it) + ""; } function forexHTML(it) { return '' + it.sym + "" + '' + CONFIG.labels.buy + ' ' + it.buy + ' · ' + CONFIG.labels.sell + ' ' + it.sell + "" + chgHTML(it) + ""; } function pill(t, k) { return '' + t + ""; } function render(track, stocks, forex, dateLabel) { if ((!stocks || !stocks.length) && (!forex || !forex.length)) { track.innerHTML = '
' + CONFIG.labels.unavailable + "
"; track.style.animation = "none"; return; } var parts = []; if (stocks && stocks.length) { parts.push(pill(CONFIG.labels.stocks)); stocks.forEach(function (s) { parts.push(stockHTML(s)); }); } if (forex && forex.length) { parts.push(pill(CONFIG.labels.forex, "forex")); forex.forEach(function (f) { parts.push(forexHTML(f)); }); } if (dateLabel) parts.push('' + CONFIG.labels.updated + ": " + dateLabel + ""); var content = parts.join(""); track.innerHTML = content + content; // duplicated for a seamless loop requestAnimationFrame(function () { var dur = Math.max(20, Math.round((track.scrollWidth / 2) / CONFIG.pxPerSecond)); track.style.animation = "none"; void track.offsetWidth; track.style.animation = "mcl-scroll " + dur + "s linear infinite"; }); } async function load(track) { try { var results = await Promise.allSettled([fetchFiles("hisa", 1), fetchFiles("fedha", 2)]); var stocks = [], forex = [], dateLabel = ""; if (results[0].status === "fulfilled" && results[0].value.length) { var hf = results[0].value[0]; dateLabel = hf.date || ""; stocks = buildStocks(await parseSheet(hf)); } if (results[1].status === "fulfilled" && results[1].value.length) { var ff = results[1].value; var curRows = await parseSheet(ff[0]); var prevRows = ff[1] ? await parseSheet(ff[1]) : []; forex = buildForex(curRows, prevRows); if (!dateLabel) dateLabel = ff[0].date || ""; } render(track, stocks, forex, dateLabel); } catch (e) { if (!track.querySelector(".mcl-item")) { track.innerHTML = '
' + CONFIG.labels.unavailable + "
"; track.style.animation = "none"; } } } function mountAndRun() { injectStyle(); var mount = getMount(); mount.innerHTML = '
' + '
' + CONFIG.brand + "" + '' + CONFIG.live + "
" + '
' + CONFIG.labels.unavailable + "
"; var track = mount.querySelector(".mcl-track"); function go() { load(track); setInterval(function () { load(track); }, CONFIG.refreshMs); } if (window.XLSX) { go(); return; } var sc = document.createElement("script"); sc.src = "https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"; sc.onload = go; sc.onerror = function () { track.innerHTML = '
' + CONFIG.labels.unavailable + "
"; }; (document.head || document.documentElement).appendChild(sc); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", mountAndRun); } else { mountAndRun(); } })();