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