---
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
# 
# http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

layout: docpage
title: Run the application
description: Running the application in a browser
permalink: /create-an-application/application-tutorial/deploy
---

# Run the application

Running the application in a browser

Assuming you followed the typical directory and file pattern, and the [MXML](features/mxml) file was in a `src` directory, next to the `src` directory should be a `bin` directory with a `js-debug` directory inside it.

Inside the `js-debug` directory is an `index.html` file. You can open it in your browser and you should see the list of commits appear.

You should see something like this:

<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" 
width="100%" height="350" 
src="assets/application-tutorial/index.html"></iframe>

Or maybe the commits won't appear. In fact, many browsers will not run this app successfully. Let's figure out why.

{:align="center"}
[Previous Page](create-an-application/application-tutorial/build) \| [Next Page](create-an-application/application-tutorial/debug)

