Editor tools
Eleven tools open over the code editor: a JavaScript debugger, a test runner, Docker and monitoring panels, a library catalog, backend and AI generators, AI code actions, live collaboration on your local network, and the Problems and Outline views. All of them are free. This page says what each one really does on a phone today, including the parts that only work in part.
How the tools open
These tools only exist inside the code editor; they are not pages of the main pager. Open a file or a project first, then use the wrench button at the top of the editor.
- 1Tap the wrench button (More options) in the editor’s top bar. A sheet opens with a search field, Search action….
- 2Pick a section chip: Edit, View, Go to, Git, AI or Tools, or type in the search field to filter every action at once.
- 3In Tools the actions are grouped as Run, Project, Collaborate, Utilities and Help & settings. Debug, Test Explorer and Dependencies are under Run; Docker Tools, Monitoring and Backend Generators under Project; Live Collaboration under Collaborate.
- 4Problems and Outline are under Go to. AI Generators and the AI code actions are under AI.
- 5The command palette (
Ctrl+Shift+Pon a hardware keyboard) lists the very same actions: the menu and the palette share one registry.
Where each tool is
| Tool | Where | How it appears |
|---|---|---|
| Debug | Tools › Run › Debug File, or the Debug button of the run panel | Panel docked under the editor, next to the run panel |
| Testing | Tools › Run › Test Explorer | Sheet |
| Libraries | Tools › Run › Dependencies (only with a project open on disk), or the dependencies button of the run panel | Sheet titled Libraries |
| Docker | Tools › Project › Docker Tools | Sheet |
| Monitoring | Tools › Project › Monitoring | Sheet |
| Backend Generators | Tools › Project › Backend Generators | Sheet |
| AI Generators | AI › AI Generators | Sheet |
| AI code actions | AI section: AI: Explain Selection, AI: Generate Tests, AI: Refactor Code, Fix Errors and the rest | Panel docked under the editor, a refactor sheet or a bottom sheet, depending on the action |
| Live Collaboration | Tools › Collaborate › Live Collaboration | Sheet |
| Problems | Go to › Problems, or the problems counter in the status bar | Full-screen dialog |
| Outline | Go to › Outline | Column on the right of the editor |
Sheet, docked panel, dialog or column
Sheet
Testing, Docker, Monitoring, Libraries, both generators and Live Collaboration open as a sheet that covers 87 % of the window height, with your app theme. It has no close button: swipe it down, press Back or tap outside it.
Docked panel
Debug and the run panel dock under the editor (150 to 300 dp high). Debug opens only when you start Debug File and closes with Back. The results of the AI code actions dock the same way.
Dialog
Problems is a dialog that takes 95 % of the width, up to 760 dp, and 85 % of the height, with its own header.
Side column
Outline is a 200 dp column to the right of the editor. It appears only when the editor has found regions in the file.
Shortcuts
| Keys | What they do |
|---|---|
Shift+F5 | Debug File |
F9 | Toggle breakpoint on the cursor’s line (not in files opened from outside the project, nor in a diff view) |
F5 · F10 · F11 | While a debug session is paused: Debug: continue, Debug: step over, Debug: step into. With no paused session F5 runs the file and F11 is Zen mode |
Ctrl+Shift+M | Problems |
F8 · Shift+F8 | Next Problem · Previous Problem |
Ctrl+I | Ask AI About Selection |
Screen map
Every screen of the tools, with how you reach it and what you can do there.
| Screen | How you get there | What you can do |
|---|---|---|
| More options menu | Wrench button in the editor’s top bar | Search and run every editor action; sections Edit, View, Go to, Git, AI, Tools. |
| Debug panel | Tools › Run › Debug File; Shift+F5 | Tabs Console, Variables, Call Stack and Breakpoints; continue, step, restart, stop. Real for JavaScript only. |
| Edit breakpoint | Pencil on a row of the Breakpoints tab | Set a Condition or a Log message (logpoint). |
| Test Explorer | Tools › Run › Test Explorer | Tabs Explorer, Output, Coverage, Snapshots; Run all, Failed only, watch mode. |
| Docker Tools | Tools › Project › Docker Tools | Tabs Containers, Images, Compose, Build, Dockerfile, Registry. Editing works without Docker; running needs a docker command on the device. |
| Container logs | Logs icon of a container | Last 200 lines and a live docker logs -f. |
| Monitoring Dashboard | Tools › Project › Monitoring | Tabs Dashboard, Metrics, Alerts, Logs, Server. |
| Alert rule | New rule or edit, in Alerts | Create or edit a rule on a metric, with condition, threshold and severity. |
| Libraries | Tools › Run › Dependencies | Tabs Declared and Catalog; add, update and remove the four bundled Kotlin libraries. |
| Backend Generators | Tools › Project › Backend Generators | Tabs API boilerplate, CRUD generator, Migrations, OpenAPI / Swagger, Mock server; Save to project. |
| AI Generators | AI › AI Generators | Tabs API, Schema (offline templates), Translate, Security, Performance (AI). |
| AI results panel | AI: Explain Selection, AI: Generate Tests, AI: Generate Docs, AI: Generate from Comments | Read the answer; Insert or Apply it. |
| AI-assisted refactoring | AI: Refactor Code | Pick one of nine refactor types or write Custom instructions. |
| AI result sheet | Fix Errors, Optimize, Simplify, Modernize, Generate | Read the answer and Apply it after a diff preview. |
| Live Collaboration | Tools › Collaborate › Live Collaboration | Host or join on the same Wi-Fi; tabs Session, People, Chat. |
| Someone wants to join | Appears on the host’s screen | Let them in or Turn away. |
| Problems | Go to › Problems; Ctrl+Shift+M; status-bar counter; Analyze Style (Lint) | Filter by origin and severity, jump to a line, Quick fixes. |
| Outline | Go to › Outline | Filter and jump to classes, functions, imports and // region sections. |
Debug
Debug runs the open file with a debugger attached and shows what the program is doing in a panel docked under the editor. The debugger is real for JavaScript only (.js, .mjs, .cjs, .jsx, run on the built-in Node.js). For any other language Debug File just runs the file.
Shift+F5), or the Debug button of the run panel. It opens the run panel and the Debug panel together. The Debug panel has no button of its own to open or close it: Back closes it. Debug File is listed only when PocketCode has a runner for the open file.Breakpoints
- Tap a line number in the editor to add or remove a breakpoint, or press
F9on the cursor’s line (Toggle breakpoint). You can set them before you start the session. - Breakpoints live in memory only: closing the app forgets them.
- The Breakpoints tab lists every breakpoint with an on/off box. Tap a row to jump to its line in the current file, use the pencil to edit it, ✕ to remove it, or Clear all. Empty list: “No breakpoints. Tap a line number in the editor to add one.”
Starting and stepping
Node starts paused on its first line (--inspect-brk), the panel attaches (“Debugger attached on port N” appears in the run output) and releases it, and the program runs until it hits a breakpoint or an uncaught exception, which also pauses it.
- With a session active the toolbar offers Continue (or Pause while it runs), Step Over, Step Into, Step Out, Restart and Stop. The step buttons are active only while the program is paused.
- Stop detaches the debugger. The process itself is stopped from the run panel.
- The flame toggle, Hot Reload: restart the session when a project file is saved, is off by default.
The four tabs
The tab names are always in English: the app doesn’t translate them.
| Tab | What it shows |
|---|---|
| Console | The program’s output (console.* and errors) with six colour-coded levels, a button to clear it, and session messages such as “Debug session started”. |
| Variables | The local variables of the top frame of the call stack, as a flat list. Empty states: “Start debugging to inspect variables”, “No variables in current scope”. |
| Call Stack | The frames of the paused program. Tap one to jump to its line. |
| Breakpoints | Every breakpoint, as described above. |
Conditions and logpoints
The pencil of a breakpoint opens Edit breakpoint. Condition (“Pause only when this JavaScript expression is true”) makes it stop only then. Log message (“Log instead of pausing. Use {expression} to insert values”) turns it into a logpoint that prints the message and does not pause. With both, it prints only when the condition is true. These two fields are set here, not from the editor margin.
You can
- Debug a JavaScript file on the built-in Node.js with line breakpoints, conditions and logpoints.
- Step over, step into, step out, continue, pause, restart and stop; see the call stack and the top frame’s local variables.
- Pause automatically on an uncaught exception.
- Restart the session each time you save a project file, if you switch Hot Reload on.
- Jump to the line of a frame or of a breakpoint.
You can’t, and why
- Debug TypeScript, Python, Java, Go or any language other than JavaScript. Debug File runs the file without a debugger and prints “⚠ <runner> has no debugger support — running without it.”; breakpoints do nothing.Not yet
- Evaluate an expression: the Evaluate expression… field of the Console tab always answers
undefinedand does not run what you type.Not yet - Inspect nested objects or the variables of another frame: Variables lists only the top frame’s own locals, with no expansion; choosing another frame only moves the cursor to its line.Not yet
- Add exception breakpoints: the only pause on errors is the automatic one for uncaught exceptions.Not yet
- Keep your breakpoints after you close the app.Not yet
Testing
The Test Explorer finds your project’s tests, runs them with the framework’s own command and lists the results. It does not ship a test runner: it runs the command through the device’s shell (sh -c) in the project folder, so the framework’s tools must exist on the device.
Frameworks and detection
Twelve frameworks are supported: Jest, Mocha, Vitest, pytest, unittest, JUnit, Go Test, Cargo Test, PHPUnit, RSpec, Dart Test and Swift XCTest. PocketCode picks one per project: the first it finds by its config file (for example jest.config.js, pytest.ini, build.gradle, go.mod, Cargo.toml, pubspec.yaml); if none matches it reads package.json for Jest, Vitest or Mocha. unittest has no config file, so it is never picked on its own. The subtitle then reads “<framework> · N tests in M files”.
The four tabs
| Tab | What it does |
|---|---|
| Explorer | One row per test file with its passed count. Search tests…, filters ✓ Passed, ✕ Failed, ○ Skipped, and ▶ to run a suite or a single test. A failed test shows Expected and Received when the runner printed them, and Go to line N. |
| Output | The raw output of the command, coloured, with Clear. Empty: No test output. |
| Coverage | Shows No coverage data (see below). |
| Snapshots | Only for Jest and Vitest. Lists what it finds in .snap files, with Update all and Delete obsolete (it asks Delete obsolete snapshots? first). |
Running
- The footer has Run all, Failed only and, while a run is going, Stop.
- The header has icons for Refresh, Toggle watch mode and Run with coverage.
- The test tree comes from reading your files with name patterns (
*.test.*,test_*.py,*_test.go,*Test.kt…), up to 200 files, skippingnode_modules,.git,build,dist,target,.gradle,__pycache__andvenv. - Watch mode exists for Jest, Mocha and Vitest only, and it just streams the command’s output into Output.
You can
- Detect the framework of the project and list its test files and tests.
- Run all tests, only the ones that failed, one suite or one test; stop a run.
- Read the command’s output live; see Expected and Received and jump to the failing line when the runner reports them.
- Start watch mode for Jest, Mocha or Vitest.
You can’t, and why
- Be sure the tests can run. Each run is
sh -cwith a command such asnpx jest --json,python -m pytest,go test,cargo test,./gradlew test,vendor/bin/phpunit,bundle exec rspec,dart testorswift test. The panel installs none of those tools and does not touch the PATH; if one is missing the error shows in Output.Device - See a coverage report. Run with coverage runs the framework’s coverage command and prints its output, but the Coverage tab never receives data and the editor margin shows no coverage. unittest, RSpec and Swift have no coverage command at all (Coverage no disponible para <framework>).Not yet
- Get exact results per test. Pass or fail is guessed from the text of the output (a ✓, PASS or ok line, or a ✗, FAIL or ✕ line, that contains the test’s name); a test with neither stays not run. The JSON and JUnit files the commands ask for are not read.Not yet
- Get useful snapshots. The tab lists
.snapentries, all marked as passed, so Update all and Delete obsolete have nothing meaningful to act on.Not yet - Use watch mode with pytest, Go, Cargo, JUnit or the rest: they show Watch mode no disponible para <framework>.Not yet
- List more than 200 test files, a limit set for performance on mobile.By design
- Debug tests. The menu describes the Test Explorer as able to “debug tests with coverage”; the panel does not debug.Not yet
Docker Tools
Docker Tools is a front end for the docker command-line tool that is already on your device. PocketCode does not include Docker or a Docker daemon, and the panel has no field for a remote host. So on a typical phone the tabs that need Docker show Docker isn’t reachable, while the Dockerfile and Compose editors keep working.
When Docker isn’t there
On opening, the panel runs docker --version. If that fails, Containers, Images, Build and Registry show Docker isn’t reachable: “PocketCode runs the docker command on this device and couldn’t find it. You can still edit the Dockerfile and the Compose file.” It adds the real cause of the failure and two buttons, Try again and Edit Dockerfile. The subtitle reads Docker not available.
Dockerfile and .dockerignore
This tab works without Docker. Start from one of 14 templates — Node.js App, Python App, Java App, Go App, Rust App, Static Site, React App, Next.js, FastAPI, Spring Boot, Django, Ruby on Rails, Laravel, Custom Multi-stage — edit the text and Save it as Dockerfile in the project. For .dockerignore you can Generate a file and save it.
Compose
Nine templates: Full-stack Node.js, Full-stack Python, Full-stack Java, LAMP Stack, MEAN Stack, Monitoring Stack, ELK Stack, WordPress and Dev Tools. Edit and Save the file; it is always saved as docker-compose.yml, although the panel reads docker-compose.yml, docker-compose.yaml, compose.yml or compose.yaml. With Docker present, Compose up, Compose down, Compose build and Compose logs run docker compose up -d, down, build and logs --tail=100; they stay disabled until the project has a Compose file.
With Docker available
| Tab | What it does |
|---|---|
| Containers | Lists docker ps -a --size in Running and Stopped. Per container: logs (the last 200 lines, then a live docker logs -f marked Live), start or stop, and a menu with Restart and Remove (it asks Remove container?). The first three containers that stopped with an error also show their last 20 log lines. |
| Images | Lists images; Pull an image by name (for example nginx:alpine); delete one (it asks Delete image?). |
| Build | Set the Image tag (default my-app:latest) and press Build Image: it runs docker build -t <tag> . in the project with live output and Cancel build. It needs a Dockerfile (“Write or pick a Dockerfile first.”). |
| Registry | Choose Docker Hub, GitHub CR or Google GCR and Push a name:tag (it runs docker tag and docker push). |
Limits of the commands
Each command may run for 300 seconds at most. Names and tags are checked before they reach Docker: letters, digits and _ : . / @ -, up to 255 characters, and not starting with -.
You can
- Write and save a Dockerfile (14 templates), a
.dockerignoreand a Compose file (9 templates), with or without Docker. - Retry the Docker check with Try again.
- With a working local
docker: list, start, stop, restart and remove containers; read their logs live; pull, list and delete images; build an image; run Compose up, down, build and logs; push to Docker Hub, GitHub CR or Google GCR.
You can’t, and why
- Use Docker on a device that has no
dockercommand. PocketCode ships no Docker binary or daemon; the panel only runs the CLI it finds on the device.Device - Connect to a remote Docker daemon over SSH, with
DOCKER_HOSTor with a context: the panel has no host field and every command runs on this device.Not yet - Log in to a registry: there is no login step, so Push uses whatever the local Docker CLI already has configured. Only three registries are offered.Not yet
Monitoring
Monitoring measures the app you are running in and the device it runs on, not a server. It samples every 2 seconds while the panel is open and stops when you close it. To see your own server there is a separate Server tab.
The five tabs
| Tab | What it shows |
|---|---|
| Dashboard | A System Health section with four cards: App CPU, Memory (the device’s memory use in %, not the app’s), Battery and Free storage in MB. Then the Thermal state (Android 10 and later) and the five latest alerts, or No active alerts. |
| Metrics | A series of the last 60 samples (two minutes) with min, average and max for eight metrics: App CPU, App heap, Device memory, Total memory (PSS), Battery, Network in, Network out and Free storage. A metric the device can’t report shows “—” and “This device has not reported this metric yet.” |
| Alerts | Four rules come built in: High CPU (CPU above 80 %), Device memory critical (above 90 %), Low storage (below 200 MB) and Low battery (below 15 %). New rule makes your own; you can edit, switch off, delete (it asks Delete this alert rule?) and acknowledge events. Rules survive a restart. |
| Logs | The app’s own log (logcat filtered to this process) in a 500-line buffer refreshed up to four times a second. A System logs chip (off by default), level chips, Search logs…, Clear, an entry counter and Live. |
| Server | Point the panel at your own Prometheus-compatible server. See below. |
Alert rules
The rule form has Metric, Condition (Greater than or Less than), Threshold (checked against the metric’s range), Sustained for (seconds) and Severity (Critical, Warning, Info). Alert events are evaluated and shown only while the panel is open; the last 100 are kept, at most one per minute per rule.
Server: your own Prometheus
Server works with Prometheus, VictoriaMetrics, Thanos, Mimir, Cortex or a Grafana proxy. Enter the Address, choose Authentication (None, User and password or Bearer token), pick the refresh (5 to 300 seconds, 15 by default) and add up to 12 queries; each is a PromQL instant query that must return a single value. Test connection checks the setup. Until you configure it, the tab reads “No server configured. Nothing leaves this device until you set one up.”
You can
- Watch the app’s CPU, heap and total memory, the battery, the network traffic of the app and the free storage, plus the device’s memory and thermal state.
- Read the app’s own log, search it, filter it by level and clear it.
- Create, edit, switch off and delete alert rules, and see when they fire while the panel is open.
- Show up to 12 numbers from your own Prometheus-compatible server.
You can’t, and why
- See errors, uptime, APM or traces. Those tabs were removed because a phone can’t measure them for someone else’s service. The menu’s description of Monitoring still says “errors and uptime”.By design
- Monitor another process or machine with the first four tabs: they measure this app and this device only. Use Server for yours.By design
- Get a push, email or Slack notification from an alert: events appear only in the panel, and only while it is open.Not yet
- Make Sustained for (seconds) count: it is saved and shown, but a rule fires as soon as the current value crosses its threshold.Not yet
- Query a server over plain HTTP unless it is
localhost,127.0.0.1or10.0.2.2. Android blocks unencrypted traffic, so an address likehttp://192.168.1.50:9090is refused: usehttps://or a tunnel or TLS proxy.Device - Use range queries, queries that return several series, or Sentry. Only the Prometheus instant-query API is supported.Third party
Libraries
Libraries (the menu calls it Dependencies) is not a package manager. It lists the Kotlin/JVM libraries a project declares in .pocketcode/dependencies.json and lets you pick from a closed catalog of four libraries that ship inside the PocketCode app. Only the full Kotlin runner uses them.
.pocketcode/dependencies.json · N declared.Catalog
The Catalog tab lists the four libraries PocketCode includes: kotlinx.coroutines 1.10.2, kotlinx.serialization · JSON 1.7.3, kotlinx.serialization · core 1.7.3 and Okio 3.9.1. The + icon of a row (Add plus the library name) adds it to the project.
Declared
The Declared tab lists what the project’s JSON declares, with the filters All, Outdated and Not included. Each row shows group:artifact and whether PocketCode includes it (“Included with PocketCode.”, or “a → b” when the project asks for another version), with an update icon and a remove icon. Update N at the bottom updates every outdated library, which means setting it to the version PocketCode includes. The refresh icon in the header (Resolve now) prepares the libraries again, with the states “Preparing the libraries…” and “Ready: this project’s libraries are prepared.” Without declarations it reads No dependencies.
A library that isn’t included
If the JSON names something outside the catalog, the row says it doesn’t come with PocketCode, “so this project runs in simple mode. Remove it, or use one of the libraries above.”
You can
- See which libraries a project declares and whether each one is included.
- Add any of the four bundled libraries, remove one, or update it to the bundled version.
- Prepare the libraries without network: the jar is taken from the app and checked against its SHA-256.
You can’t, and why
- Install libraries from the internet, npm, pip, Maven, Gradle or cargo. Google Play does not allow an app to download executable code (jar, dex) from outside Play, so the catalog is closed, bundled in the app and uses no network.Google Play
- Add an arbitrary coordinate or choose a version: PocketCode uses the version it includes, and the
repositoriesfield of the JSON is read and ignored.Google Play - Use these libraries from other languages: the list serves the full Kotlin runner only.By design
Backend Generators
Backend Generators write server code from templates stored in the app. It is not AI: the same settings always give the same files (the Generate buttons simply wait a moment first). You read the result in the sheet and, with a project open, save it under backend/.
The tabs
| Tab | What it does |
|---|---|
| API boilerplate | Pick a Framework (Express.js, FastAPI, Spring Boot, Django REST, Gin, Actix Web, NestJS, Fiber), a Database (PostgreSQL, MySQL, SQLite, MongoDB, Redis), Authentication (None, JWT, OAuth2, API Key, Session-based), Options (Docker, CORS, Rate limiting, Swagger / OpenAPI, Tests, CI/CD), a Project name, Port and Base URL, then Generate boilerplate. CI/CD adds .github/workflows/ci.yml with the setup step of the framework’s language. |
| CRUD generator | Name a model and its table, add Fields (String, Integer, Float, Boolean, Date, DateTime, UUID, JSON, Text, Enum, Array, Binary, each required or unique), tick Validation, Pagination, Search, Soft delete, Audit fields or Tests, then Generate CRUD. Express and NestJS give several TypeScript files, FastAPI and Django REST several Python files; Spring Boot, Gin, Actix Web and Fiber give a single src/<model>.ts file. |
| Migrations | Eleven types: Create Table, Alter Table, Drop Table, Add Column, Drop Column, Add Index, Drop Index, Add Foreign Key, Rename Table, Rename Column and Seed Data. Add Columns, press Generate migration and read the Up migration and Down migration SQL, plus the History. |
| OpenAPI / Swagger | Fill the Title, Version, endpoints and Security (Bearer (JWT), API key, Basic), choose YAML or JSON and press Generate OpenAPI spec. |
Save to project
Save to project writes the generated files under backend/ in the project; migrations become backend/up.sql and backend/down.sql, and the spec backend/openapi.yaml or backend/openapi.json. Paths can’t leave the project folder. If some files exist it asks Overwrite files? (“N file(s) already exist in the project and will be overwritten.”). On success it says “Saved N file(s) to backend/ in the project”, and if writing fails “Couldn’t save the generated files”. It needs a project open.
You can
- Generate API boilerplate for eight frameworks, CRUD files, SQL migrations (up and down) and an OpenAPI spec in YAML or JSON, on the device and with no network.
- Read the generated code in a preview and select its text.
- Save everything under
backend/in the project, with a confirmation before overwriting.
You can’t, and why
- Have a working mock server. In the Mock server tab, Start only switches the status to Running after a second and then adds made-up requests (a random route and latency every few seconds) to the Request log. It opens no port.Not yet
- Get different code for NestJS or Fiber: they reuse the Express and Gin templates.Not yet
- Get a full CRUD for Spring Boot, Gin, Actix Web or Fiber: only the single TypeScript fallback file.Not yet
- Get MongoDB- or Redis-specific migrations: migrations are SQL, and only PostgreSQL has its own column types.Not yet
AI Generators
AI Generators has five tabs, but only three use AI. API and Schema are offline templates that run on the device; Translate, Security and Performance send the code you paste to your connected AI provider.
The five tabs
| Tab | What it does |
|---|---|
| API · offline | Describe the API, pick one of 12 frameworks and press Generate API. Only the first meaningful word of your description is used, as the resource name; you always get five CRUD endpoints and the code. The 12 frameworks share seven templates: NestJS and Hono use the Express one, Flask and Django REST the FastAPI one, Fiber the Gin one. |
| Schema · offline | Pick an engine (PostgreSQL, MySQL, SQLite, MongoDB, Redis, Firestore) and an output format, then Generate schema. You always get one table named after the first word of your description, with id, name, email, status, created_at and updated_at. SQL, Prisma, TypeORM, Django and Mongoose have their own generator; Sequelize, SQLAlchemy, Drizzle and Knex return plain SQL DDL. |
| Translate · AI | Paste code, choose From and To among 16 languages (JavaScript, TypeScript, Python, Java, Kotlin, Swift, Go, Rust, C++, C#, Ruby, PHP, Dart, Scala, Lua, R), swap them with Swap languages and press Translate code. If both match you get “Source and target languages are the same”. The answer has the translated code, notes and warnings. |
| Security · AI | Paste code and press Scan for vulnerabilities. The prompt asks for an OWASP Top 10, CWE-mapped review. You get a Risk score and findings with severity (Critical, High, Medium, Low, Info), category, CWE and OWASP references, line, recommendation and fix code. |
| Performance · AI | Paste code and press Analyse performance. You get a score from 0 to 100, time and space complexity, issues and Recommendations. |
What the AI tabs need
A connected AI provider and internet access. The first time, a notice asks Send to <provider>?; Send shares the code you pasted, Cancel shares nothing. API and Schema need neither a provider nor a network. Before generating, the result area reads “The result will appear here once generated.”
You can
- Generate a REST API skeleton and a starter schema offline.
- Translate code between 16 languages, scan it for vulnerabilities and analyse its performance, with your AI provider.
- Read the result in the sheet and select its text.
You can’t, and why
- Use the editor’s selection: you paste the code into the panel; there is no “use selection” button.Not yet
- Insert or apply the result in your file: the panel only shows it.Not yet
- Get a custom API or schema from your description: API and Schema use only its first word, and the rest does not change the output.Not yet
- Get Sequelize, SQLAlchemy, Drizzle or Knex code: those four formats return SQL DDL.Not yet
- Use Translate, Security or Performance with no connected provider or no internet.Needs network
AI code actions
The AI section of the menu has actions that work on your code: explain, tests, docs, code from comments, refactor and five quick actions. They send the code to your connected AI provider, after a notice you accept, and show the answer.
The actions
| Action | What happens |
|---|---|
| AI: Explain Selection | Explains the selected code. The answer appears in the docked panel as Explanation. |
| AI: Generate Tests | Writes tests for the function at the cursor (Generated Tests). Insert puts them at the cursor. |
| AI: Generate Docs | Writes documentation for the function at the cursor (Documentation). Apply puts the answer in place of that function. |
| AI: Generate from Comments | Finds comments such as // TODO: …, // FIXME: …, // GENERATE: …, // AI: …, // IMPLEMENT: …, // STUB: …, # TODO: … or /* TODO: … */ of at least 10 characters and shows up to five in a bar (“N comment(s) with generatable code”). Tap one to get Generated Code, with Insert. |
| AI: Refactor Code | Opens AI-assisted refactoring: choose one of nine types and press Refactor. With no selection it refactors the whole file. The answer is Refactored Code with Apply, which replaces the code that was sent (the selection, or the whole file if nothing was selected). The nine type names are always in Spanish: Extraer y Simplificar, Mejorar Nomenclatura, Añadir Type Safety, Convertir Patrón, Optimizar Rendimiento, Revisión Seguridad, Mejorar Accesibilidad, Manejo de Errores and Personalizado (with Custom instructions). |
| Fix Errors, Optimize, Simplify, Modernize | Work on the selection. The answer opens in a bottom sheet (“Fixed Code”, “Optimized Code”, “Simplified Code”, “Modernized Code”). Apply first shows a red and green diff preview, then replaces the selection (or inserts at the cursor if the selection is gone). |
| Generate | Treats the selection as a description of what you want, such as a comment (// function that returns the sum of a list) or a plain sentence, and asks your AI provider for the code. A bottom sheet titled “Generated Code” shows AI is thinking… and then the code; if the provider can’t answer, the sheet shows the error and stops loading, and ✕ closes it. Apply first shows the red and green diff preview, then inserts the code on a new line below the selection, so your description stays. Copy copies it. The first time, a notice asks Send to <provider>?. |
Ask AI About Selection (Ctrl+I) | Closes the editor and opens AI Chat with the selection as context. |
Apply and Insert in the docked panel
The docked panel is at most 300 dp high and has a ✕ to close. Insert puts the answer at the cursor. Apply replaces only the piece of code that was sent to the AI (the function for Generate Docs; the selection for Refactor, or the whole file when nothing was selected) with the answer, with no preview and in one undo step. If you changed that code while the AI was answering and it can’t be found any more, nothing is touched and the panel says “The code changed while the AI was answering, so the result was not applied. Copy it instead.” Copy, beside the generated code, copies it to the clipboard (“Copied to clipboard”); the bottom sheet has its own Copy for the whole answer.
You can
- Explain, write tests for, document, refactor, fix, optimize, simplify or modernize code with your AI provider.
- Turn a
TODOorGENERATEcomment into code. - Describe what you want in a comment or a sentence, select it and run Generate to get the code inserted right below it.
- Apply generated docs or a refactor over just the function or selection that was sent, and undo it in one step.
- Copy the generated code to the clipboard with Copy, in the docked panel and in the bottom sheet.
- Review a diff before applying a quick action.
- Hand a selection to AI Chat with Ask AI About Selection.
You can’t, and why
- Run AI: Explain Selection, Fix Errors, Optimize, Simplify, Modernize or Generate with nothing selected: they do nothing.By design
- See the refactor types in your language: their names are fixed in Spanish.Not yet
Live Collaboration
Live Collaboration lets two or more devices edit one file together on the same Wi-Fi network. It is free, needs no account and has no server: the host’s phone listens on your local network, guests find it, type a six-digit code and the host lets them in. Nothing goes over the internet.
Host a session
- 1Under Host on this device type a session name and tap Start hosting. The session shares the text of the file you have open.
- 2Give the six-digit Pairing code to whoever is joining (“Give this code to whoever is joining”).
- 3When someone types the right code, your device asks Someone wants to join: “<name> typed the right code. Letting them in shares the file with their device.” Choose Let them in or Turn away. You have up to 90 seconds.
- 4End it with End Session in the header.
Join a session
- 1Open the panel on the same Wi-Fi. Peers on your network scans the LAN (Scanning the LAN…) and says No peers found if nobody is hosting.
- 2Type the host’s six digits in Code from the host (“Nobody can join without it. The session never leaves your network.”).
- 3Tap the host and wait for it to let you in (up to 120 seconds). The contents of the file you had open are replaced by the host’s text.
- 4Leave with Leave in the header.
Inside a session
| Tab | What it shows |
|---|---|
| Session | The Pairing code (host only), Session ID, Host (the device model), Port, Participants as “n / 10”, Chat, the Connected list and Activity. |
| People | Each participant with a HOST or (you) tag, Online or Offline and the cursor’s “Line l:c”. The host gets a Remove button for each of the others. |
| Chat | Text messages (Type a message…); a message that starts with three backticks is shown as a code snippet. |
What is shared
- The text of the host’s active file at the moment the session starts. A session shares one buffer: not the project tree, not other files.
- After that, everyone’s edits merge (CRDT) and the remote cursors appear in the editor with a name and a colour.
- The host relays everything: guests talk to the host, not to each other.
- Every guest the host lets in can edit the shared text.
- If a guest’s connection drops, the app retries up to six times (1 s growing to 15 s) and reconciles what was typed in the meantime.
Network and permission
From Android 13, hosting and joining need Android’s nearby-devices permission (on the newest Android versions it is a local-network permission). When you start hosting, scan or join and it is missing, Android’s own permission dialog opens: allow it and tap again. If you refuse, hosting and joining stay refused (the next attempt shows the explanation again) until you allow it from Android’s settings for the app. The permission explanation and the connection errors are shown in the language of the app.
You can
- Host a session sharing the open file; approve or turn away each guest; end the session.
- Let every guest you accept edit the shared text.
- Answer Android’s permission dialog from the panel itself, when the permission is needed, and read its explanation in the language of the app.
- Remove a guest with Remove: it closes their connection and, if they try to join again, the host turns them away without asking.
- Join a host on the same Wi-Fi with the six-digit code.
- Edit the same text at the same time, see everyone’s cursor and chat.
- Reconnect automatically after a short drop.
You can’t, and why
- Collaborate across different networks or over the internet: there is no relay or cloud.By design
- Choose your name: every participant, you included, appears as You, also in the host’s approval dialog.Not yet
- Rely on the “n / 10” limit: it is only displayed, and the host does not cap the number of guests.Not yet
- Share the terminal or debugging with a guest: removed on purpose, because it would hand another device a shell.By design
- Share several files or the project: a session shares one buffer.By design
Problems
Problems is one list of everything the editor has found wrong in every open tab, grouped by file. It is a full-screen dialog, not a sheet.
Ctrl+Shift+M), the problems counter in the editor’s status bar, or Go to › Analyze Style (Lint), which opens the same dialog with Style switched on.Filters
Filter by origin — Compiler/LSP, Markers and Style, each with its count — and by severity — Errors, Warnings, Info and Hints. Compiler/LSP and Markers are on by default. Style (the linter rules) is computed only when you switch it on, with “Analyzing style…”, and nothing is computed while the dialog is closed.
Rows
Problems are deduplicated and ordered by severity, then line. Tap a row to go to “Line N, Col M”. The group of the active file has Quick fixes, which opens the quick-fixes panel. F8 and Shift+F8 jump to the next or previous error, warning or TODO marker without opening the dialog. With nothing to show it reads No problems found.
You can
- See errors, warnings, info and hints from the language server, markers and style rules of all open tabs in one list.
- Filter by origin and by severity, and jump to a line.
- Open Quick fixes for the problems of the active file.
You can’t, and why
- See problems of files that are not open in a tab: only open tabs are read.By design
- Keep Style always on while you type: it is computed on demand each time you switch it on.By design
Outline
Outline is a column on the right of the editor that lists the file’s classes, interfaces, functions, import blocks and // region sections and jumps to them. A simple parser builds it; it does not use the language server.
What it recognises
- Lines that start with
class,interface,object,enum class,funorsuspend funand open a{— Kotlin-style declarations. - Blocks of three or more consecutive lines that start with
import. - Regions written as
// region Nameand closed with// endregion. - It refreshes 0.8 seconds after you stop typing.
Using it
Type in Filter symbols… (it matches part of the text, it is not fuzzy) and tap an entry to go to its line. No symbols appears when the filter matches nothing.
You can
- See the structure of a Kotlin file and jump to any class, function, import block or region.
- Filter the list by typing.
You can’t, and why
- List declarations written the way other languages do: a
functionin JavaScript, adefin Python or apublic classin Java don’t match. In those files you mainly get import blocks and// regionmarkers.Not yet - Use the language server for symbols: Outline does not.Not yet
Free and Pro
Every tool on this page is free. None of them has a plan limit or a paywall.
| Tool | Free | Pro |
|---|---|---|
| Debug, Test Explorer, Docker Tools, Monitoring, Libraries, Backend Generators | Included | Included |
| AI Generators and AI code actions | Included; they use the AI provider you connect | Included; the same |
| Live Collaboration | Included | Included |
| Problems and Outline | Included | Included |
Privacy and security
What leaves the device, tool by tool.
- Debug, Test Explorer, Docker Tools, Libraries, Backend Generators, Problems and Outline do not send your code anywhere. The commands they run (
npx,docker pull,docker push…) behave as they would in any shell, with their own network use. - The AI actions, and the Translate, Security and Performance tabs of AI Generators, send the code you select or paste, with instructions, to your AI provider over the internet. A notice asks Send to <provider>? first; Cancel sends nothing. API and Schema use no AI and send nothing. Ask AI About Selection opens AI Chat, which follows its own rules.
- Monitoring measures on the device and sends nothing. The Server tab queries only the address you enter, with the credentials you type; a password or token is stored encrypted with the Android Keystore. Until you configure it, “Nothing leaves this device”.
- Live Collaboration stays on your local network: no server, relay or account. Traffic is encrypted (an ECDH P-256 key exchange, then AES-128-GCM) and a guest needs the six-digit code and the host’s approval. The host is visible to other devices on the same Wi-Fi by design, so that they can find it.
- That encryption does not protect you from someone who learns the six digits and whom you let in: the code is short on purpose so that people can type it. After five failed attempts the host closes the session.
Limitations
What the tools don’t do today, and why.
- Debugging is real for JavaScript only; Evaluate expression… answers
undefined.Not yet - Test Explorer and Docker Tools run commands through the device and don’t bring Node, Python, Go, Cargo, Gradle or Docker with them.Device
- The Coverage tab never shows data, and the snapshot tools have nothing to act on.Not yet
- Libraries is a closed catalog of four Kotlin libraries: Google Play does not allow downloading executable code.Google Play
- The Mock server tab is a mock-up with invented requests; NestJS and Fiber reuse the Express and Gin templates.Not yet
- In AI Generators, API and Schema are offline templates, not AI.Not yet
- The AI tabs and actions need a connected provider and internet.Needs network
- Live Collaboration works on one local network only, with no relay or cloud.By design
- Monitoring has no push, email or Slack alerts and cannot reach a server over plain HTTP unless it is local.Device
- Outline understands Kotlin-style declarations only.Not yet
- Some texts are not translated: the Debug tab names are in English, the nine refactor types in Spanish, and a few error messages in Spanish (Test Explorer) or English (generators).Not yet
Troubleshooting
Docker isn’t reachable
The device has no docker command PocketCode can run. Install one where you can, or keep using the Dockerfile and Compose tabs, which work without it, and run the commands somewhere with Docker. Try again repeats the check.
No project open
Docker Tools works on a project folder. Open a project and open the tool again.
No test framework detected
The project has no config file PocketCode recognises (jest.config.js, pytest.ini, go.mod, Cargo.toml, phpunit.xml, pubspec.yaml, Package.swift…), and package.json doesn’t mention Jest, Vitest or Mocha. unittest is never picked automatically.
Error ejecutando tests: …
The test command could not be started or was cut short by an error; the text after the colon is the cause. If the tool the command needs (npx, python, go, cargo, ./gradlew…) is missing, the shell says so in Output and the tests stay not run. The message is in Spanish whatever your language.
Coverage no disponible para <framework>
unittest, RSpec and Swift XCTest have no coverage command. For the others the command runs, but the Coverage tab stays empty.
Watch mode no disponible para <framework>
Watch mode exists only for Jest, Mocha and Vitest.
⚠ <runner> has no debugger support — running without it.
Only JavaScript files (.js, .mjs, .cjs, .jsx) are debugged. Anything else, TypeScript included, just runs.
⚠ Could not attach the debugger on port N — the process stays paused.
The panel could not connect to Node’s inspector. Stop the run from the run panel and start Debug File again.
Breakpoint not set at <file>:<line> — <cause>
The debugger refused that breakpoint; it appears as a warning in the Console tab and the cause comes after the dash. Try an executable line of the file that is running.
Android blocks unencrypted HTTP to <host>…
Monitoring › Server refuses plain HTTP unless the host is localhost, 127.0.0.1 or 10.0.2.2. Use an https:// address, or put a tunnel or a TLS proxy in front of the server.
Couldn’t start reading this app’s log. The system may not allow it on this device.
Monitoring › Logs reads this app’s logcat; some devices don’t let an app do that. The other tabs are unaffected.
No AI service connected. Connect a provider in Settings to use AI features.
The AI actions and the three AI tabs need a provider. Add a key or sign in under Settings and try again. See AI providers, models & keys.
Translation failed: … · Scan failed: … · Analysis failed: …
The provider answered with an error or could not be reached; the text after the colon is its cause. The generators’ own messages are in English.
PocketCode needs permission to use the local network and find nearby devices… · The local network permission is missing…
Live Collaboration needs Android’s nearby-devices (local-network) permission. The panel asks for it with Android’s dialog when you host, scan or join; if you refused it, allow it in Android’s settings for PocketCode and try again. Until then hosting and joining are refused, with this notice in the language of the app.
No response. The host may be gone, you may be on different networks, or Android may be blocking the local network.
Check that the host still has its session open, that both devices are on the same Wi-Fi (a router that isolates devices from each other will block it) and that the permission above is granted.
No peers found
Nobody is hosting on your network right now, or the devices are not on the same Wi-Fi. Ask the host to open Live Collaboration and tap Start hosting.
Failed to join <host>: … · Failed to start hosting: …
The text after the colon gives the reason, in the language of the app: Could not join the session. (wrong code, or the host turned you away; the app says it the same way for every cause on purpose, so a wrong code can’t be told from a refusal), No response… (above), The other device did not answer like PocketCode, or it runs an incompatible version. Check that you picked the right session and try again. or, for anything else, Could not connect to the host.
Too many failed attempts to join. The session has been closed; start a new one to get another code.
After five failed attempts (wrong code, rejection or failed connection) the host closes the session. Start hosting again to get a new code.
Enter the 6-digit code the host is showing.
Type the six digits shown under Pairing code on the host’s screen before tapping the host.
The host closed the session. Your file stays open exactly as it is.
The host ended the session, or reconnecting failed after six tries (“Could not reconnect to the host…”). Your file stays open with everything you wrote, including what you typed after the drop.
No symbols
The Outline filter matches nothing. Clear the field. In JavaScript, Python or Java files the Outline mostly lists only import blocks and // region markers.