27 min read

Set Up FlyEnv and Share a Dev Site with Localtonet

Install and verify FlyEnv as an XAMPP alternative, then share a selected local development site through a Localtonet HTTP tunnel.

A FlyEnv local site reaches a remote browser through a Localtonet HTTP tunnel.
FlyEnv serves the site locally while Localtonet provides the remote HTTP path.
Development · FlyEnv · Localtonet · 2026

Build a native local development stack, verify the site, and publish only the web endpoint you intend to share

FlyEnv provides a desktop workspace for running local runtimes, databases, web servers, project sites, and HTTPS on Windows, macOS, and Linux. In this guide, we explain how to choose and install the correct FlyEnv package, assemble a project-specific stack, start a local site, and verify its real address without assuming a universal port. Once the application works locally, we show how to expose that selected HTTP service through Localtonet. The result is a public HTTPS address for the development site without inbound router port forwarding, firewall changes, VPN setup, or a public IP address.

🔒 Publish the web application, not its database 🌐 Local site to public HTTPS address ⚡ Native development workflow without required containers

When FlyEnv is a practical XAMPP alternative

A local development environment usually has several moving parts. A PHP application might need PHP itself, a web server, a database, Redis, and Node.js for front-end assets. A Python project might need Python, PostgreSQL, Redis, and Nginx. Installing and maintaining each component separately can create version conflicts, scattered configuration files, and inconsistent startup procedures.

FlyEnv approaches this problem as a native desktop workspace. It can manage runtimes such as PHP, Node.js, Python, Java, Go, .NET, Ruby, Rust, Bun, and Deno; databases such as MySQL, MariaDB, PostgreSQL, MongoDB, ClickHouse, Neo4j, and Qdrant; and web or application servers including Nginx, Apache, Caddy, FrankenPHP, and Tomcat. It also covers supporting services such as Redis, Memcached, RabbitMQ, Elasticsearch, Meilisearch, MinIO, and RustFS.

This broader scope is the main reason to consider FlyEnv when moving beyond XAMPP. XAMPP is familiar to many PHP developers because it bundles a conventional Apache, database, and PHP workflow. FlyEnv addresses a similar local-development need while supporting more runtime families, web servers, databases, and project-level configurations. It can also switch runtime versions by project, define project start and stop commands, create local domains, enable local HTTPS, and configure reverse proxies.

🧩 One workspace for the stack Keep runtimes, databases, web servers, local sites, supporting services, configurations, and logs in one desktop workflow instead of managing unrelated installers.
🔀 Project-specific versions Select runtime versions for individual projects rather than forcing every local application to use the same PHP, Node.js, or Python version.
🌐 Local sites and reverse proxies Create local domains such as myapp.test, connect projects to Nginx, Apache, or Caddy, and use reverse proxies where the application runs on its own port.
🔒 Local HTTPS support FlyEnv can create local sites with certificates and trusted HTTPS URLs, avoiding the need to manage hosts-file and certificate tooling manually for supported workflows.
💻 Native local services FlyEnv runs installed services directly on the operating system. A container configuration is not required for ordinary local development.
📦 Cross-platform packages Official installation choices cover Windows, Intel and Apple Silicon macOS systems, and x86_64 or ARM64 Linux distributions using DEB or RPM packages.

Native operation and containerized operation are not interchangeable. Docker remains useful when a team needs an explicitly containerized environment, reproducible images, or close parity with a container-based deployment. FlyEnv is better aligned with developers who want a desktop-managed native stack and do not need container parity for the current task.

Approach Good fit Important consideration
FlyEnv Native multi-runtime projects, local sites, version switching, and desktop-managed services The project still needs an intentional combination of runtime, server, database, and port settings
XAMPP-style stack A familiar PHP, Apache, and database development workflow It may not cover the broader runtime and infrastructure mix required by modern multi-language projects
Docker Containerized reproducibility, image-based distribution, and production parity It introduces container definitions and operational concepts that may be unnecessary for a simple native workflow

Prerequisites and decisions to make first

