
Run a local OpenAI-compatible inference service on Linux, verify it, and make it available to authorized remote clients
Atomic Chat packages a desktop local AI application and an OpenAI-compatible HTTP service in one workflow. On Linux, the supported downloadable package is an x86_64 AppImage, while developers can also build the project from source. This guide starts with the AppImage installation, explains how to load a model and test the local API at http://localhost:1337/v1, and then adds remote connectivity through a Localtonet HTTP tunnel. Because Atomic Chat does not require an API key for the documented local API example, the guide also treats access control as an essential deployment decision rather than an optional refinement.
๐ What's in this guide
How the Atomic Chat and Localtonet workflow fits together
Atomic Chat is a local AI desktop application and inference engine for running open-weight language models on the user's computer. Its local API follows the OpenAI API format, which allows compatible agents, command-line tools, IDE integrations, and applications to use a locally loaded model by changing their API base URL.
The documented base URL is http://localhost:1337/v1. Chat completion requests are sent to http://localhost:1337/v1/chat/completions. Atomic Chat binds this service to 127.0.0.1 by default. That loopback address means software on the same Linux computer can reach it, but another computer on the LAN cannot connect directly.
This default is useful because it reduces accidental network exposure. A local application can connect to the API while the service remains unavailable on other network interfaces. Atomic Chat documents changing its host to 0.0.0.0 when LAN exposure is required, but that change is not necessary for the preferred Localtonet layout in this guide. When the Localtonet client and Atomic Chat run on the same Linux computer, our client can forward requests to 127.0.0.1:1337.
The Localtonet client establishes an outbound connection to a Localtonet relay server. An HTTP tunnel then provides a public HTTPS address and forwards incoming application traffic to the configured local IP address and port. This avoids inbound router port forwarding, a public IP requirement, VPN setup, and inbound firewall changes. The tunnel is available only while the selected Localtonet client is connected and the tunnel is running.
127.0.0.1 by default. Keeping the Localtonet client on the same machine preserves that local-only binding.
1337.
Opening Atomic Chat is not enough by itself. A model must be available and loaded before a chat completion request can succeed. Keep the application and its inference service running while local or remote clients use the API.
Prerequisites for installing Atomic Chat on Linux
The Atomic Chat download page identifies the Linux desktop package as an x86_64 download. Confirm that the computer uses a compatible architecture before downloading the AppImage. The available evidence does not establish support for Linux ARM packages, individual distributions, minimum RAM, minimum disk capacity, or specific GPU drivers, so those requirements should not be guessed.
Model resource requirements vary substantially. A small quantized model may run on hardware that cannot load a larger model. Available system memory, GPU memory, storage, model format, context length, and inference backend can all affect whether a model starts successfully and how quickly it responds. Choose a model appropriate for the machine rather than assuming every model listed in the application will fit.
| Requirement | What to confirm | Why it matters |
|---|---|---|
| Linux architecture | The downloadable Linux desktop package is identified as x86_64. | An AppImage built for another processor architecture will not execute correctly. |
| Desktop session | You can launch a graphical desktop application under your current Linux account. | Atomic Chat is distributed as a desktop application, even when its HTTP API is the main objective. |
| Executable permission | The downloaded AppImage can be marked as executable. | Linux normally requires this permission before an AppImage can be launched directly. |
| Model resources | The machine has enough memory and storage for the model you select. | Exact requirements depend on the model, quantization, context, and inference backend. |
| Local port | Port 1337 is not already occupied by another process. |
Atomic Chat documents its OpenAI-compatible service at this port. |
| Remote connectivity | The Localtonet client can run on the same Linux machine and make an outbound connection. | This lets the client reach the loopback-only API without changing Atomic Chat to a LAN-wide binding. |
You will also need permission to download a model if it is not already present. Some model repositories may impose their own license acceptance or access requirements. Atomic Chat supports models from Hugging Face, but the exact availability and conditions of an individual model come from that model's publisher.
Atomic Chat's supplied documentation does not define one minimum RAM, GPU, storage, or Linux distribution requirement that applies to every model. If a model cannot load, test with a model that better matches the available hardware before diagnosing the HTTP or tunnel configuration.
Install Atomic Chat from the Linux AppImage

