---
title: "Static Assets\n"
space: "Framework"
url: "https://docs.frappe.io/framework/user/en/basics/static-assets"
updated: "2026-02-17"
---


A guide to understanding how static assets are served in Frappe Framework.

## The `assets` folder

Static files are served from the `frappe-bench/sites/assets` folder. When you
set up frappe for production deployment, nginx serves this folder directly. All
static file URLs always start with `/assets`. A file at the location
`frappe-bench/sites/assets/hero.png` is accessible publicly via the URL
`/assets/hero.png`.

## The `public` folder

Every app has its own `public` folder which can be used to serve static assets.
This folder is symlinked to `frappe-bench/sites/assets/[appname]`. Here is the
output of `tree` command on the assets folder.

```sh
~/frappe-bench
$ tree sites/assets -L 1
sites/assets
├── erpnext -> ~/frappe-bench/apps/erpnext/erpnext/public
└── frappe -> ~/frappe-bench/apps/frappe/frappe/public
```

This means if there is file at `[appname]/public/images/favicon.png`, then it
also exists as a symlink at `assets/[appname]/images/favicon.png` and is
accessible publicly via the URL `/assets/[appname]/images/favicon.png`.

### Bundled Assets

[Bundled Assets](/framework/v14/user/en/basics/asset-bundling) are generated at
`assets/[appname]/dist/js` and `assets/[appname]/dist/css`. Hence, they are
accessible via the URL `/assets/[appname]/dist/js/main.bundle.[hash].js`.

## Site Assets


In addition to static files provided by apps, each site can have its own static
files that might come from user uploads or site backups.

### User uploads

Files uploaded by user that are public are stored at
`frappe-bench/sites/[sitename]/public/files`. A file stored at
`frappe-bench/sites/[sitename]/public/files/profile.png` is accessible publicly
via the URL `/files/profile.png`

Files uploaded by user that are private are stored at
`frappe-bench/sites/[sitename]/private/files`. A file stored at
`frappe-bench/sites/[sitename]/private/files/profile.png` is accessible via the
URL `/private/files/profile.png`. Private files are accessible only when the
user is authorized to view them.

### Backups

Any local backups that are generated for the site are stored as
`frappe-bench/sites/[sitename]/private/backups/20210502_182223-[sitename]-database.sql.gz`.
It is accessible via the URL
`/backups/20210502_182223-[sitename]-database.sql.gz` and only when the user is
authorized to download them.

Here is the output of the `ls` command:

```sh
~/frappe-bench
$ ls -l sites/site1.test/private/backups
total 6160
-rw-r--r-- 1 farisansari staff 2429268 May 2 18:22 20210502_182223-site1_test-database.sql.gz
-rw-r--r-- 1 farisansari staff 278 May 2 18:22 20210502_182223-site1_test-site_config_backup.json
```