Before installing anything, identify what the application actually needs. FlyEnv can manage many technologies, but that does not mean every project needs all of them. A small static site might require only a static HTTP server. A Laravel application can require PHP, a database, Node.js, Redis, and Nginx. A Django application can use Python, PostgreSQL, Redis, and Nginx. Installing unnecessary services increases resource use and expands the number of components that can fail.

Choose the correct operating-system package

FlyEnv supports Windows, macOS, and Linux. Windows users can choose an installer or portable executable. macOS users can install through Homebrew or use a DMG package, with separate packages for Intel and Apple Silicon hardware. Linux packages are supplied in DEB and RPM formats for x86_64 and ARM64 systems.

Confirm both the operating system and processor architecture before downloading. An ARM64 package is intended for ARM64 hardware, while an x86_64 package is intended for 64-bit Intel or AMD systems. On macOS, Apple Silicon systems require the ARM64 build, while older Intel Macs use the Intel package.

Know the project requirements

Record the runtime and version expected by the codebase, the document root or application directory, the database engine, and any auxiliary services. Use the project lock files, dependency manifests, environment template, or team documentation to make these choices. FlyEnv can switch versions, but it cannot determine whether a project was written for a particular PHP, Node.js, Python, Java, or database release unless that requirement is defined by the project.

You should also determine how the application starts. Some applications are served directly from a document root by Nginx or Apache. Others start their own development server on a project-defined port and then sit behind a reverse proxy. FlyEnv supports project start and stop commands and project-defined ports, but the exact command and port belong to the application. There is no safe universal command to substitute for the project’s documented startup process.

Plan the local endpoint before remote access

FlyEnv does not define one universal hostname or port for every site. A site might use a local domain such as myapp.test, an HTTP listener on a selected port, a local HTTPS address, or a reverse proxy connected to an application server. Therefore, this guide does not claim that every FlyEnv site runs on port 80, 443, 3000, 8000, or any other fixed value.

Write down the actual local IP address and port that will accept HTTP requests from the machine running the Localtonet client. A loopback address such as 127.0.0.1 is appropriate only when the Localtonet client runs on the same computer and the application listens there. If the client runs on another device, the service must be reachable from that device through an appropriate local address, and the application must intentionally listen on an interface that permits that connection.

Do not begin by publishing the database

The goal of this workflow is to share a development website over HTTP. MySQL, PostgreSQL, Redis, MongoDB, administrative dashboards, debugging consoles, and similar backend services should remain private unless there is a separate, reviewed requirement for remote access. Exposing the web application gives collaborators a narrower interface and avoids publishing internal service ports by default.

Install FlyEnv on Windows, macOS, or Linux

Use an official FlyEnv package that matches the operating system and processor architecture. Version 4.18.2 is the specific release represented in the evidence used to prepare this guide, but release versions change. Check the current official FlyEnv download or release page before installation rather than assuming that this remains the latest version.

Windows installation

FlyEnv provides two Windows distribution styles. The installer is named in the versioned form FlyEnv-Setup-<version>.exe. The portable package is named FlyEnv-Portable-<version>.exe. For version 4.18.2, the documented filenames are FlyEnv-Setup-4.18.2.exe and FlyEnv-Portable-4.18.2.exe.

Choose the installer when you want a conventional installed application. Choose the portable executable when you specifically prefer a portable distribution. Download the selected executable, verify that it came from the official FlyEnv release channel, and run it using the normal Windows application procedure. If Windows presents a security prompt, verify the publisher and package origin rather than dismissing the warning automatically.

The available evidence establishes the installer and portable package choices but does not document every page or checkbox displayed by the current Windows installer. Those details can change between releases, so this guide does not invent a sequence of installer screens. Complete the prompts presented by the signed package, then launch FlyEnv.

macOS installation

Homebrew users can install FlyEnv with the documented command:

brew install flyenv

FlyEnv also provides DMG packages. Select the Intel DMG for an Intel Mac or the ARM64 DMG for a Mac with Apple Silicon. Open the correct DMG and complete the standard macOS application installation process. Do not install the Intel package merely because it is listed first, and do not select ARM64 without confirming the processor architecture.

macOS may apply security controls to newly downloaded applications. Review the package origin and any system prompt carefully. Avoid weakening system-wide protections merely to make an installation prompt disappear.

Linux installation