The AppImage route is the most direct documented installation path for a Linux user who wants to run the released desktop application. It avoids the Node.js, Yarn, Make, and Rust toolchain required for a source build. Download the Linux package from the official Atomic Chat website or the project's official release page rather than from an unofficial mirror.
Download the current Linux x86_64 AppImage
Obtain the Linux desktop package from the official Atomic Chat download page or its official GitHub releases. Use the current release offered by the project. Do not rely on a filename copied from an older tutorial because release asset names can change.
Mark the downloaded file as executable
In a graphical file manager, open the file's properties and allow it to run as a program. Alternatively, use chmod with the actual path of the downloaded AppImage. The path below is intentionally descriptive and must be replaced with the real file location.
Run the AppImage
Double-click the executable AppImage or launch it from a terminal using its real path. Keep the terminal open during the first test if you want to see diagnostic output generated during startup.
Confirm that the Atomic Chat window opens
A successful launch should display the application interface. Do not configure Localtonet yet. First complete the model setup and prove that the local API works directly on the Linux computer.
A terminal-based permission command follows this general form:
chmod u+x "/full/path/to/the-downloaded.AppImage"
Launch the same file after applying the permission:
"/full/path/to/the-downloaded.AppImage"
Replace the example path with the exact downloaded filename and location. Quoting the path prevents spaces in a directory or filename from being interpreted as separate shell arguments.
This guide does not prescribe a system-wide AppImage installation directory, desktop integration utility, or package-manager conversion because the supplied project evidence does not establish one required method. Running the official AppImage directly is sufficient for the documented workflow.
If the file is executable but does not start, preserve the exact terminal error. AppImage runtime and library behavior can vary among Linux distributions. The Atomic Chat evidence supplied for this guide does not specify a universal package command for resolving every AppImage launch failure, so avoid installing guessed dependencies without checking the requirements for your distribution and the current Atomic Chat release.
Load a model and prepare the inference service
Once Atomic Chat opens, select a model that is suitable for the Linux computer and make it available in the application. The project's basic workflow is to download Atomic Chat, pick a model, and start chatting. Its local model support includes model families such as Llama, Gemma, Qwen, Mistral, and Phi, among others, but model availability may change and individual models can have different licenses or hardware needs.
Choose a model appropriate for the machine
Consider available memory, storage, and acceleration hardware. Starting with a smaller model makes it easier to separate installation and networking problems from resource exhaustion.
Download or select the model in Atomic Chat
Allow any required model files to finish downloading. If the model comes from a repository with restricted access or license conditions, complete those requirements through the appropriate model provider.
Load the model
Make the selected model active in Atomic Chat. Record the model identifier shown for the loaded model because API requests must use the identifier that Atomic Chat recognizes.
Test a chat in the desktop application
Send a short prompt inside Atomic Chat. A successful response confirms that the model can load and perform inference before the API and network layers are introduced.
Atomic Chat exposes multiple inference engines through the same API base URL. Client applications do not need to know which backend is active underneath the service. This separation is useful operationally because the model or engine can be changed in Atomic Chat without necessarily changing the client's API URL.
For this guide, leave the service on its default 127.0.0.1 binding. Changing the host to 0.0.0.0 makes it reachable through the machine's network interfaces and is intended for LAN exposure. That broader binding adds another network path and is unnecessary when Localtonet runs beside Atomic Chat on the same computer.
Do not change the Atomic Chat host to 0.0.0.0 merely because you plan to use a tunnel. A Localtonet client on the same computer can connect to 127.0.0.1:1337. Retaining loopback binding prevents unrelated LAN devices from reaching the API directly.
Verify the OpenAI-compatible API locally

