{"id":28565752,"url":"https://github.com/postlight/liftoff","last_synced_at":"2025-08-20T16:22:55.169Z","repository":{"id":34461802,"uuid":"168198398","full_name":"postlight/liftoff","owner":"postlight","description":"🚀  Liftoff is a flexible static-site generator that pulls content from Airtable","archived":false,"fork":false,"pushed_at":"2022-12-10T16:50:55.000Z","size":2701,"stargazers_count":360,"open_issues_count":14,"forks_count":47,"subscribers_count":37,"default_branch":"master","last_synced_at":"2025-06-10T14:50:16.059Z","etag":null,"topics":["airtable","labs","react","static-site-generator"],"latest_commit_sha":null,"homepage":"https://postlight.com/labs/liftoff-airtable-cms","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/postlight.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE-APACHE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-01-29T17:37:43.000Z","updated_at":"2025-04-03T01:15:14.000Z","dependencies_parsed_at":"2023-01-15T07:15:46.273Z","dependency_job_id":null,"html_url":"https://github.com/postlight/liftoff","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/postlight/liftoff","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/postlight%2Fliftoff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/postlight%2Fliftoff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/postlight%2Fliftoff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/postlight%2Fliftoff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/postlight","download_url":"https://codeload.github.com/postlight/liftoff/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/postlight%2Fliftoff/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271347333,"owners_count":24743820,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-20T02:00:09.606Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["airtable","labs","react","static-site-generator"],"created_at":"2025-06-10T14:40:17.053Z","updated_at":"2025-08-20T16:22:55.114Z","avatar_url":"https://github.com/postlight.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Liftoff – The Airtable CMS\n\n[Postlight](https://postlight.com)'s Liftoff is a nifty tool that lets you easily create a static website that displays content in Airtable base and style it with custom CSS. Read all about it in [this handy introduction](https://postlight.com/trackchanges/introducing-liftoff-easily-create-a-static-website-powered-by-airtable).\n\n## Quick Start\n\nThis README goes pretty in depth with how to set up this project on your computer. Here are the basics in case you want to jump right in. You'll likely want to skim through other parts of this document as you go, but this will get you started!\n\n1. Create an [Airtable](https://www.airtable.com) base if you haven't already.\n2. Clone this repo: `git clone git@github.com:postlight/liftoff.git`.\n3. Run `yarn install` to install dependencies.\n4. Run `yarn setup` for a walkthrough on setting environment variables.\n5. Run `yarn run start:dev` to start up the webpack dev server.\n6. [Make changes to your Airtable base](#setting-up-your-airtable-base).\n7. [Style your site](#styling).\n8. [Deploy your site](#deploying-your-site).\n\n## Table of Contents\n\n1. [Getting Started](#getting-started)\n   - [Cloning this Repo](#cloning-this-repo)\n   - [Installing Yarn](#installing-yarn)\n   - [Environment setup](#environment-setup)\n   - [Setting up your environment variables](#setting-up-your-environment-variables)\n2. [Setting up your Airtable base](#setting-up-your-airtable-base)\n   - [Supported field types](#supported-field-types)\n   - [Markdown](#markdown)\n3. [Development](#development)\n4. [Styling](#styling)\n   - [Default classes](#default-classes)\n   - [Favicon](#favicon)\n5. [Pagination](#pagination)\n6. [Custom renderers](#custom-renderers)\n7. [Build](#build)\n8. [Deploying your site](#deploying-your-site)\n9. [Example sites](#example-sites)\n\n## Getting Started\n\n### Cloning/downloading this repo\n\nIf you're familiar with git, you can go ahead and clone this repo the normal way.\n\nIf not, you can download a Zip file of this repo by clicking on the button shown here near the top of this page:\n\n![Downloading this repo](/readme-assets/git-clone.png)\n\n### Installing Yarn\n\nThis project uses [Yarn](https://yarnpkg.com) to download and manage copies of the third party code we used to build it. If you already have Yarn installed, you can skip to the next section. Otherwise, you can follow the instructions [here](https://yarnpkg.com/lang/en/docs/install/#mac-stable) to install it for macOS or [here](https://yarnpkg.com/lang/en/docs/install/#windows-stable) to install it for Windows.\n\nIf you're a Mac user, you may want to install Homebrew if you haven't already. Homebrew is a package manager that will allow you to easily download, install, and manage software such as Yarn. You can follow the instructions on [the Homebrew website](https://brew.sh/) or you can install it from the command line by:\n\n1. Opening up a terminal window via the \"Terminal\" application\n2. Copy and pasting the following into the terminal window and hitting Enter/Return\n\n```\n/usr/bin/ruby -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"\n```\n\nAfter the installation completes, you can then open a new terminal window (Cmd+T works) and run `brew install yarn` to install Yarn.\n\nWhen that's done, open up another terminal window and run `yarn install`. This will download the 3rd party code this project needs in order to work.\n\n### Environment setup\n\nThis project uses environment variables to store credentials such as your Airtable API key, so we'll need to set those up before we can move onto more exciting things. Luckily, setting them up is simple.\n\n#### Setting up your environment variables\n\nAll of the environment variables we need to set up can be found by going to the right place on the Airtable website.\n\nFrom your terminal, run:\n\n```bash\nyarn setup\n```\n\nThis script will walk you through each step of the process. Simply follow the instructions, enter the value the prompts ask you for, and press enter to move on to the next step. If you want to change an environment variable after the fact, you can directly edit the `.env` file in the root directory of your project, or you can run `yarn setup` again.\n\n## Setting up your Airtable base\n\n### Supported field types\n\nThis project currently supports most but not all Airtable field types. The only field types it doesn't currently support are \"Link to another record\", \"Barcode\", and \"Collaborator\". For \"Attachment\" types, it currently only supports image files.\n\n### Publishing rows\n\nYou have two options for determining which rows are published. By default, all rows visible to an Airtable view will be published. If you want, however, you can add a Published checkbox column to your table. Any row that doesn't have a checkmark in that field will not be displayed on your site. This makes it easy to create drafts of your rows before publishing. Remember: If you don't include this field, every row will be displayed by default.\n\n### Slugs\n\nA slug is a unique ID that represents a resource in a URL. If you have a website called `website.com` with an article on it called \"What Is a Website?\", for instance, you might want that article's page to look something like `website.com/what-is-a-website.html` to make it readable and easy to remember. You can specify slugs in your site by adding a `Slug` column to your Airtable table and populating it in each row with your desired slug. Note that slugs cannot contain spaces, so you must use `-` or `_` to separate words. You don't need to include `.html` in your slug—that will be handled automatically.\n\n## Development\n\nEntering `yarn run start:dev` into a terminal window will fire up a server that will allow you to view your site and style it in real time. Each time you save after editing CSS or custom renderers (more on these below), your work will be automatically reflected in the browser.\n\n## Styling\n\nAny CSS put in the `styles.css` file at `/custom/styles.css` will be injected into your site for styling purposes.\n\nYour field names will always be added as classes in the corresponding HTML. So for example, a field called \"Title\" will generate an HTML element with the class `.Title`. There are other classes that are put in by default, detailed below. You can make use of these classes to style the site to your liking.\n\nOut of the box, we've provided some boilerplate styling that we hope will help ease the styling process - to remove, simply remove the unwanted css from `/public/default.css`. To view the boilerplate designs, click [here](https://liftoff-boilerplate.netlify.com).\n\n## Pagination\n\nPagination is automatically implemented on any site with more than 10 posts. This makes back + next buttons available on the homepage of your site for navigating between different pages of posts.\n\n### Default classes\n\n- `.attachments`: placed on attachment-type fields\n- `.field-name`: placed on the element containing the name of each field; by default, field names are hidden\n- `.field-value`: placed on the element containing the value of each field\n- `.row-link`: placed on each row on the homepage\n- `.row`: placed on each row\n- `.header`: placed on the header\n- `.index-page` placed on an element that wraps the homepage\n- `.nav-button` placed on back/next navigation buttons\n\nUsing a combination of the classes defined by your table's fields and these default classes, you should be able to accomplish just about any styling needs you have.\n\n### Favicon\n\nYou can include a [favicon](https://wikipedia.org/Favicon) for your website by putting a `favicon.ico` image file in the `/custom` directory. It must conform to favicon specifications, meaning it should be a `.ico` file and should be 16x16 or 32x32 pixels in size.\n\n## Custom renderers\n\nIf you're comfortable writing React, you may find yourself wanting to write a custom component to render one of your fields. Luckily this is easy to do!\n\nTo add a custom renderer for one of your fields, create a React component that accepts `name` and `value` as props in the `custom/renderers` folder, then import and export it in `custom/renderers/index.js`. The name of the file and component must match the name of the column you would like it to serve as renderer for. If the name of your column includes spaces, do not include the spaces in the name of the corresponding file and component. So a custom renderer for a column called \"Body Text\" should be a React component called `BodyText` in a file called `custom/renderers/BodyText.js` and exported from `custom/renderers/index.js` as such.\n\nFor example:\n\n```javascript\n// in ./custom/renderers/BodyText.js\nimport React from \"react\";\n\nconst BodyText = ({ name, value }) =\u003e {\n  return (\n    \u003cdiv\u003e\n      The name of this field is {name}; its value is {value}\n    \u003c/div\u003e\n  );\n};\n\nexport default BodyText;\n```\n\n## Build\n\nRunning `yarn build` in a terminal window will execute a build script that will generate your site. The generated site will live in the `/dist` folder.\n\n## Deploying your site\n\nAfter you build your site, you can deploy it anywhere that you can serve static HTML.\n\nOne service we often use at Postlight is [Netlify](https://netlify.com). You can follow instructions on their site to get your site up and running—the main things you need to remember for this process are that the folder you want to deploy is `/dist` and the command you need to run to build the site is `yarn build`.\n\nTo set your environment variables on Netlify, you will have to input them manually by going to the Setting tabs from the Netlify page for your website and clicking on \"Build \u0026 deploy\" in the sidebar. Now scroll down a little to the \"Build environment variables\" section and copy in your environment variables from your `.env` file [as set up above](#setting-up-your-environment-variables). When you've finished, it should look something like the following:\n\n![Netlify environment variables](/readme-assets/netlify-config.png)\n\n## Example sites\n\nWe've prepared two example sites for you to get an idea of what this tool makes possible. The first is a reimagining of Postlight's blog site, [Track Changes](https://postlight.com/trackchanges/articles), which you can see at https://track-changes-demo.netlify.com. This site showcases pagination, a lot of custom CSS, and markdown support, as you can see in the body of some of the articles. The second site is a fake blog for pizza enthusiasts, located at https://roni-rony-rone.netlify.com. This site highlights more custom CSS as well as custom React renderers, including one that lets you copy and paste a Google Maps embed code into your Airtable row and see it on your webpage, and another that does the same for Spotify playlist links.\n\nYou can see the code we wrote for the Track Changes site [here](https://github.com/fdsimms/tc-demo-liftoff/tree/master/), and you can see the code we wrote for the pizza blog site [here](https://github.com/fdsimms/roni-rony-rone-liftoff-demo/tree/roni-rony-rone-example-site/).\n\n## License\n\nLicensed under either of the below, at your preference:\n\n- Apache License, Version 2.0\n  ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)\n- MIT license\n  ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)\n\n## Contributing\n\nFor details on how to contribute, see [CONTRIBUTING.md](./CONTRIBUTING.md)\n\nUnless it is explicitly stated otherwise, any contribution intentionally\nsubmitted for inclusion in the work, as defined in the Apache-2.0 license,\nshall be dual licensed as above without any additional terms or conditions.\n\n---\n\n🔬 A Labs project from your friends at [Postlight](https://postlight.com). Happy coding!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpostlight%2Fliftoff","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpostlight%2Fliftoff","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpostlight%2Fliftoff/lists"}