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: #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