Local verification is the most important diagnostic checkpoint in the workflow. If a request to 127.0.0.1:1337 fails on the Atomic Chat computer, a public tunnel will not repair the application, model, or local listener. Verify the service before installing or configuring remote access.
With Atomic Chat running and a model loaded, send the documented chat completion request. Replace the model placeholder with the identifier of the model currently loaded in Atomic Chat:
curl http://localhost:1337/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "<model-id-loaded-in-atomic-chat>",
"messages": [
{
"role": "user",
"content": "Say hello in one word"
}
]
}'
A successful response should be JSON in the OpenAI-compatible chat completion format. The exact generated text and timing depend on the loaded model and hardware. The relevant verification is that the server accepts the request, recognizes the model, performs inference, and returns a structured response instead of a connection or model error.
Verify with the OpenAI Python client
Atomic Chat's documented Python example uses the OpenAI client with a changed base_url. It supplies not-needed as the API key value because the example states that a real API key is not required by the local server.
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:1337/v1",
api_key="not-needed",
)
response = client.chat.completions.create(
model="<model-id-loaded-in-atomic-chat>",
messages=[
{
"role": "user",
"content": "Say hello in one word",
}
],
)
print(response.choices[0].message.content)
This example assumes that Python and a compatible OpenAI Python package are already installed. Those are client-side requirements, not requirements for the AppImage itself. The curl test is usually the smallest verification path because it avoids a language package and application configuration.
Interpret common local outcomes
| Observed result | Likely layer | Next check |
|---|---|---|
| A structured completion response | Application, model, and local API are working. | Proceed to Localtonet configuration. |
| Connection refused | No service is accepting connections at the requested address and port. | Confirm Atomic Chat is running and listening on port 1337. |
| Model-related error | The HTTP service responded, but the model identifier or model state is incorrect. | Load the intended model and copy the identifier recognized by Atomic Chat. |
| Request remains pending | Inference may still be loading, resource constrained, or unusually slow. | Test a short prompt in the desktop interface and inspect available system resources. |
| Port already in use | Another process may be occupying port 1337. |
Identify the conflicting local process before changing any documented default. |
On the Atomic Chat computer, localhost and 127.0.0.1 normally refer to the loopback interface. For the Localtonet target in this guide, use the explicit IPv4 target 127.0.0.1 with port 1337 so that the intended destination is unambiguous.
Connect Atomic Chat through a Localtonet HTTP tunnel
Configure remote access only after the local curl test succeeds. Install and run the Localtonet client on the same Linux computer as Atomic Chat. That placement allows our client to reach the loopback-only service without changing Atomic Chat's listener to 0.0.0.0.
An HTTP tunnel is appropriate because Atomic Chat exposes an HTTP API. The local target is 127.0.0.1 on port 1337. HTTP and File Server tunnels support Random Sub Domain, Custom Sub Domain, or Custom Domain process types, and each serves the configured content at a public HTTPS address. Availability of individual options can vary, so use only the choices currently presented for your account.
Install and run the Localtonet client
Run the Localtonet client on the Linux computer that is already running Atomic Chat and can reach 127.0.0.1:1337. Use the current installation method provided for your operating system. Do not copy an authentication token into a command, article, screenshot, or shared configuration.
Authenticate or select the client device
Use the device-specific authentication token through the supported Localtonet workflow, then confirm that the intended Linux device is selected. Tokens identify client devices and must be kept private.
Select an available relay server
Choose from the relay server or region values currently shown in the Localtonet dashboard. We do not hardcode server codes in this guide because available values can change by account, plan, region, or deployment.
Create the HTTP tunnel configuration
Choose an HTTP tunnel and an available process type. Set the local target IP address to 127.0.0.1 and the local port to 1337. Keep Atomic Chat running on the same computer.
Start the tunnel and record its public HTTPS URL
Creating a tunnel does not start it. Press Start, wait for the selected device and tunnel to be connected, and copy the assigned public HTTPS address. The tunnel remains available only while the selected client is connected and the tunnel is running.
Test the remote endpoint, then stop it when finished
Send a controlled request through the public address from an authorized remote client. When remote access is no longer required, stop the tunnel. Delete it if the configuration will not be reused.
The complete public API base URL is the assigned HTTPS origin followed by /v1. If the assigned origin is represented as https://your-assigned-host.example, the conceptual client configuration is:
https://your-assigned-host.example/v1
That hostname is an illustration, not an actual Localtonet endpoint. Always copy the real public URL assigned to your running tunnel. A chat completion request appends /chat/completions to the /v1 base:
curl "https://your-assigned-host.example/v1/chat/completions" \
-H "Content-Type: application/json" \
-d '{
"model": "<model-id-loaded-in-atomic-chat>",
"messages": [
{
"role": "user",
"content": "Reply with the word connected"
}
]
}'
Replace the illustrative origin and model placeholder before running the request. Never place a private Localtonet device token in the URL, JSON body, application repository, or client configuration.
Configure an OpenAI-compatible remote client
Most compatible clients separate the API base URL from the model name. Set the base URL to the real Localtonet HTTPS origin plus /v1. Set the model field to the identifier of the model loaded in Atomic Chat. If the client requires a nonempty API-key field even though the upstream Atomic Chat service does not validate one, a placeholder may satisfy that client's local configuration requirement, but it does not create authentication.
from openai import OpenAI
client = OpenAI(
base_url="https://your-assigned-host.example/v1",
api_key="not-needed",
)
response = client.chat.completions.create(
model="<model-id-loaded-in-atomic-chat>",
messages=[
{
"role": "user",
"content": "Reply with the word connected",
}
],
)
print(response.choices[0].message.content)
The documented Atomic Chat example says an API key is not needed. Supplying not-needed only satisfies software that expects a value in that field. It does not prove the caller's identity or prevent another party who knows the public URL from sending requests.
Secure remote access to the inference API
Local-only AI and public remote access have different trust boundaries. Atomic Chat's privacy benefits apply when inference, model data, and conversations remain on the local machine. Once a public endpoint is enabled, prompts and generated responses intentionally travel between remote clients and the local service. The deployment must therefore protect the public URL, client devices, application data, and model capacity.
A Localtonet HTTP tunnel provides a public HTTPS address and removes the need for inbound router port forwarding. It does not automatically add API-key authentication to an upstream application that does not require a key. Do not equate transport through an HTTPS endpoint with authorization to use the underlying inference service.
127.0.0.1, avoiding an additional LAN-accessible listener.
Recommended exposure pattern
For an individual temporary test, keep Atomic Chat and Localtonet on the same trusted Linux machine, retain the loopback binding, share the public URL only with the intended tester, monitor the test, and stop the tunnel immediately afterward. This minimizes the period in which the API is reachable.
For recurring access or multiple users, direct forwarding to the unauthenticated Atomic Chat API is not an appropriate final design. Add a local gateway that authenticates callers and enforces the controls required by your environment. The exact gateway configuration depends on the chosen software and organizational policy, so this article does not invent a universal command or claim a specific authentication mechanism is built into Atomic Chat.
Anyone able to reach an unauthenticated public inference URL may be able to submit prompts and consume the host's resources. Use authentication, least privilege, request controls, and a deliberately limited tunnel lifetime. A hard-to-guess hostname is not a substitute for authorization.
Operate the service reliably
Four runtime components must remain healthy: the Atomic Chat desktop process, the loaded model and inference backend, the Localtonet client, and the HTTP tunnel. A failure in any one of these layers interrupts remote requests.
Start services in a testable order
Start Atomic Chat first, load the intended model, and repeat the local curl request. Then start the Localtonet client and tunnel. Finally, test through the public HTTPS URL. This order makes failures easier to isolate because every layer is verified before the next one is added.
Stop exposure without deleting the local setup
Stopping the Localtonet tunnel removes the public path while allowing Atomic Chat to continue serving local clients. This is useful when the local application should remain open but remote access is needed only during scheduled periods. Deleting the tunnel is appropriate when the public configuration will not be reused.
Change models carefully
A client request names a model. If the active model changes, remote clients may also need an updated model identifier. Verify the new model locally before resuming the public tunnel. Clients can continue using the same /v1 base URL while Atomic Chat changes the underlying inference engine, but the model field must still match a model recognized by the running service.
Account for inference latency
Local inference can take longer than a typical cloud API request, particularly while a model is loading or when the host is resource constrained. A client with an aggressive request timeout may fail even though Atomic Chat eventually produces a result. Adjust client-side timeout behavior based on measured local response times, but do not assign an arbitrary universal value because performance depends on the machine and model.
Preserve a local health check
Keep the local curl request available as a health check. If remote calls fail, run it directly on the Atomic Chat machine. A successful local request points toward the Localtonet client, tunnel state, public URL, or remote client configuration. A failed local request points toward Atomic Chat, the loaded model, or the local port.
Troubleshoot installation, API, and tunnel failures