FlyEnv publishes DEB and RPM packages for both x86_64 and ARM64 Linux systems. Choose DEB for a distribution that uses Debian packages and RPM for a distribution that uses RPM packages. Then select the architecture matching the computer.

Platform Available installation format Selection rule
Windows Installer executable or portable executable Choose between conventional installation and portable use
macOS Homebrew, Intel DMG, or Apple Silicon DMG Match the DMG to Intel or ARM64 hardware
Linux DEB or RPM for x86_64 and ARM64 Match both the distribution package family and processor architecture

Package installation commands differ among Linux distributions and package managers. The supplied official evidence confirms the package formats but does not establish one universal installation command or dependency-repair sequence. Use the graphical package installer or the documented local-package procedure for the specific distribution. This avoids publishing a command that is correct for one Linux family but wrong for another.

First launch checks

After installation, open FlyEnv and confirm that the application starts normally. At this stage, do not expect a project website to exist automatically. FlyEnv is the management workspace. You still need to select the project’s runtime and services, connect the application directory, and define how the site is served.

If FlyEnv starts but a needed runtime or service is not ready, use the application’s module and service management capabilities to prepare that component. The exact current controls can vary by release and platform. Follow the labels shown in the installed version rather than relying on an outdated screenshot.

Configure a FlyEnv project and local site

Project files flow through a FlyEnv web runtime to a localhost endpoint and browser.
The project root, runtime, and local port must refer to the same FlyEnv site.

The correct stack is determined by the application, not by FlyEnv or Localtonet. Start with the smallest working set of components. Add services only when the application requires them.

1

Identify the application runtime and version

Determine whether the project requires PHP, Node.js, Python, Java, Go, or another supported runtime. Select a version compatible with the project’s dependencies. Do not automatically choose the newest runtime if the application specifies an older supported version.

2

Prepare only the required supporting services

Configure the database, cache, queue, search service, or object storage required by the project. For example, a project might use MySQL and Redis, while another uses PostgreSQL without a cache. Keep service credentials local and follow the application’s own configuration requirements.

3

Connect the project directory

Associate the application’s real local directory with the FlyEnv project or local-site workflow. For document-root applications, select the directory the web server is supposed to serve. For applications with their own server process, retain the project’s documented working directory and startup command.

4

Choose the web-serving model

Use Nginx, Apache, Caddy, another suitable server, or the project’s own HTTP process according to the application’s requirements. If the application runs on its own port, FlyEnv can support a reverse-proxy workflow. Record the selected local domain, IP address, protocol, and port.

5

Define project lifecycle details

If the project requires explicit start and stop commands, configure the commands established by that project. FlyEnv supports project-defined commands and ports, but there is no universal command that applies safely to every framework.

6

Start the stack in dependency order

Start required databases and supporting services, the application runtime or process, and the selected web server or reverse proxy. Confirm that each required component remains running before testing the website.

Local domain, direct port, or reverse proxy?

A local domain such as myapp.test is convenient for browser-based development and can represent a site served through Nginx, Apache, or Caddy. A direct project port is useful when a framework starts its own HTTP server. A reverse proxy combines the two by accepting requests through a local site and forwarding them to the application process.

For the later Localtonet step, the most important value is the actual HTTP listener that accepts the request. A browser successfully resolving myapp.test does not by itself prove that a request addressed directly to the listener’s IP and port will select the same virtual host. Name-based virtual hosting can show a default site when the expected hostname is absent.

Record the endpoint instead of assuming it

Keep a simple note containing the local protocol, IP address, port, and expected application page. FlyEnv supports local domains, HTTPS, reverse proxies, and project-defined ports, so there is no universal FlyEnv target that we can safely provide. The Localtonet HTTP tunnel must use the endpoint created for your site.

Verify the site locally before creating a tunnel

Remote-access troubleshooting is much easier when the local application is already known to work. A tunnel forwards traffic to a local target. It does not repair a failed runtime, create a missing database, run migrations, correct an invalid document root, or start a stopped web server.

Test the exact local site

Open the FlyEnv-managed site in a browser on the same machine. Use the domain and protocol you configured, or the project’s actual loopback address and port. Do not substitute a common development port unless it is genuinely the configured port.

