Stringer Self Hosted RSS Reader

My setup is using the docker compose file and a local build of the docker image (since docker hub image is years old). Here is a dark theme (solarized) for the CSS. Just paste this over your stringer/app/assets/stylesheets/application.css file. I did not spend much time on it but it looks good enough for my taste.

Dark theme (solarized dark) for stringer-rss

/*
*= require_tree .
*/

html,
body {
  height: 100%;
  color: #2aa198;
}

body {
  background-color: #073642;
  overflow-x: hidden;
}

hr {
  border-bottom: 0px;
  border-top: 1px solid #586e75;
  width: 100%;
  margin: 20px auto;
}

code,
pre {
  white-space: normal;
  background-color: #073642;
  color: #93a1a1;
}

.container {
  width: 100%;
  max-width: 720px;
  margin: 0 auto;
}

.hidden {
  display: none !important;
}

/* Wrapper for page content to push down footer */
#wrap {
  min-height: 100%;
  height: auto !important;
  height: 100%;
  /* Negative indent footer by it's height */
  margin: 0 auto -30px;
}

/* Set the fixed height of the footer here */
#push,
#footer {
  height: 30px;
}

#frame {
  border-top: 7px solid #586e75;
}

@media (max-width: 768px) {
  #footer .row-fluid > * {
    display: none;
  }

  #footer .row-fluid > .span6:first-child {
    display: block;
    width: 100%;
    text-align: center;
  }

  #frame {
    padding-top: 7px;
    border-top: none;
  }
}

.alert {
  text-align: center;
  -webkit-border-radius: 0px;
  -moz-border-radius: 0px;
  border-radius: 0px;
  margin-bottom: 0px;
}

#action-bar .btn {
  padding: 8px;
  height: 18px;
  width: 18px;
}

.btn {
  position: relative;
  top: 0px;
  background-color: #678cb1;
  box-shadow: inset 0 -3px 0 rgba(0, 0, 0, 0.12);
}

.btn:active {
  top: 1px;
  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.12);
}

.btn.btn-primary {
  background-color: #b58900;
}

.btn.btn-primary:hover,
.btn.btn-primary:focus,
.btn.btn-primary:active {
  background-color: #2aa198;
}

.btn:hover,
.btn:focus,
.btn:active {
  background-color: #a082bd;
}

.btn:focus {
  outline: 0px !important;
  -webkit-appearance: none;
}

#action-bar i {
  color: #002b36;
  line-height: 18px;
}

.no-margin {
  margin-left: 0px !important;
}

#action-bar {
  margin-top: 14px;
  margin-bottom: 14px;
}

@media (max-width: 768px) {
  #action-bar {
    margin-left: 8px;
    margin-right: 8px;
  }
}

ul#story-list,
ul#feed-list {
  list-style-type: none;
  margin-left: 0px;
}

li.story,
li.feed {
  margin-bottom: 7px;
  border-radius: 5px;
  border: 3px solid #586e75;
  -webkit-transform: rotate(0);
  -moz-transform: rotate(0);
  transform: rotate(0);
  color: #93a1a1;
}

li.story .story-body a,
.setup a,
.footer-links a {
  color: #93a1a1;
  text-decoration: none;
  border-bottom: 1px dotted #93a1a1;
}

li.story .story-body a:hover,
.setup a:hover {
  color: #93a1a1;
  border-bottom: 1px dotted #93a1a1;
}

a.btn,
a.btn:hover {
  border-bottom: 0px;
  color: #002b36;
}

li.story.read {
  opacity: 0.5;
}

li.story.keepUnread .story-preview {
  font-weight: bold;
}

li.story.open {
  opacity: 1;
}

li.story.open .story-preview {
  border-bottom: 2px solid #073642;
}