| Problem | What it usually indicates | Recommended diagnostic path |
|---|---|---|
| The AppImage does not launch | The file may lack executable permission, have the wrong architecture, be incomplete, or encounter a distribution-specific runtime issue. | Confirm x86_64 compatibility, recheck the executable bit, run the file from a terminal, and preserve the exact error. |
| Atomic Chat opens but cannot answer | No model is loaded, the model files are incomplete, or the model exceeds available resources. | Load a suitable model and test a short prompt inside the desktop interface. |
| Local curl reports connection refused | The HTTP service is not accepting connections on localhost:1337. |
Confirm Atomic Chat is running, keep it open, and check whether another process conflicts with port 1337. |
| The API returns a model error | The request names a model that is not loaded or not recognized. | Use the exact identifier of the model active in Atomic Chat rather than guessing a provider-style model name. |
| Local requests work but remote requests fail | The application layer is healthy, so the issue is likely the Localtonet client, tunnel state, target, URL, or remote configuration. | Confirm the selected device is connected, the tunnel is started, and its target is 127.0.0.1:1337. |
| The remote client receives a route error | The API path may be missing or duplicated. | Use the public origin plus /v1 as the base URL, then let the compatible client append the chat completion route. |
| The Python client rejects an empty key | The client library requires a field even though Atomic Chat does not require a real key. | Use a non-secret placeholder only if required, while recognizing that it adds no authentication. |
| Requests time out under load | The model may be loading or the computer may lack sufficient available resources for the requested workload. | Test one short local request, observe resource use, reduce concurrent demand, or select a model better matched to the hardware. |
| The tunnel disappears after a restart | The Localtonet client, Atomic Chat, model, or tunnel may not be running. | Check each layer explicitly. A created tunnel is not active until it is started, and it works only while the selected client is connected. |
Check the target from the Localtonet machine
If Localtonet and Atomic Chat run on the same Linux computer, rerun the local curl test there. Do not test 127.0.0.1:1337 from another computer and expect it to reach the Atomic Chat host. Every machine has its own loopback interface.
Check the base URL for duplicate paths
Some client settings expect an API base such as https://assigned-host/v1, while the client library automatically appends /chat/completions. If a user enters the complete chat completion path into a base URL field, the client may append another route and produce an invalid URL. Inspect the final requested path when possible.
Separate authorization errors from inference errors
If you add an authenticated gateway, test it as a distinct layer. An authorization rejection means the gateway received the request but did not accept the credentials or policy. A model error means the request progressed far enough to reach an application layer that evaluated the model field. Keeping these layers conceptually separate makes troubleshooting faster.
When to build Atomic Chat from source instead
Most readers should use the released AppImage. A source build is more appropriate for contributors, developers testing unreleased changes, or users who need to inspect and modify the desktop application. The documented source prerequisites are Node.js 20 or newer, Yarn 4.5.3 or newer, Make, and Rust. The project provides a make dev workflow.
Do not mix AppImage troubleshooting with source-build troubleshooting. The AppImage is a released application package, while the development workflow introduces JavaScript dependencies, Rust tooling, compiler requirements, repository state, and development services. Those additional layers create failure modes that do not exist in the normal AppImage setup.
| Installation path | Best for | Documented requirements |
|---|---|---|
| Linux AppImage | Running a released Atomic Chat desktop build with minimal setup | Compatible Linux x86_64 system and permission to execute the downloaded file |
| Source development workflow | Contributing, modifying code, or testing development changes | Node.js 20+, Yarn 4.5.3+, Make, Rust, and the project source tree |
| LAN binding | Direct access from trusted devices on the local network | Changing the documented host from 127.0.0.1 to 0.0.0.0, plus appropriate network security |
| Localtonet HTTP tunnel | Controlled remote connectivity without inbound router port forwarding | A working Atomic Chat API, connected Localtonet client, HTTP tunnel, and suitable access controls |
The supplied evidence confirms the prerequisite versions and make dev workflow but does not provide enough verified detail here to reproduce every repository checkout, dependency installation, system package, or build artifact step safely. For that reason, this tutorial does not invent a complete source-build command sequence. The AppImage remains the documented installation path covered end to end.
Frequently asked questions
What URL does Atomic Chat use for its OpenAI-compatible API?
The documented local base URL is http://localhost:1337/v1. Chat completion requests use http://localhost:1337/v1/chat/completions. A model must be loaded in Atomic Chat before a completion request can succeed.
Must I change Atomic Chat from 127.0.0.1 to 0.0.0.0 for Localtonet?
No, not when the Localtonet client runs on the same Linux computer. Our client can forward the tunnel to 127.0.0.1:1337. Changing the host to 0.0.0.0 is documented for LAN exposure and creates an additional network-accessible path that is unnecessary in this layout.
Does Atomic Chat require an API key?
The documented local example states that an API key is not needed. Some OpenAI-compatible client libraries still require a nonempty configuration value, so the project example uses not-needed. That placeholder is not authentication and does not secure a public endpoint.
Does a Localtonet HTTP tunnel automatically protect the API with an API key?
No. The HTTP tunnel provides a public HTTPS path to the configured local service, but it does not turn Atomic Chat's placeholder key into application authentication. For ongoing or shared access, place an appropriate authenticated gateway in front of the local API and apply least-privilege controls.
Can an IDE or AI agent use the remote endpoint?
It can if it supports an OpenAI-compatible API and allows a custom base URL. Configure the base as the assigned Localtonet HTTPS origin followed by /v1, then select the model identifier loaded in Atomic Chat. Client-specific capabilities and configuration fields vary.
Why does the local curl request need to work before creating the tunnel?
Localtonet forwards traffic to the configured local target. It cannot load an Atomic Chat model, start the inference service, correct a model identifier, or resolve a local port conflict. A successful local request proves that the target application is ready before remote connectivity is added.
Does the Atomic Chat AppImage support every Linux distribution?
The available project information identifies a Linux x86_64 AppImage but does not provide a verified list of every supported distribution. If launch fails, run the AppImage from a terminal, preserve the exact error, and evaluate it against the current Atomic Chat release and your distribution's AppImage requirements.
Will the public API remain available after I close Atomic Chat?
No. Atomic Chat must remain running with the model available. The Localtonet client must also remain connected, and the tunnel must be started. Closing the application, disconnecting the selected device, or stopping the tunnel interrupts the end-to-end path.
Connect your verified Atomic Chat API with Localtonet
Once http://localhost:1337/v1/chat/completions works on your Linux machine, create an HTTP tunnel to 127.0.0.1:1337, add suitable access controls, and give authorized OpenAI-compatible clients a controlled remote path to your local model.