Check more than the first HTML response. Load stylesheets, JavaScript, images, and a representative application route. If the application has a login screen, test it locally with a non-sensitive development account. If it performs database-backed operations, confirm that at least one safe read or write action succeeds.

Confirm the listener needed by Localtonet

The Localtonet client needs an IP address and port that it can reach. When FlyEnv and Localtonet run on the same computer, a service listening on loopback can normally be targeted through that machine’s loopback address. When they run on different devices, loopback points to the client device itself, not to the FlyEnv computer. In that arrangement, use an address reachable from the Localtonet client and configure the service intentionally for that local-network access.

Test the actual target separately from a friendly local domain when possible. If the domain works but the IP and port show another site, the web server is probably selecting content by hostname. Do not assume that a tunnel option exists to rewrite that hostname. Current Localtonet dashboard capabilities and HTTP tunnel settings should be checked before relying on any host-header behavior not documented in this guide.

Resolve local HTTPS questions before sharing

FlyEnv can create trusted local HTTPS sites, while Localtonet HTTP and File Server process types provide a public HTTPS address. These are different connections. Public HTTPS at the tunnel edge does not establish that an HTTP tunnel should be pointed blindly at a local HTTPS-only listener.

For this workflow, use a known working local HTTP listener as the Localtonet HTTP target. If the FlyEnv site is available only through local HTTPS, consult the current tunnel documentation and select a documented tunnel configuration that matches the origin protocol. Do not enter an HTTPS port into an HTTP target merely because both ultimately display a website.

Stop if the local test is incomplete

Do not create the public tunnel while the local page returns an error, redirects unexpectedly, shows the wrong virtual host, or cannot reach its required database. Fix the FlyEnv project first. Otherwise, the public endpoint will reproduce or obscure the same local failure.

Share the FlyEnv development site with Localtonet

HTTP traffic passes from a public tunnel URL through Localtonet to the FlyEnv localhost site.
The tunnel forwards public HTTP requests to the selected local FlyEnv endpoint.

Once the exact HTTP service works locally, Localtonet can expose it without requiring inbound router port forwarding, firewall changes, VPN setup, or a public IP address. Our client application establishes an outbound connection to a Localtonet relay server. The HTTP tunnel then provides a public HTTPS address that forwards requests to the selected local IP address and port.

Keep the two layers separate in your mental model. FlyEnv manages the development runtime, supporting services, local web server, and site. Localtonet provides remote reachability to the already working HTTP endpoint. Creating a tunnel does not start the FlyEnv project, and starting the project does not automatically start its Localtonet tunnel.

1

Install and run the Localtonet client

Install our client application on the computer running FlyEnv or on a device that can reach the verified FlyEnv HTTP endpoint. Keep the client running because it establishes the outbound connection used by the tunnel.

2

Authenticate and select the client device

Use the device-specific authentication token associated with the client that will carry the tunnel. Treat this token as a credential. Do not place it in screenshots, repositories, application configuration committed to source control, or shared tutorial output.

3

Select an available relay server

Choose from the server or region values currently available in the Localtonet dashboard. Availability can vary, so this guide does not hardcode a relay code or claim that a particular region is included for every account.

4

Create an HTTP tunnel for the verified target

Select the HTTP tunnel family and enter the local IP address and port recorded during verification. For a site on the same machine as our client, this can be the verified loopback listener. Use a generated subdomain, a selectable subdomain where supported, or a custom domain process type according to the current options available to your account.

5

Start the tunnel and test the public address

Creating a tunnel does not mean that it is running. Press Start, wait for the selected device and tunnel to be connected, and open the assigned public HTTPS address. Test the same representative routes and assets used in the local verification.

6

Stop or delete the tunnel when sharing is finished

Stop the tunnel when remote access is no longer required. Delete it if the configuration will not be reused. The public endpoint is available only while the selected client device is connected and the tunnel is running.

The exact Localtonet relay values and available process-type choices must come from the current dashboard rather than from a copied example. Custom-domain DNS requirements can also change, so check the current Localtonet HTTP tunnel documentation before configuring DNS. For temporary reviews, a generated public address avoids introducing custom-domain DNS into the initial test.

Test the public result as a remote visitor

