# Inngest Apps
Source: https://www.inngest.com/docs/apps/index

In Inngest, apps map directly to your projects or services. When you serve your functions using our serve API handler, you are hosting a new Inngest app. With Inngest apps, your dashboard reflects your code organization better.

It's important to note that apps are synced to one environment. You can sync any number of apps to one single environment using different Inngest Clients.

The diagram below shows how each environment can have multiple apps which can have multiple functions each:

[IMAGE]

[IMAGE]

## Apps in SDK

Each [`serve()` API handler](/docs/learn/serving-inngest-functions) will generate an app in Inngest upon syncing.
The app ID is determined by the ID passed to the serve handler from the Inngest client.

For example, the code below will create an Inngest app called “example-app” which contains one function:

<CodeGroup>
```ts {{ title: "Node.js" }}
// or your preferred framework
new Inngest({ id: "example-app" });

serve({
  client: inngest,
  functions: [sendSignupEmail],
});
```

```python {{ title: "Python (Flask)" }}
import logging
import inngest
from src.flask import app
import inngest.flask

logger = logging.getLogger(f"{app.logger.name}.inngest")
logger.setLevel(logging.DEBUG)

inngest_client = inngest.Inngest(app_id="flask_example", logger=logger)

@inngest_client.create_function(
    fn_id="hello-world",
    trigger=inngest.TriggerEvent(event="say-hello"),
)
def hello(ctx: inngest.ContextSync) -> str:

inngest.flask.serve(
    app,
    inngest_client,
    [hello],
)

app.run(port=8000)
```

```python {{ title: "Python (FastAPI)" }}
import logging
import inngest
import fastapi
import inngest.fast_api

logger = logging.getLogger("uvicorn.inngest")
logger.setLevel(logging.DEBUG)

inngest_client = inngest.Inngest(app_id="fast_api_example", logger=logger)

@inngest_client.create_function(
    fn_id="hello-world",
    trigger=inngest.TriggerEvent(event="say-hello"),
)
async def hello(ctx: inngest.Context) -> str:
    return "Hello world!"

app = fastapi.FastAPI()

inngest.fast_api.serve(
    app,
    inngest_client,
    [hello],
)
```

```go {{ title: "Go (HTTP)" }}
package main

import (
	"context"
	"fmt"
	"net/http"
	"time"

	"github.com/inngest/inngestgo"
	"github.com/inngest/inngestgo/step"
)

func main() {
	client, err := inngestgo.NewClient(inngestgo.ClientOpts{
		AppID: "sandbox-go",
	})
	if err != nil {
		panic(err)
	}
	f, err := inngestgo.CreateFunction(
		client,
		inngestgo.FunctionOpts{
			ID:   "account-created",
			Name: "Account creation flow",
		},
		// Run on every api/account.created event.
		inngestgo.EventTrigger("api/account.created", nil),
		AccountCreated,
	)
	if err != nil {
		log.Fatal(err)
	}
	http.ListenAndServe(":8080", f.Serve())
}
```

</CodeGroup>

<Callout>
Each app ID is considered a persistent identifier. Changing your client ID will result in Inngest not recognizing the app ID during the next sync. As a result, Inngest will create a new app.
</Callout>

## Apps in Inngest Cloud

In the image below, you can see the apps page in Inngest Cloud. Check the [Working with Apps Guide](/docs/apps/cloud) for more information about how to sync apps in Inngest Cloud.

[IMAGE]

## Apps in Inngest Dev Server

In the image below, you can see the apps page in Inngest Dev Server. For more information on how to sync apps in Inngest Dev Server check the [Local Development Guide](/docs/local-development#connecting-apps-to-the-dev-server).

[IMAGE]

## Informing Inngest about your apps

To integrate your code hosted on another platform with Inngest, you need to inform Inngest about the location of your app and functions.

For example, imagine that your `serve()` handler is located at `/api/inngest`, and your domain is `myapp.com`. In this scenario, you will need to sync your app to inform Inngest that your apps and functions are hosted at `https://myapp.com/api/inngest`.

To ensure that your functions are up to date, you need to resync your app with Inngest whenever you deploy new function configurations to your hosted platform.

<Callout>

Inngest uses the [`INNGEST_SIGNING_KEY`](/docs/platform/signing-keys?ref=deploy) to securely communicate with your application and identify the correct environment to sync your app.

</Callout>

## Next Steps
To continue your exploration, feel free to check out:
- How to [work with Apps in the Dev Server](/docs/local-development#connecting-apps-to-the-dev-server)
- How to [work with Apps in Inngest Cloud](/docs/apps/cloud)