# Explanation

Launchpad is a large platform built over many years. These pages explain the
ideas behind the project, its components, and the best practices its developers
follow.

## The ideas behind Launchpad

Launchpad connects the people who make software with users and other developers,
and offers the resources they need to make their software available.
Understanding why Launchpad exists, whom it serves, and the values that guide
it provides the context for everything else.

- [What is Launchpad?](https://ubuntu.com/docs/launchpad/developer/explanation/ideas-behind-launchpad/scope/index.html.md#what-is-launchpad)
- [About Launchpad security](https://ubuntu.com/docs/launchpad/developer/explanation/ideas-behind-launchpad/security/index.html.md#about-launchpad-security)
- [Launchpad strategy](https://ubuntu.com/docs/launchpad/developer/explanation/ideas-behind-launchpad/strategy/index.html.md#launchpad-strategy)
- [Launchpad values](https://ubuntu.com/docs/launchpad/developer/explanation/ideas-behind-launchpad/values/index.html.md#launchpad-values)

## Core components and setup

Launchpad is made up of many components. Knowing how these pieces fit together
helps you navigate the codebase, and design and test your changes.

- [Parts of Launchpad](https://ubuntu.com/docs/launchpad/developer/explanation/core-components-and-set-up/parts-of-launchpad/index.html.md#parts-of-launchpad)
- [Publisher](https://ubuntu.com/docs/launchpad/developer/explanation/core-components-and-set-up/publisher/index.html.md#explanation-publisher)
- [Application framework](https://ubuntu.com/docs/launchpad/developer/explanation/core-components-and-set-up/framework/index.html.md#application-framework)
- [Code concepts](https://ubuntu.com/docs/launchpad/developer/explanation/core-components-and-set-up/concepts/index.html.md#code-concepts)
- [The Launchpad PPA](https://ubuntu.com/docs/launchpad/developer/explanation/core-components-and-set-up/launchpad-ppa/index.html.md#the-launchpad-ppa)
- [Navigating the tree](https://ubuntu.com/docs/launchpad/developer/explanation/core-components-and-set-up/navigating/index.html.md#navigating-the-tree)
- [Launchpad pip integration](https://ubuntu.com/docs/launchpad/developer/explanation/core-components-and-set-up/pip/index.html.md#launchpad-pip-integration)
- [Launchpad installation details](https://ubuntu.com/docs/launchpad/developer/explanation/core-components-and-set-up/running-details/index.html.md#launchpad-installation-details)
- [Testing](https://ubuntu.com/docs/launchpad/developer/explanation/core-components-and-set-up/testing/index.html.md#testing-launchpad-changes)
- [Building live filesystems](https://ubuntu.com/docs/launchpad/developer/explanation/core-components-and-set-up/building-live-filesystems/index.html.md#building-live-filesystems)

## Database

Launchpad uses PostgreSQL and depends on PostgreSQL-specific features. Its
schema is patched on a live system and managed by Storm, the ORM Launchpad uses.

- [Database performance](https://ubuntu.com/docs/launchpad/developer/explanation/database/database-performance/index.html.md#database-performance)
- [Database patching](https://ubuntu.com/docs/launchpad/developer/explanation/database/database-patching/index.html.md#database-patching)
- [PostgreSQL and Launchpad](https://ubuntu.com/docs/launchpad/developer/explanation/database/postgresql/index.html.md#postgresql-and-launchpad)
- [Storm migration guide](https://ubuntu.com/docs/launchpad/developer/explanation/database/storm-migration-guide/index.html.md#storm-migration-guide)
- [Working with db-devel](https://ubuntu.com/docs/launchpad/developer/explanation/database/working-with-db-devel/index.html.md#working-with-db-devel)

## Developing for the Launchpad project

Contributing to Launchpad means working across several branches, guarding new
behaviour behind feature flags, and guiding each change through review and
into production. This day-to-day development is expected to follow specific
processes and conventions.

- [About Launchpad branches](https://ubuntu.com/docs/launchpad/developer/explanation/developing-for-launchpad/branches/index.html.md#about-launchpad-branches)
- [Datetime usage guide](https://ubuntu.com/docs/launchpad/developer/explanation/developing-for-launchpad/datetime-usage/index.html.md#datetime-usage-guide)
- [Error explanations](https://ubuntu.com/docs/launchpad/developer/explanation/developing-for-launchpad/error-explanations/index.html.md#error-explanations)
- [Feature flags](https://ubuntu.com/docs/launchpad/developer/explanation/developing-for-launchpad/feature-flags/index.html.md#feature-flags)
- [Hacking](https://ubuntu.com/docs/launchpad/developer/explanation/developing-for-launchpad/hacking/index.html.md#hacking-guide)
- [Journey of a change to production](https://ubuntu.com/docs/launchpad/developer/explanation/developing-for-launchpad/journey-of-a-change-to-production/index.html.md#journey-change-production)
- [Pre merge reviews](https://ubuntu.com/docs/launchpad/developer/explanation/developing-for-launchpad/pre-merge-reviews/index.html.md#pre-merge-reviews)
- [XXX policy](https://ubuntu.com/docs/launchpad/developer/explanation/developing-for-launchpad/xxx-policy/index.html.md#xxx-policy)

## Best practices for development

Launchpad aims to be fast and always available. It should also be safe to
change parts of it with a low risk of breaking other parts of the system. These
principles inform how its code is structured, how performance and permissions
are handled, and how its templates and tests are written.

- [Architectural guide](https://ubuntu.com/docs/launchpad/developer/explanation/development-best-practices/architecture/index.html.md#architectural-guide)
- [Assertions in Launchpad](https://ubuntu.com/docs/launchpad/developer/explanation/development-best-practices/assertions-in-launchpad/index.html.md#assertions-in-launchpad)
- [Bug triage process background](https://ubuntu.com/docs/launchpad/developer/explanation/development-best-practices/bug-triage-process-background/index.html.md#bug-triage-process-background)
- [Charm development](https://ubuntu.com/docs/launchpad/developer/explanation/development-best-practices/charms/index.html.md#charm-development)
- [Code import in depth](https://ubuntu.com/docs/launchpad/developer/explanation/development-best-practices/codeimport/index.html.md#code-import-in-depth)
- [Page tests](https://ubuntu.com/docs/launchpad/developer/explanation/development-best-practices/page-tests/index.html.md#page-tests)
- [About Launchpad performance](https://ubuntu.com/docs/launchpad/developer/explanation/development-best-practices/performance/index.html.md#about-launchpad-performance)
- [Launchpad permissions](https://ubuntu.com/docs/launchpad/developer/explanation/development-best-practices/security-policy/index.html.md#launchpad-permissions)
- [Template reuse](https://ubuntu.com/docs/launchpad/developer/explanation/development-best-practices/template-reuse/index.html.md#template-reuse)

## JavaScript

Launchpad’s front end is written in JavaScript built on the YUI library, with
its own build system and both unit and integration test frameworks.

- [JavaScript build system](https://ubuntu.com/docs/launchpad/developer/explanation/javascript/javascript-buildsystem/index.html.md#javascript-build-system)
- [Integration testing in JavaScript](https://ubuntu.com/docs/launchpad/developer/explanation/javascript/javascript-integration-testing/index.html.md#integration-testing-in-javascript)
- [Developing with YUI Test](https://ubuntu.com/docs/launchpad/developer/explanation/javascript/javascript-unittesting/index.html.md#developing-with-yui-test)

## Static assets

Launchpad’s visual style comes from CSS and images that are compiled and
optimized as part of the build using CSS sprites.

- [CSS](https://ubuntu.com/docs/launchpad/developer/explanation/static-assets/css/index.html.md#launchpad-css)
- [CSS sprites](https://ubuntu.com/docs/launchpad/developer/explanation/static-assets/css-sprites/index.html.md#use-css-sprites)
- [Favicons](https://ubuntu.com/docs/launchpad/developer/explanation/static-assets/favicon/index.html.md#launchpad-favicons)
- [Images](https://ubuntu.com/docs/launchpad/developer/explanation/static-assets/images/index.html.md#launchpad-images)