Open the assigned address from a separate browser profile or another device. This helps reveal assumptions hidden by an existing local session. Check navigation, static files, form submissions, API requests, authentication, redirects, and any absolute URLs generated by the application.

A page can render while still producing links to localhost, a local domain, or an internal port. Those links work only on the developer’s machine. Correct the application’s development base URL, proxy awareness, or asset configuration according to the framework’s documented process. Do not publish production secrets merely to make a temporary development URL work.

Security boundaries for a shared development site

Only the selected development site crosses the public boundary; local files and services remain private.
A tunnel exposes the selected site, so secrets and unrelated local services should remain outside its routes.

A development application often exposes more information than a production deployment. Detailed exception pages, framework profilers, database inspectors, seed accounts, mail previews, source maps, and administrative tools are useful locally but risky on a public address. Treat the tunnel URL as internet-accessible even when it is intended for only one reviewer.

🎯 Expose one intentional service Point the HTTP tunnel at the selected development website. Do not automatically create tunnels for databases, caches, queues, or management interfaces.
🔑 Require application authentication Protect private routes with the application’s normal access controls. A hard-to-guess public URL is not a substitute for authentication.
🧪 Use non-production data Share synthetic or sanitized records. Avoid loading customer data, production credentials, private keys, or live payment settings into the exposed environment.
🐞 Review debug output Disable or restrict pages that reveal stack traces, environment variables, filesystem paths, SQL statements, or framework configuration.
⏹️ Limit the exposure window Start the tunnel for the review or webhook test, then stop it when the task is complete. Stop the local stack when it is no longer needed.
🛡️ Follow least privilege Give development database accounts and application users only the permissions needed for the test. Apply available access controls and IP restrictions where relevant.
A public tunnel does not remove the need for authorization

Localtonet provides connectivity to the selected service. It should not be used to bypass organizational security rules or application authorization. Obtain approval for public exposure, keep application authentication enabled, protect the device token, and stop the tunnel promptly when the remote workflow ends.

Be especially careful with development conveniences. An application that permits arbitrary file uploads, executes queued tasks, sends email, or reaches other systems can have effects beyond the visible browser session. Replace integrations with development-safe equivalents where the framework supports them, and verify that testing cannot contact real customers or modify production resources.

Troubleshooting FlyEnv and Localtonet together

FlyEnv opens, but the site does not

Confirm that every required component is running. A web server can be healthy while PHP is unavailable, or an application process can be running while its database is stopped. Review the relevant service and application logs available through the FlyEnv workspace. Verify the runtime version, project directory, document root, project startup command, and database configuration against the project’s actual requirements.

The local domain works, but the IP and port show another site

This commonly indicates name-based virtual-host selection. The web server uses the hostname to decide which site should answer. Verify the local listener, virtual-host configuration, and reverse-proxy design. Do not assume that changing the tunnel port will correct a hostname mismatch.

One practical design is to give the application a dedicated local HTTP listener that unambiguously reaches the intended project. The precise FlyEnv configuration depends on the web server and project, and the available evidence does not establish one universal sequence for creating that listener. Avoid inventing host-header or origin-rewrite settings in either product.

The tunnel is created, but the public address is unavailable

Check the tunnel lifecycle first. A saved configuration is not automatically active. The selected Localtonet client device must be connected, and the tunnel must have been started. If the client was closed, the computer slept, or connectivity was interrupted, restore the client connection and verify the tunnel status.

Next, retest the local IP and port from the client device. If Localtonet runs on another machine, remember that 127.0.0.1 refers to that other machine. Use an intentionally reachable local-network address and permit only the required local connectivity.

The public address returns a connection error

A connection error usually means that no compatible service is accepting traffic at the configured target, the application has stopped, the port is wrong, or the service listens on a different interface. Compare the tunnel target with the address recorded during local verification. Also confirm that an HTTP tunnel points to a working HTTP service rather than a database, raw TCP service, or HTTPS-only listener.

The page loads without styles or scripts

Inspect the generated asset URLs. If they point to localhost, myapp.test, a private address, or an unavailable port, a remote browser cannot retrieve them. Configure the framework’s public development URL or proxy behavior using its documented settings. Also verify that the asset-building process is running if the project compiles front-end resources.

