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.0;
}

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: #657B83;
}

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