.story-preview,
.feed-line {
  height: 30px;
  line-height: 30px;
  cursor: pointer;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.tooltip {
  white-space: pre-wrap;
}

.blog-title,
.feed-title {
  text-align: left;
  margin-left: 10px;
  overflow: hidden;
}

.story-lead {
  color: #586e75;
}

.story-published {
  margin-left: 20px;
}

.story-keep-unread,
.story-starred {
  display: inline-block;
  cursor: pointer;
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  margin-right: 20px;
}

.story-preview .story-starred {
  width: 13px;
  float: left;
  margin-left: 10px;
  margin-right: 13px;
}

li.story .icon-star {
  color: #9ab2bb;
}

li.story .icon-star-empty {
  color: #e0e2e4;
}

.story-body {
  margin-left: 20px;
  margin-right: 20px;
  margin-bottom: 10px;
  text-align: left;
}

.story-body h1,
.story-body h2,
.story-body h3 {
  font-family: 'Lato', sans-serif;
  font-weight: 700;
  line-height: 1.6;
}

.story-body h1 {
  font-size: 26px;
  margin-bottom: 13px;
}

li.story .story-body h1 a {
  border: none;
  color: #586e75;
}

li.story .story-body h1 a:hover {
  border: none;
  color: #7d8c93;
}

li.story.cursor {
  border: 3px solid #93a1a1;
}

li.story .story-body-container {
  display: none;
}

li.story.open .story-body-container {
  display: block;
}

p.story-details {
  margin-right: 14px;
  overflow: hidden;
}

.story-body h2 {
  font-size: 22px;
  margin-bottom: 11px;
}

.story-body h3 {
  font-size: 16px;
  margin-bottom: 8px;
}

.story-body p {
  font-size: 16px;
  line-height: 1.4;
  margin-bottom: 16px;
  font-weight: 300;
}

.story-body ul {
  list-style-type: disc;
}

.story-body ul,
.story-body ol {
  margin-bottom: 16px;
}

/* Wordpress hacks */
.story-body img.alignright {
  display: block;
  float: right;
  margin-left: 20px;
}

.story-body img.alignleft {
  display: block;
  float: left;
  margin-right: 20px;
}

.story-body img.aligncenter {
  display: block;
}
/* end Wordpress hacks */

.story-actions-container {
  border-top: 2px solid #93a1a1;
  height: 28px;
  line-height: 30px;
  clear: both;
}

.story-actions {
  margin-right: 20px;
  color: #586e75;
}

.story-actions a {
  color: #586e75;
  text-decoration: none;
}

.story-actions a:hover,
.story-actions a:focus {
  color: #93a1a1;
}

li.feed .feed-line {
  cursor: default;
}

li.feed .feed-title {
  display: inline-block;
  margin-left: 0px;
}

li.feed .feed-title a {
  color: #586e75;
  text-decoration: none;
}

li.feed .feed-unread {
  font-weight: bold;
}

li.feed .feed-title a:hover {
  color: #93a1a1;
}

li.feed .feed-title-container {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

li.feed .status {
  padding: 8px;
  width: 14px;
  color: #2aa198;
}

li.feed .status.green {
  color: #93a1a1;
}

li.feed .status.yellow {
  color: #586e75;
}

li.feed .status.red {
  color: #93a1a1;
}

li.feed .feed-last-updated {
  text-align: right;
}

@media (max-width: 768px) {
  li.feed .feed-last-updated {
    display: none;
  }

  li.feed .row-fluid .span2 {
    float: right;
    margin-right: 21px;
  }
}

li.feed .last-updated {
  font-size: 10px;
}

li.feed .last-updated-time {
  width: 100px;
  display: inline-block;
}

li.feed .edit-feed {
  cursor: pointer;
}

li.feed .edit-feed a {
  text-align: right;
  padding-left: 3px;
  padding-right: 3px;
  margin-left: 5px;
  color: #000;
}

li.feed .remove-feed {
  cursor: pointer;
}

li.feed .remove-feed a {
  text-align: center;
  padding-left: 3px;
  padding-right: 3px;
  margin-left: 5px;
  color: #93a1a1;
}

li.feed .remove-feed a:hover {
  color: #93a1a1;
}

#zen {
  text-align: center;
}

#zen p {
  font-size: 50px;
  line-height: 50px;
}

#zen p small {
  font-size: 20px;
}

#zen #zero {
  font-size: 144px;
}

#zen #gtfo {
  color: #93a1a1;
  font-weight: bold;
}

.orange {
  color: #93a1a1;
}

#add-feed-container {
  padding-top: 10px;
}

.setup {
  width: 350px;
  margin: 0 auto;
  padding-top: 100px;
}