Redirects return visitors to a local address

Applications frequently generate absolute redirects from a configured base URL or from their interpretation of proxy headers. Update the project’s development URL configuration for the temporary public address where appropriate. Because frameworks use different variables and trusted-proxy models, there is no safe universal environment-variable name to provide here.

The application reports database or cache failures

This is a local stack problem rather than a tunnel problem. Confirm that the required database or cache is running in FlyEnv, the application has the correct development credentials, and the schema or migrations have been prepared according to the project. Keep these backend ports private while diagnosing them.

The application works until the computer sleeps

The Localtonet public endpoint depends on the selected client being connected and the tunnel running. The FlyEnv services must also remain active. Sleep, shutdown, network changes, client termination, or stopped project services interrupt access. Restore the local stack first, verify it locally, and then confirm that our client and tunnel are connected.

Symptom Likely layer First check
Local and public pages both fail FlyEnv project or application Runtime, web server, project process, logs, and dependencies
Local page works but public address does not connect Localtonet client, lifecycle, or target Client connection, tunnel Start status, local IP, and actual port
Public HTML loads but assets fail Application URL generation Absolute asset URLs, base URL, and front-end build process
Wrong site appears through the target Web-server virtual host Hostname selection, listener, and reverse-proxy configuration
Public access stops after sleep or restart Service lifecycle FlyEnv services, Localtonet client, and tunnel running state

Frequently asked questions

Is FlyEnv a direct replacement for XAMPP?

FlyEnv addresses the same broad need for a manageable local development stack, but it is not limited to the conventional Apache, database, and PHP combination. It supports multiple runtimes, databases, web servers, local sites, HTTPS, reverse proxies, and project-specific versions. Migration still requires matching the original project’s runtime, document root, database, and server behavior.

Does every FlyEnv site use the same port?

No. FlyEnv supports local domains, multiple web servers, reverse proxies, HTTPS, and project-defined ports. Use the actual protocol, IP address, and port configured for the selected site. Do not assume a port based on the framework or on another developer’s setup.

Which Localtonet tunnel type should I use for a FlyEnv website?

Use an HTTP tunnel for a verified local HTTP website or web application. Configure its local target with the IP address and port that serve the selected site. Databases and other non-HTTP services are separate use cases and should not be exposed by default.

Do I need router port forwarding to share the site?

No. Our client establishes an outbound connection to a Localtonet relay server, so this workflow does not require inbound router port forwarding, firewall changes, VPN setup, or a public IP address. The selected client and tunnel must remain connected and running.

Can Localtonet start my FlyEnv project automatically?

The workflow documented here treats them as separate lifecycle layers. FlyEnv starts and manages the local project services. Localtonet exposes the already running endpoint. Verify the FlyEnv site locally before starting the tunnel.

Can I share a local domain such as myapp.test?

A FlyEnv local domain can identify the site in your local browser, but the Localtonet HTTP tunnel requires a local IP address and port target. Verify that the target selects the intended site. If the server depends on a particular hostname, review the current HTTP tunnel capabilities and your web-server configuration instead of assuming automatic hostname rewriting.

Should I expose MySQL, PostgreSQL, or Redis with the website?

Not for the normal website-sharing workflow. Keep backend services private and expose only the application’s HTTP interface. If a separate raw-port access requirement exists, review it independently, apply authentication and least privilege, and obtain the appropriate authorization before creating another tunnel.

Will the public development URL remain available after I close the client?

No. A Localtonet tunnel is available only while the selected client device is connected and the tunnel is running. The FlyEnv web application and all services it requires must also remain active.

Share your verified FlyEnv site with Localtonet

Start the project locally, identify its real HTTP address and port, and then create a Localtonet HTTP tunnel for that single verified endpoint. Keep backend services private, test the public result, and stop the tunnel when the development review is complete.

Get Started Free →

Localtonet is a secure multi-protocol tunneling and proxy platform designed to expose localhost, devices, private services, and AI agents to the public internet supporting HTTP/HTTPS tunnels, TCP/UDP forwarding, mobile proxy infrastructure, file server publishing, latency-optimized game connectivity, and developer-ready AI agent endpoint exposure from a single unified control plane.

support