jala

Facade for Jala, the in-app Flutter network inspector — Jala.initialize() plus JalaOverlay wire up capture, storage, and the inspector UI in two lines.

What is Jala? · Package map · Doc index

Audience Flutter apps (install this, not jala_ui alone)
Depends on jala_ui, jala_core
Lockstep 0.8.x with all Jala packages — COMPAT.md
Requires Dart ^3.11, Flutter >=3.35

Existing app? ADOPTION.md · Config / redaction: CONFIG.md · Missing traffic: TROUBLESHOOTING.md


Install

dependencies:
  jala: ^0.8.2
  jala_dio: ^0.8.2   # or jala_http / jala_graphql / jala_websocket
  dio: ^5.0.0

Setup

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:jala/jala.dart';
import 'package:jala_dio/jala_dio.dart';

void main() {
  Jala.initialize(); // enabled: kDebugMode by default
  final dio = Dio();
  JalaDio.attach(dio);
  runApp(JalaOverlay(child: MyApp(dio: dio)));
}

Tap the floating J bubble (or call Jala.open()) to inspect traffic. When disabled, JalaOverlay returns child unchanged.

Other adapters

Client Package Setup
package:http jala_http JalaHttp.wrap(http.Client())
GraphQL (gql_link) jala_graphql JalaGraphQLLink(endpoint: uri) before terminating link
WebSocket jala_websocket JalaWebSocketChannel.wrap(channel, uri: uri)
gRPC jala_grpc JalaGrpcInterceptor(endpoint: uri) in the client's interceptors (capture-only)

Full map: docs/packages.md.


Public API

API Role
Jala.initialize({JalaConfig? config}) Idempotent bind; default enabled: kDebugMode
Jala.open() / Jala.close() Show / hide inspector
JalaOverlay Root wrapper + floating bubble
Jala.enableMockPersistence(directory) Optional file-backed mock rules (jala_mock_rules.json)
Jala.enableFileExport(directory) / disableFileExport() Write session/HAR exports to a file (clipboard still used under 512 KB)
JalaConfig(locale: 'id-ID') Inspector UI language; unset = English (see below)
Jala.controller / Jala.themeController Overlay open state and inspector theme

What you get in the inspector

  • Call list with DevTools-style filter grammar
  • Detail: headers (sensitive collapsed), query params, bodies, GraphQL/WS
  • Replay, mock, edit & resend (live clients only; not imported rows)
  • Throttle presets, session export/import, cURL/HAR import
  • Call diff, virtualized JSON tree, image/multipart/progress where captured

Feature history and roadmap: docs/ROADMAP.md.


Language (English / Indonesian)

The inspector chrome ships in English and Indonesian. It is opt-in, and unset means English — Jala does not follow the device locale:

Jala.initialize(
  config: JalaConfig(enabled: kDebugMode, locale: 'id-ID'),
);

An app on an Indonesian phone renders exactly as it did before this setting existed unless you pass locale. That is deliberate: following the platform locale automatically would change behaviour for existing hosts. 'id' and 'id-ID' both select Indonesian; anything unsupported falls back to English rather than throwing.

No new dependencies. The tables are hand-rolled rather than generated from ARB, so Jala never pins an intl version onto your app.

Deliberately left in English, so a half-translated UI doesn't read as a bug: the filter DSL (status:, is:ws, op:), HTTP method names, gRPC status names, byte/duration formatting, every exported artifact (HAR, cURL, session JSON), and the handful of Flutter framework strings inside the inspector ("Back", "Close"). Indonesian also keeps the developer vocabulary its audience already speaks in English — request, response, header, payload, replay, mock.

Details: CONFIG.md.


Production safety

  • Off by default in release (enabled: kDebugMode)
  • True no-op when disabled (overlay + adapters)
  • Redaction at capture time — SECURITY.md, CONFIG.md
  • Hard body size caps (default 512 KB)
  • Session export modes: full / no bodies / headers only

Leave the dependency wired in release builds; that is intentional and safe.


See also

Libraries

jala
Jala — in-app Flutter network inspector (facade).