.setup h1 {
  text-align: center;
}

.setup h2 {
  text-align: center;
  font-size: 18px;
  line-height: 22px;
}

.setup p {
  text-align: center;
}

.setup .control-group input {
  width: 210px;
}

.setup .field-icon {
  display: block;
  color: #bfc9ca;
  font-size: 24px;
  position: absolute;
  right: 13px;
  top: 8px;
  -webkit-transition: 0.25s;
  -moz-transition: 0.25s;
  -o-transition: 0.25s;
  transition: 0.25s;
}

.setup .control-group input:focus + .field-icon {
  color: #586e75;
}

.setup .control-group input:focus ~ .field-label {
  color: #586e75;
}

.setup .field-label {
  display: block;
  color: #bfc9ca;
  position: absolute;
  left: 13px;
  top: 10px;
  -webkit-transition: 0.25s;
  -moz-transition: 0.25s;
  -o-transition: 0.25s;
  transition: 0.25s;
}

.setup #password,
.setup #password-confirmation,
.setup #feed-url,
.setup #feed-name,
.setup input.select-dummy {
  padding-left: 100px;
  padding-right: 36px;
}

.setup select {
  display: block;
  position: absolute;
  left: 100px;
  top: 5px;
  width: 244px;
}

.setup .control-group {
  position: relative;
}

.tutorial-overlay {
  font-family: 'Reenie Beanie', cursive;
  height: 0;
}

.instruction {
  font-size: 28px;
  line-height: 20px;
  position: relative;
}

#mark-all-instruction {
  left: -100px;
  top: 20px;
  background: url('/img/arrow-up-right.png') no-repeat top left 30px;
  padding-top: 30px;
}

#refresh-instruction {
  left: 50px;
  top: 25px;
  background: url('/img/arrow-left.png') no-repeat top left 30px;
  padding-left: 75px;
}

#feeds-instruction {
  top: 28px;
  left: 500px;
  background: url('/img/arrow-right.png') no-repeat top left 105px;
}

#add-feed-instruction {
  top: 27px;
  left: 735px;
  background: url('/img/arrow-up-left.png') no-repeat top left;
  padding-top: 30px;
}

#story-instruction {
  left: 200px;
  top: 190px;
  background: url('/img/arrow-right-up.png') no-repeat top left 150px;
  padding-top: 10px;
}

.center {
  text-align: center;
}

.footer-links {
  margin-left: 0px;
}

.footer-links li {
  display: inline;
  padding: 0 2px;
}

kbd {
  padding: 0.1em 0.6em;
  border: 1px solid #ccc;
  font-family: Arial, Helvetica, sans-serif;
  color: #333;
  -moz-box-shadow:
    0 1px 0px rgba(0, 0, 0, 0.2),
    0 0 0 2px #ffffff inset;
  -webkit-box-shadow:
    0 1px 0px rgba(0, 0, 0, 0.2),
    0 0 0 2px #fff inset;
  box-shadow:
    0 1px 0px rgba(0, 0, 0, 0.2),
    0 0 0 2px #fff inset;
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
  border-radius: 3px;
  display: inline-block;
  margin: 0 0.1em;
  text-shadow: 0 1px 0 #fff;
  line-height: 1.4;
  white-space: nowrap;
}

#shortcuts .modal-body {
  max-height: 500px;
}

ul.shortcut-legend li {
  margin-bottom: 10px;
}

li.blank {
  list-style-type: none;
  height: 20px;
}

#zen a {
  color: #93a1a1;
  font-size: 14px;
  border-bottom: 1px dotted #93a1a1;
  text-decoration: none;
}

#zen .view-all {
  line-height: 18px;
}

#pagination {
  text-align: center;
}

#pagination a {
  color: #93a1a1;
  border-bottom: 1px dotted #93a1a1;
  text-decoration: none;
  margin: 0 7px;
}

#feed-title {
  margin-bottom: 10px;
  font-size: 28px;
  text-align: center;
}

Error running stringer-rss image /usr/bin/env: ‘shr’: No such file or directory

This error was fixed by applying dos2unix to the stringer/docker/start.sh file then re building the image.

Comments

comments powered by Disqus