├── .github └── FUNDING.yml ├── .gitignore ├── CNAME ├── CONTRIBUTING.md ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── _config.yml ├── _data └── tags.yml ├── _layouts ├── default.html └── post.html ├── _posts ├── .gitkeep ├── 2015-12-13-first-status.md ├── 2015-12-20-first-warning.md ├── 2015-12-22-first-error.md ├── 2015-12-23-first-resolution.md ├── 2016-01-10-things-better.md └── 2017-08-01-scheduled-maintenance.md ├── archive.html ├── css └── style.css ├── favicon.png ├── img ├── .gitkeep └── screenshot.png ├── index.html ├── js └── script.js └── rss.xml /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [joshbeckman] 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _site/ 2 | .sass-cache/ 3 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | staticus.narro.co -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Contributing 2 | --- 3 | 4 | We love pull requests from everyone. By participating in this project, you agree to abide by our adopted [code of conduct](https://thoughtbot.com/open-source-code-of-conduct). 5 | 6 | Fork and clone the repo and get started: 7 | 8 | ```shell 9 | $ git clone git@github.com:NarroApp/staticus.git && cd staticus 10 | $ bundle install && jekyll serve 11 | ``` 12 | 13 | Push to your fork and [submit a pull request][pr]. 14 | 15 | [pr]: https://github.com/narroapp/staticus/compare/ 16 | 17 | At this point you're waiting on us. We like to at least comment on pull requests 18 | within three business days (and, typically, one business day). We may suggest 19 | some changes or improvements or alternatives. 20 | 21 | Some things that will increase the chance that your pull request is accepted: 22 | 23 | - Write a [good commit message][commit]. 24 | 25 | [commit]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html 26 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | gem 'github-pages' -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | RedCloth (4.2.9) 5 | activesupport (4.2.2) 6 | i18n (~> 0.7) 7 | json (~> 1.7, >= 1.7.7) 8 | minitest (~> 5.1) 9 | thread_safe (~> 0.3, >= 0.3.4) 10 | tzinfo (~> 1.1) 11 | blankslate (2.1.2.4) 12 | celluloid (0.16.0) 13 | timers (~> 4.0.0) 14 | classifier-reborn (2.0.3) 15 | fast-stemmer (~> 1.0) 16 | coffee-script (2.3.0) 17 | coffee-script-source 18 | execjs 19 | coffee-script-source (1.8.0) 20 | colorator (0.1) 21 | execjs (2.2.2) 22 | fast-stemmer (1.0.2) 23 | ffi (1.9.6) 24 | gemoji (2.1.0) 25 | github-pages (32) 26 | RedCloth (= 4.2.9) 27 | github-pages-health-check (~> 0.2) 28 | jekyll (= 2.4.0) 29 | jekyll-coffeescript (= 1.0.1) 30 | jekyll-mentions (= 0.2.1) 31 | jekyll-redirect-from (= 0.6.2) 32 | jekyll-sass-converter (= 1.2.0) 33 | jekyll-sitemap (= 0.6.3) 34 | jemoji (= 0.4.0) 35 | kramdown (= 1.5.0) 36 | liquid (= 2.6.1) 37 | maruku (= 0.7.0) 38 | mercenary (~> 0.3) 39 | pygments.rb (= 0.6.0) 40 | rdiscount (= 2.1.7) 41 | redcarpet (= 3.1.2) 42 | terminal-table (~> 1.4) 43 | github-pages-health-check (0.2.1) 44 | net-dns (~> 0.6) 45 | public_suffix (~> 1.4) 46 | hitimes (1.2.2) 47 | html-pipeline (1.9.0) 48 | activesupport (>= 2) 49 | nokogiri (~> 1.4) 50 | i18n (0.7.0) 51 | jekyll (2.4.0) 52 | classifier-reborn (~> 2.0) 53 | colorator (~> 0.1) 54 | jekyll-coffeescript (~> 1.0) 55 | jekyll-gist (~> 1.0) 56 | jekyll-paginate (~> 1.0) 57 | jekyll-sass-converter (~> 1.0) 58 | jekyll-watch (~> 1.1) 59 | kramdown (~> 1.3) 60 | liquid (~> 2.6.1) 61 | mercenary (~> 0.3.3) 62 | pygments.rb (~> 0.6.0) 63 | redcarpet (~> 3.1) 64 | safe_yaml (~> 1.0) 65 | toml (~> 0.1.0) 66 | jekyll-coffeescript (1.0.1) 67 | coffee-script (~> 2.2) 68 | jekyll-gist (1.1.0) 69 | jekyll-mentions (0.2.1) 70 | html-pipeline (~> 1.9.0) 71 | jekyll (~> 2.0) 72 | jekyll-paginate (1.1.0) 73 | jekyll-redirect-from (0.6.2) 74 | jekyll (~> 2.0) 75 | jekyll-sass-converter (1.2.0) 76 | sass (~> 3.2) 77 | jekyll-sitemap (0.6.3) 78 | jekyll-watch (1.2.1) 79 | listen (~> 2.7) 80 | jemoji (0.4.0) 81 | gemoji (~> 2.0) 82 | html-pipeline (~> 1.9) 83 | jekyll (~> 2.0) 84 | json (1.8.2) 85 | kramdown (1.5.0) 86 | liquid (2.6.1) 87 | listen (2.8.5) 88 | celluloid (>= 0.15.2) 89 | rb-fsevent (>= 0.9.3) 90 | rb-inotify (>= 0.9) 91 | maruku (0.7.0) 92 | mercenary (0.3.5) 93 | mini_portile (0.6.2) 94 | minitest (5.5.1) 95 | net-dns (0.8.0) 96 | nokogiri (1.8.2) 97 | mini_portile (~> 0.6.0) 98 | parslet (1.5.0) 99 | blankslate (~> 2.0) 100 | posix-spawn (0.3.9) 101 | public_suffix (1.4.6) 102 | pygments.rb (0.6.0) 103 | posix-spawn (~> 0.3.6) 104 | yajl-ruby (~> 1.1.0) 105 | rb-fsevent (0.9.4) 106 | rb-inotify (0.9.5) 107 | ffi (>= 0.5.0) 108 | rdiscount (2.1.7) 109 | redcarpet (3.1.2) 110 | safe_yaml (1.0.4) 111 | sass (3.4.10) 112 | terminal-table (1.4.5) 113 | thread_safe (0.3.4) 114 | timers (4.0.1) 115 | hitimes 116 | toml (0.1.2) 117 | parslet (~> 1.5.0) 118 | tzinfo (1.2.2) 119 | thread_safe (~> 0.1) 120 | yajl-ruby (1.3.1) 121 | 122 | PLATFORMS 123 | ruby 124 | 125 | DEPENDENCIES 126 | github-pages 127 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 NarroApp 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Staticus 2 | A static status page, designed to be blazingly fast and quick enough to update. [Demo][0] 3 | 4 | - Runs on GitHub pages (jekyll) 5 | - Supports multiple status channels (e.g. _Apps_ and _Data_) 6 | - Supports 'scheduled maintenance' posts 7 | - Supports uptime history (of configurable length) 8 | 9 | ## Usage 10 | 11 | To update the system status page (homepage), just create a new post in `_posts/`. 12 | 13 | Staticus uses a couple custom frontmatter fields: 14 | - `action` denotes the type of status message. (_incident-error_ or _incident-warning_ or _resolved_) 15 | 16 | Staticus also looks at the `tags` frontmatter to determine the appropriate channel for the update. You can update multiple channels with the same post. Define your channels in `_data/tags.yml`. 17 | 18 | - Any tag with `system: true` will be treated as a top-level system channel. 19 | - Any tag with `scheduled: true` will be treated as a scheduled channel. 20 | - These are shown at the top of the status page. 21 | 22 | To run on GitHub Pages: 23 | - Fork the repository 24 | - Update the `_posts` and `_data` respectively 25 | - Update the CSS styling (_optional_) 26 | - Update the `CNAME` file 27 | - Push it up! 28 | 29 | ### Example Frontmatter 30 | 31 | ``` 32 | --- 33 | layout: post 34 | title: First bad things happening 35 | date: 2017-01-01 11:11 36 | action: incident-error 37 | tags: [data, apps] 38 | --- 39 | ``` 40 | 41 | ## Installation 42 | 43 | ```sh 44 | # clone or download the repo 45 | $ bundle install 46 | $ jekyll serve 47 | ``` 48 | 49 | ## Examples 50 | 51 | These sites are using Staticus: 52 | - https://status.narro.co 53 | - https://status.officeluv.com 54 | 55 | 56 | ## Preview 57 | 58 | ![Screenshot](https://github.com/NarroApp/staticus/blob/master/img/screenshot.png) 59 | 60 | [0]: https://staticus.narro.co 61 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | url: https://staticus.narro.co 2 | author: NarroApp 3 | email: support@narro.co 4 | title: Staticus 5 | description: The status page for the Narro API and services 6 | homepage: https://www.narro.co 7 | 8 | permalink: pretty 9 | uptime_days: 60 10 | 11 | # TODO: Build pagination into archive 12 | gems: [jekyll-paginate] 13 | paginate: 2 14 | paginate_path: '/archive/page:num/' 15 | -------------------------------------------------------------------------------- /_data/tags.yml: -------------------------------------------------------------------------------- 1 | - slug: apps 2 | system: true 3 | name: Apps and Runtime 4 | - slug: data 5 | system: true 6 | name: Data Services 7 | - slug: maintenance 8 | scheduled: true 9 | name: Scheduled Maintenance 10 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ page.title }} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 |

21 | RSS 24 |

25 |
26 |
27 | 28 | {{ content }} 29 | 30 |
31 |
32 |

33 | 36 | Homepage 37 | 38 |

39 |
40 |
41 | 42 | 43 | -------------------------------------------------------------------------------- /_layouts/post.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 |

20 | 23 |

24 |

25 | 28 |

29 |
30 | {% for post_tag in page.tags %} 31 | {% for data_tag in site.data.tags %} 32 | {% if data_tag.slug == post_tag %} 33 | {% assign tag = data_tag %} 34 | {% endif %} 35 | {% endfor %} 36 | {% if tag %} 37 | 38 | {{ tag.name }} 39 | 40 | {% else %} 41 | 44 | {% endif %} 45 | {% endfor %} 46 |
47 |
48 | {{ content }} 49 |
50 |
51 |

52 | 53 | ← {{ site.title }} 54 | 55 |

56 |
57 | -------------------------------------------------------------------------------- /_posts/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshbeckman/staticus/7c5c0f7898a91a88d5169689cbe7b7e7732c9bd1/_posts/.gitkeep -------------------------------------------------------------------------------- /_posts/2015-12-13-first-status.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: First Status 4 | action: resolve 5 | date: 2017-09-13 21:12 6 | tags: [data, apps] 7 | --- 8 | 9 | This is an example first post on Staticus, [Narro's](//narro.co) static status page. 10 | -------------------------------------------------------------------------------- /_posts/2015-12-20-first-warning.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: First Warning 4 | action: incident-warning 5 | date: 2017-09-20 21:12 6 | tags: [apps] 7 | --- 8 | 9 | This is an example first warning on Staticus, [Narro's](//narro.co) static status page. 10 | 11 | ``` 12 | status: warning 13 | ``` 14 | -------------------------------------------------------------------------------- /_posts/2015-12-22-first-error.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: First Error 4 | action: incident-error 5 | date: 2017-09-22 21:12 6 | tags: [data, apps] 7 | --- 8 | 9 | This is an example first error on Staticus, [Narro's](//narro.co) static status page. 10 | 11 | ``` 12 | status: error 13 | ``` 14 | -------------------------------------------------------------------------------- /_posts/2015-12-23-first-resolution.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: First Resolution 4 | action: resolve 5 | date: 2017-09-23 21:12 6 | tags: [apps] 7 | --- 8 | 9 | This is an example first resolution of an issue on Staticus, [Narro's](//narro.co) static status page. 10 | -------------------------------------------------------------------------------- /_posts/2016-01-10-things-better.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Things have been a bit slow 4 | action: incident-warning 5 | date: 2017-10-03 01:01 6 | tags: [data] 7 | --- 8 | 9 | This is just to let you know that things have been a bit laggy lately... 10 | -------------------------------------------------------------------------------- /_posts/2017-08-01-scheduled-maintenance.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Scheduled Maintenance on Monday October 9 at 16:00 UTC (12:00 EDT) 4 | action: notification 5 | date: 2017-08-01 01:01 6 | tags: [maintenance] 7 | --- 8 | On Monday, October 9, 2017 starting at 16:00 UTC (12:00 EDT), and continuing until 16:30 UTC (30 minutes), Heroku will be performing maintenance on Heroku Connect EU (Dublin region). 9 | 10 | During this time, Heroku Connect in the EU Region will not sync data. Customers will continue to be able to use the data already in their database and new changes in their database will continue to be captured. All changes will be synced after Connect service is restored. 11 | 12 | Additionally, customers will not be able create new Connect add-ons in the EU region or change the configuration of existing EU region addons. 13 | 14 | The Heroku External Objects functionality will not be affected by this maintenance. 15 | 16 | We will provide an update when we begin and complete the maintenance. 17 | -------------------------------------------------------------------------------- /archive.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Archive 4 | --- 5 | 6 |

7 | {{ site.title }} Archive 8 |

9 | 10 |
11 | {% for post in site.posts %} 12 |
13 |

{{ post.title }}

14 | {{ post.date | date_to_string }} 15 |
16 | {% endfor %} 17 |
18 | -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | 2 | body { 3 | font-family: monospace; 4 | max-width: 40rem; 5 | margin: 1rem auto; 6 | padding: 0 1rem; 7 | } 8 | 9 | .bottom { 10 | margin: 2rem 0; 11 | } 12 | .topright, .bottomright { 13 | text-align: right; 14 | } 15 | 16 | .index-heading { 17 | margin-top: 2rem; 18 | display: flex; 19 | justify-content: space-between; 20 | align-items: baseline; 21 | } 22 | .index-heading h2 { 23 | margin-bottom: 0.5rem; 24 | } 25 | .index-system .resolved { 26 | border-left: 0.5rem solid lightgreen; 27 | padding-left: 1rem; 28 | } 29 | .index-system .incident-warning { 30 | border-left: 0.5rem solid orange; 31 | padding-left: 1rem; 32 | } 33 | .index-system .incident-error { 34 | border-left: 0.5rem solid red; 35 | padding-left: 1rem; 36 | } 37 | 38 | .uptime, .uptime-scale { 39 | display: flex; 40 | justify-content: space-between; 41 | align-items: center; 42 | } 43 | .uptime-scale { 44 | margin-top: 0.5rem; 45 | } 46 | .uptime-scale > span { 47 | flex: 1; 48 | } 49 | .uptime-scale > span:last-child { 50 | text-align: right; 51 | } 52 | .uptime > span { 53 | display: flex; 54 | flex-direction: column; 55 | align-items: center; 56 | justify-content: space-between; 57 | flex: 1; 58 | height: 2rem; 59 | margin: 0 1px; 60 | background: lightgreen; 61 | } 62 | .uptime > span > a { 63 | display: block; 64 | width: 100%; 65 | flex: 1; 66 | } 67 | .uptime a.resolved { 68 | background: lightgreen; 69 | } 70 | .uptime a.resolve { 71 | background: lightgreen; 72 | } 73 | .uptime a.incident-warning { 74 | background: orange; 75 | } 76 | .uptime a.incident-error { 77 | background: red; 78 | } 79 | .uptime > span:hover { 80 | box-shadow: 0 1px 1px rgba(0,0,0,0.2); 81 | } 82 | 83 | .posts .post { 84 | padding: 0 1rem 1rem; 85 | margin: 1rem 0; 86 | border: 1px solid lightgray; 87 | } 88 | 89 | .tags { 90 | margin: 1rem 0; 91 | } 92 | .tags .tag { 93 | display: inline-block; 94 | margin-right: 1rem; 95 | padding: 0.3rem 0.5rem; 96 | border: 1px solid; 97 | } 98 | 99 | /* Place custom styling below */ 100 | 101 | -------------------------------------------------------------------------------- /favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshbeckman/staticus/7c5c0f7898a91a88d5169689cbe7b7e7732c9bd1/favicon.png -------------------------------------------------------------------------------- /img/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshbeckman/staticus/7c5c0f7898a91a88d5169689cbe7b7e7732c9bd1/img/.gitkeep -------------------------------------------------------------------------------- /img/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshbeckman/staticus/7c5c0f7898a91a88d5169689cbe7b7e7732c9bd1/img/screenshot.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Narro Status 4 | --- 5 | 6 |

7 | 8 | {{ site.title }} 9 | 10 |

11 | {% for tag in site.data.tags %} 12 | {% if tag.scheduled %} 13 |
14 | {% for post in site.tags[tag.slug] limit:1 %} 15 | {% if post.action contains 'resolve' %} 16 | {% else %} 17 |
18 |
19 | 20 | {{ tag.name }} 21 | 22 |
23 |

24 | 25 | {{ post.title }} 26 | 27 |

28 |
29 | {% endif %} 30 |
31 | {% endfor %} 32 | 33 | {% endif %} 34 | {% endfor %} 35 | 36 | {% for tag in site.data.tags %} 37 | {% if tag.system %} 38 |
39 |
40 |

41 | {{ tag.name }} 42 |

43 |
44 |
45 | {% for post in site.tags[tag.slug] limit:1 %} 46 |

47 | {% if post.action contains 'incident' %} 48 |

49 | 50 | {{ post.title }} 51 | 52 |

53 | {% else %} 54 |

55 | No known issues at this time. 56 |

57 | {% endif %} 58 |

59 | {% endfor %} 60 |
61 | {% endif %} 62 | {% endfor %} 63 | 64 |
65 |

66 | Uptime Last {{ site.uptime_days }} Days 67 |

68 |
69 |
70 | 76 |
77 | 78 | {{ site.uptime_days }} Days Ago 79 | 80 | 81 | Latest 82 | 83 |
84 | 85 |
86 |

87 | Past Incidents 88 |

89 | 90 | View Archive 91 | 92 |
93 |
94 |
95 | {% for post in site.posts limit:3 %} 96 |
97 |

98 | 99 | {{ post.title }} 100 | 101 |

102 | {{ post.date | date_to_string }} 103 |
104 | {% endfor %} 105 |
106 | 141 | -------------------------------------------------------------------------------- /js/script.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshbeckman/staticus/7c5c0f7898a91a88d5169689cbe7b7e7732c9bd1/js/script.js -------------------------------------------------------------------------------- /rss.xml: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | 5 | 6 | 7 | {{ site.title | xml_escape }} 8 | {{ site.description | xml_escape }} 9 | {{ site.url }}{{ site.baseurl }}/ 10 | 11 | {% for post in site.posts limit:10 %} 12 | 13 | {{ post.title | xml_escape }} 14 | {{ post.content | xml_escape }} 15 | {{ post.date | date: "%a, %d %b %Y %H:%M:%S %z" }} 16 | {{ post.url | prepend: site.url }} 17 | {{ post.url | prepend: site.url }} 18 | 19 | {% endfor %} 20 | 21 | 22 | --------------------------------------------------------------------------------