diff --git a/contrib/static/krane.css b/contrib/static/krane.css
new file mode 100644
index 0000000..7b61744
--- /dev/null
+++ b/contrib/static/krane.css
@@ -0,0 +1,338 @@
+ body {
+ margin: 0px;
+ background: #101010;
+ font-family: arial,sans-serif,helvetica;
+ color:#ffffff;
+ font-size: 10pt;
+ }
+ /*table {
+ font-size: 10pt;
+ }*/
+ a {
+ color: #f7acb1;
+ }
+ hr {
+ color: #363636;
+ width: 98%;
+ height: 0px;
+ border-top: 1px solid;
+ border-bottom: none;
+ }
+ .sitetitle {
+ text-align: center;
+ color: #ABABAB;
+ margin: 10px 20px 20px 20px;
+ }
+ .sitetitle h2 {
+ margin: 0px;
+ }
+ .sitetitle a {
+ color: #ABABAB;
+ text-decoration: none;
+ }
+ .filedescription {
+ font-style: italic;
+ }
+ .messageroot .highlightroot{
+ margin-bottom: 1px;
+ border: none;
+ background: #101010;
+ padding: 9px 9px 1em;
+ }
+ .message, .highlight {
+ margin-left: 25px;
+ margin-bottom: 1px;
+ border: 1px solid #363636;
+ background: #1c1c1c;
+ border-radius: 0px;
+ padding: 9px 9px 1.5em;
+ }
+ .highlight .highlightroot {
+ background: #EEDACB;
+ padding: 10px;
+ color: #333333;
+ border: 2px dashed #EE6600;
+ }
+ .image_link {
+ float: left;
+ padding-right: 5px;
+ position: relative;
+ }
+ .image_root {
+ border-radius: 0px;
+ border: 1px solid #363636;
+ }
+ .image {
+ border-radius: 0px;
+ border: 1px solid #363636;
+ }
+ .thread {
+ padding-top: 5px;
+ padding-left: 10px;
+ padding-right: 20px;
+ }
+ .message_span {
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ }
+ .topicline b{
+ color:#ff1493;
+ }
+ .postform th {
+ background: #1c1c1c;
+ border: 1px solid #363636;
+ text-align: left;
+ padding-left: 4px;
+ padding-right: 5px;
+ }
+ .posttext {
+ width: 400px;
+ height: 20px;
+ border: 1px solid #363636;
+ background: #ffffff;
+ }
+ .postbutton {
+ width: 100px;
+ border: 1px solid #363636;
+ background: #ffffff;
+ }
+ #newthread {
+ background: #F7ACB1;
+ }
+ .postarea {
+ width: 400px;
+ height: 48px;
+ border: 1px solid #363636;
+ background: #ffffff;
+ padding: 0px;
+ margin: 0px;
+ }
+ .postfile {
+ }
+ .boards {
+ padding: 0px 2.5em 0px 10px;
+ }
+ .boards a,
+ .pagelist a{
+ text-decoration: none;
+ }
+ .evilstuff {
+ background-color: #333333;
+ border: 1px solid #666666;
+ border-radius: 30px;
+ padding: 10px;
+ margin-right: 10px;
+ position: fixed;
+ right: 0px;
+ top: 20px;
+ display: none;
+ }
+ .stillevil {
+ display: none;
+ }
+ .evilmod {
+ position: fixed;
+ right: 20px;
+ top: 0px;
+ }
+ .evilmod:checked ~ form .evilstuff {
+ display: block;
+ }
+ .evilmod:checked ~ form .stillevil {
+ display: inline;
+ }
+ .stillevil input {
+ margin: 0px;
+ }
+ .warning {
+ color: #FF0000;
+ display: none;
+ }
+ .purge_root:checked ~ .warning {
+ display: inline;
+ }
+ .sig_label {
+ color: #00FF00;
+ cursor: pointer;
+ font-weight: bold;
+ }
+ .sig_chk {
+ position: absolute;
+ opacity: 0;
+ z-index: -1;
+ }
+ .sig_key {
+ padding-left: 5px;
+ display: none;
+ }
+ .sig_chk:checked ~ .sig_key {
+ display: inline;
+ }
+ .lblhelp {
+ position: fixed;
+ top: 0px;
+ right: 10px;
+ cursor: pointer;
+ font-weight: bold;
+ }
+ a.lblhelp, a.lblhelp:hover {
+ color: #C5C8C6;
+ padding: 0px;
+ text-decoration: none;
+ }
+ .quote {
+ color: #00AA00;
+ }
+ .code {
+ background-color: #303030;
+ border: 1px solid #404040;
+ clear: right;
+ font-family: monospace;
+ font-size: 9pt;
+ overflow: auto;
+ width: 80%;
+ display: block;
+ margin: 0;
+ }
+ .datatable {
+ background: #141414;
+ border: 1px solid #3B3B3B;
+ border-collapse: collapse;
+ }
+ .datatable th {
+ background: #1C1C1C;
+ }
+ .datatable td, .datatable th {
+ border: 1px dotted #3B3B3B;
+ padding: 1px 4px;
+ vertical-align: top;
+ }
+ .mod {
+ font-family: monospace;
+ font-size: 9pt;
+ margin: 20px 10px 10px;
+ }
+ .mod tr:hover {
+ background-color: #282828 !important;
+ }
+ .mod table {
+ border-collapse: collapse;
+ font-size: 9pt; /* damn you chromium */
+ }
+ .dontwrap {
+ white-space: nowrap;
+ }
+ .right {
+ text-align: right;
+ }
+ .spoiler, .spoiler a:link, .spoiler a:visited {
+ color: black;
+ background: black;
+ }
+
+ .spoiler:hover {
+ color: white;
+ }
+
+ .spoiler:hover a:link {
+ color: #FF6600;
+ }
+
+ .spoiler:hover a:visited {
+ color: #FF6600;
+ }
+
+ .spoiler:hover a:hover {
+ color: #0066FF;
+ }
+ .zoi {
+ color: purple;
+ }
+ .op-kyn {
+ color: skyblue;
+ }
+ .menu-footer {
+ font-size: 0.7em;
+ text-align: center;
+ margin: 0.3em;
+ bottom: 5em;
+ position: fixed
+ }
+ .published {
+ font-size: 0.85em;
+ color: #898E93;
+ }
+ .menu-left {
+ font-size: 0.9em;
+ }
+ .board_description {
+ width: 400px;
+ padding: 10px;
+ font-size: 0.75em;
+ font-family: sans-serif;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+ }
+ /*
+ .play_button {
+ background-image: url("/static/playbutton.png");
+ height: 53px;
+ width: 70px;
+ position: absolute;
+ top: calc(50% - 26px);
+ left: calc(50% - 35px);
+ }
+*/
+ .news {
+ border: 1px solid #3b3b3b;
+ background: #141414;
+ margin: 10px 20px 10px 20px;
+ }
+ .news .header {
+ background: #1c1c1c;
+ font-style: italic;
+ padding: 3px 5px 0px 5px;
+ text-align: right;
+ border-bottom: 1px dotted #3b3b3b;
+ }
+ .news .author {
+ font-style: italic;
+ font-weight: bold;
+ }
+ .news .header .topicline .subject {
+ font-style: normal;
+ float: left;
+ }
+ .news .message_span {
+ padding: 10px 5px 0px 5px;
+ }
+ .news .footer {
+ text-align: right;
+ font-style: italic;
+ padding: 0px 5px 5px;
+ }
+ .activity {
+ padding: 10px 20px;
+ }
+ .activity td, .activity th {
+ vertical-align: top;
+ white-space: nowrap;
+ }
+ .post_td {
+ width: 100%;
+ padding: 0px 10px;
+ }
+ .post_td td {
+ text-align: right;
+ }
+ .post_td .subject {
+ text-align: left;
+ white-space: normal;
+ padding-left: 10px;
+ }
+ .aa {
+ font-family: "IPAMonaPGothic","Monapo","Mona","MS PGothic";
+ overflow: auto;
+ display: block;
+ margin: 0;
+ }
diff --git a/contrib/templates/placebo/404.mustache b/contrib/templates/placebo/404.mustache
new file mode 100644
index 0000000..724ee46
--- /dev/null
+++ b/contrib/templates/placebo/404.mustache
@@ -0,0 +1,25 @@
+{{!
+ 404.mustache -- 404 page
+ template parameters:
+ - prefix (the site prefix)
+}}
+
+
+
+ 404
+
+
+
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{resource_not_found}}{{/i18n.Translations}}
+
+
+
+
+
diff --git a/contrib/templates/placebo/board.mustache b/contrib/templates/placebo/board.mustache
new file mode 100644
index 0000000..e763235
--- /dev/null
+++ b/contrib/templates/placebo/board.mustache
@@ -0,0 +1,46 @@
+{{!
+ board.mustache, displays the contents of page N of the board
+
+ template parameters:
+ - board ( the model of the current page )
+ - page ( the page number of the current page )
+
+ board has the properties:
+ - Prefix ( absolute path like //site.tld/ or /path/ )
+ - Board ( the name of the board )
+ - Navbar ( a function that renders the navbar, should not be escaped )
+ - Threads ( a list of Thread Models with the last few replies )
+ }}
+
+
+
+ {{board.Board}}
+
+
+
+
+ {{{ board.Navbar }}}
+
+
+
+
decentralized and distributed
+
+ {{Board.Name}}
+ {{{Postform}}}
+ {{#Threads}}
+
+ {{{OP.RenderPost}}}
+ {{#Replies}}
+ {{{RenderPost}}}
+ {{/Replies}}
+
+
+ {{/Threads}}
+
+
+ All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.
+ To make a DMCA request or report illegal content, please contact the administration
+
+
+
diff --git a/contrib/templates/placebo/boardlist.mustache b/contrib/templates/placebo/boardlist.mustache
new file mode 100644
index 0000000..b9ff2b2
--- /dev/null
+++ b/contrib/templates/placebo/boardlist.mustache
@@ -0,0 +1,51 @@
+{{!
+ boardlist.mustache -- full list of every board
+ template parameters:
+ - graph ( a list of 4 string tuples: (board, posts_per_hour, posts_per_day, total_posts) )
+ - frontend ( the name of the frontend )
+ - prefix ( the site's prefix )
+}}
+
+
+
+
+
+ {{frontend}} {{#i18n.Translations}}{{board_list_title}}{{/i18n.Translations}}
+
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{board_label}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{pph_label}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{ppd_label}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{total}}{{/i18n.Translations}}
+
+
+
+ {{# graph}}
+
+
+ {{Board}}
+
+
+ {{Hour}}
+
+
+ {{Day}}
+
+
+ {{All}}
+
+
+ {{/ graph}}
+
+
+
+
+
+
+
diff --git a/contrib/templates/placebo/catalog.mustache b/contrib/templates/placebo/catalog.mustache
new file mode 100644
index 0000000..df56cf5
--- /dev/null
+++ b/contrib/templates/placebo/catalog.mustache
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{catalog_title}}{{/i18n.Translations}} {{board.Name}}
+
+
+
+ {{{board.Navbar}}}
+
+
+
+
+
+
+
+
+
+ {{#board.Threads}}
+
+
+
+
{{OP.Subject}}
+
+ {{{OP.RenderBody}}}
+
+
+ {{/board.Threads}}
+
+
+
+
+ All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.
+ To make a DMCA request or report illegal content, please contact the administration
+
+
+
diff --git a/contrib/templates/placebo/frontpage.mustache b/contrib/templates/placebo/frontpage.mustache
new file mode 100644
index 0000000..24d634b
--- /dev/null
+++ b/contrib/templates/placebo/frontpage.mustache
@@ -0,0 +1,25 @@
+{{!
+ frontpage.mustache -- template for index.html
+ template parameters:
+ - boardgraph ( markup of boardPageRows instance, see srnd/model.go )
+ - postgraph ( markup of postsGraph instance , see srnd/model.go )
+ - overview ( markup of overviewModel instance , see srnd/model.go )
+ - totalposts ( the number of total posts we have ever seen )
+ - frontend ( the name of the frontend )
+ - prefix ( the site's prefix )
+}}
+
+
+
+
+ OVERCHAN
+
+
+ enter
+
+
+ All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.
+ To make a DMCA request or report illegal content, please contact the administration
+
+
+
diff --git a/contrib/templates/placebo/graph_history.mustache b/contrib/templates/placebo/graph_history.mustache
new file mode 100644
index 0000000..f61405d
--- /dev/null
+++ b/contrib/templates/placebo/graph_history.mustache
@@ -0,0 +1,37 @@
+{{!
+graph_history.mustache
+template parameters:
+- history ( a list of PostEntry instances, see srnd/model.go )
+
+}}
+
+
+
+
+
+
+ {{#i18n.Translations}}{{post_history_title}}{{/i18n.Translations}}
+
+
+
+
+
+
+ {{#i18n.Translations}}{{month}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{posts}}{{/i18n.Translations}}
+
+
+
+
+ {{#history.Scale}}
+
+ {{Date}}
+ {{Num}}
+ {{OvercockGraph}}
+
+ {{/history.Scale}}
+
+
+
+
+
diff --git a/contrib/templates/placebo/inst_api.mustache b/contrib/templates/placebo/inst_api.mustache
new file mode 100644
index 0000000..908d104
--- /dev/null
+++ b/contrib/templates/placebo/inst_api.mustache
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{api_install_title}}{{/i18n.Translations}}
+
+
+
+ {{#dialog.HasError}}
+ {{dialog.Error}}
+ {{/dialog.HasError}}
+
+ {{#dialog.HasPrevious}}
+
+
+
+ {{/dialog.HasPrevious}}
+
+
diff --git a/contrib/templates/placebo/inst_bins.mustache b/contrib/templates/placebo/inst_bins.mustache
new file mode 100644
index 0000000..278238e
--- /dev/null
+++ b/contrib/templates/placebo/inst_bins.mustache
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{binary_install_title}}{{/i18n.Translations}}
+
+
+
+ {{#dialog.HasError}}
+ {{dialog.Error}}
+ {{/dialog.HasError}}
+
+ {{#dialog.HasPrevious}}
+
+
+
+ {{/dialog.HasPrevious}}
+
+
diff --git a/contrib/templates/placebo/inst_cache.mustache b/contrib/templates/placebo/inst_cache.mustache
new file mode 100644
index 0000000..786c8b2
--- /dev/null
+++ b/contrib/templates/placebo/inst_cache.mustache
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{cache_install_title}}{{/i18n.Translations}}
+
+
+
+ {{#dialog.HasError}}
+ {{dialog.Error}}
+ {{/dialog.HasError}}
+
+ {{#dialog.HasPrevious}}
+
+
+
+ {{/dialog.HasPrevious}}
+
+
diff --git a/contrib/templates/placebo/inst_crypto.mustache b/contrib/templates/placebo/inst_crypto.mustache
new file mode 100644
index 0000000..4567736
--- /dev/null
+++ b/contrib/templates/placebo/inst_crypto.mustache
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{crypto_install_title}}{{/i18n.Translations}}
+
+
+
+ {{#dialog.HasError}}
+ {{dialog.Error}}
+ {{/dialog.HasError}}
+
+ {{#dialog.HasPrevious}}
+
+
+
+ {{/dialog.HasPrevious}}
+
+
diff --git a/contrib/templates/placebo/inst_db.mustache b/contrib/templates/placebo/inst_db.mustache
new file mode 100644
index 0000000..1af7884
--- /dev/null
+++ b/contrib/templates/placebo/inst_db.mustache
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{db_install_title}}{{/i18n.Translations}}
+
+
+
+ {{#dialog.HasError}}
+ {{dialog.Error}}
+ {{/dialog.HasError}}
+
+ {{#dialog.HasPrevious}}
+
+
+
+ {{/dialog.HasPrevious}}
+
+
diff --git a/contrib/templates/placebo/inst_frontend.mustache b/contrib/templates/placebo/inst_frontend.mustache
new file mode 100644
index 0000000..7535dfe
--- /dev/null
+++ b/contrib/templates/placebo/inst_frontend.mustache
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{frontend_install_title}}{{/i18n.Translations}}
+
+
+
+ {{#dialog.HasError}}
+ {{dialog.Error}}
+ {{/dialog.HasError}}
+
+ {{#dialog.HasPrevious}}
+
+
+
+ {{/dialog.HasPrevious}}
+
+
diff --git a/contrib/templates/placebo/inst_key.mustache b/contrib/templates/placebo/inst_key.mustache
new file mode 100644
index 0000000..5f932ea
--- /dev/null
+++ b/contrib/templates/placebo/inst_key.mustache
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{key_install_title}}{{/i18n.Translations}}
+
+
+
+ {{#dialog.HasError}}
+ {{dialog.Error}}
+ {{/dialog.HasError}}
+
+ {{#dialog.HasPrevious}}
+
+
+
+ {{/dialog.HasPrevious}}
+
+
diff --git a/contrib/templates/placebo/inst_nntp.mustache b/contrib/templates/placebo/inst_nntp.mustache
new file mode 100644
index 0000000..a6a6af6
--- /dev/null
+++ b/contrib/templates/placebo/inst_nntp.mustache
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{nntp_install_title}}{{/i18n.Translations}}
+
+
+
+ {{#dialog.HasError}}
+ {{dialog.Error}}
+ {{/dialog.HasError}}
+
+ {{#dialog.HasPrevious}}
+
+
+
+ {{/dialog.HasPrevious}}
+
+
diff --git a/contrib/templates/placebo/inst_postgres_db.mustache b/contrib/templates/placebo/inst_postgres_db.mustache
new file mode 100644
index 0000000..4fdc4d8
--- /dev/null
+++ b/contrib/templates/placebo/inst_postgres_db.mustache
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{postgres_db_install_title}}{{/i18n.Translations}}
+
+
+
+ {{#dialog.HasError}}
+ {{dialog.Error}}
+ {{/dialog.HasError}}
+
+ {{#dialog.HasPrevious}}
+
+
+
+ {{/dialog.HasPrevious}}
+
+
diff --git a/contrib/templates/placebo/inst_redis_cache.mustache b/contrib/templates/placebo/inst_redis_cache.mustache
new file mode 100644
index 0000000..67ed6c2
--- /dev/null
+++ b/contrib/templates/placebo/inst_redis_cache.mustache
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{redis_db_install_title}}{{/i18n.Translations}}
+
+
+
+ {{#dialog.HasError}}
+ {{dialog.Error}}
+ {{/dialog.HasError}}
+
+ {{#dialog.HasPrevious}}
+
+
+
+ {{/dialog.HasPrevious}}
+
+
diff --git a/contrib/templates/placebo/inst_redis_db.mustache b/contrib/templates/placebo/inst_redis_db.mustache
new file mode 100644
index 0000000..67ed6c2
--- /dev/null
+++ b/contrib/templates/placebo/inst_redis_db.mustache
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{redis_db_install_title}}{{/i18n.Translations}}
+
+
+
+ {{#dialog.HasError}}
+ {{dialog.Error}}
+ {{/dialog.HasError}}
+
+ {{#dialog.HasPrevious}}
+
+
+
+ {{/dialog.HasPrevious}}
+
+
diff --git a/contrib/templates/placebo/keygen.mustache b/contrib/templates/placebo/keygen.mustache
new file mode 100644
index 0000000..fe2a4e9
--- /dev/null
+++ b/contrib/templates/placebo/keygen.mustache
@@ -0,0 +1,23 @@
+{{!
+ keygen.mustache -- page containing a newly generated tripcode
+ template parameters:
+ - prefix ( the site prefix )
+ - public ( the public key in hex )
+ - secret ( the secret key in hex )
+ - tripcode ( html version of the public key )
+ }}
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{new_tripcode_title}}{{/i18n.Translations}}
+
+
+ {{#i18n.Translations}}{{new_tripcode_label}}{{/i18n.Translations}}:
+ {{#i18n.Translations}}{{secret_key}}{{/i18n.Translations}}: {{secret}}
{{#i18n.Translations}}{{public_key}}{{/i18n.Translations}}: {{public}}
{{#i18n.Translations}}{{tripcode}}{{/i18n.Translations}}: {{{tripcode}}}
+
+
+
diff --git a/contrib/templates/placebo/live.mustache b/contrib/templates/placebo/live.mustache
new file mode 100644
index 0000000..a5dd838
--- /dev/null
+++ b/contrib/templates/placebo/live.mustache
@@ -0,0 +1,32 @@
+{{!
+ live.mustache -- live ui
+ template parameters:
+ - prefix ( site prefix )
+}}
+
+
+
+ {{#i18n.Translations}}{{overboard_title}}{{/i18n.Translations}}
+
+
+
+
+
+
+
+
+ you need js for livechan mode
+
+
+
diff --git a/contrib/templates/placebo/modfeed.mustache b/contrib/templates/placebo/modfeed.mustache
new file mode 100644
index 0000000..f289c6c
--- /dev/null
+++ b/contrib/templates/placebo/modfeed.mustache
@@ -0,0 +1,49 @@
+{{!
+ modpage.mustache -- the moderator panel when logged in
+ template parameters:
+ - prefix ( the site's prefix )
+
+ }}
+
+
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{modpage_title}}{{/i18n.Translations}}
+
+
+
+
+
Add Feed
+
Host
+
+
Port
+
+
Name
+
+
Add
+
+
+
Remove Feed
+
Name
+
+
Remove
+
+
+
Sync Feeds
+
Sync All
+
+
+
+
+
+ {{#i18n.Translations}}{{nojs_info}}{{/i18n.Translations}}
+
+
+
diff --git a/contrib/templates/placebo/modlogin.mustache b/contrib/templates/placebo/modlogin.mustache
new file mode 100644
index 0000000..10874a7
--- /dev/null
+++ b/contrib/templates/placebo/modlogin.mustache
@@ -0,0 +1,16 @@
+
+
+
+
+
+ {{#i18n.Translations}}{{login}}{{/i18n.Translations}}
+
+
+
+
+
diff --git a/contrib/templates/placebo/modlogin_result.mustache b/contrib/templates/placebo/modlogin_result.mustache
new file mode 100644
index 0000000..d063ec8
--- /dev/null
+++ b/contrib/templates/placebo/modlogin_result.mustache
@@ -0,0 +1,20 @@
+{{!
+ modlogin_result.mustache -- shows the result of a login attempt
+ template parameters:
+ - prefix ( the site prefix )
+ - mod_prefix ( the prefix to the mod panel, could be something like https://mod.site.tld/ or /mod/ )
+ - message ( the message returned from the login attempt )
+ - fail ( present if the login failed ) // not yet added
+ }}
+
+
+
+
+
+
+ {{#i18n.Translations}}{{login}}{{/i18n.Translations}}
+
+
+ {{message}}
+
+
diff --git a/contrib/templates/placebo/modpage.mustache b/contrib/templates/placebo/modpage.mustache
new file mode 100644
index 0000000..5fe1093
--- /dev/null
+++ b/contrib/templates/placebo/modpage.mustache
@@ -0,0 +1,109 @@
+{{!
+ modpage.mustache -- the moderator panel when logged in
+ template parameters:
+ - prefix ( the site's prefix )
+
+ }}
+
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{modpage_title}}{{/i18n.Translations}}
+
+
+
+
{{#i18n.Translations}}{{post_actions_label}}{{/i18n.Translations}}
+
+
+ {{#i18n.Translations}}{{target_label}}{{/i18n.Translations}}
+
+
+
+ {{#i18n.Translations}}{{ban_url_prompt}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{delete_url_prompt}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{unban_ip_prompt}}{{/i18n.Translations}}
+
+
+
+
+
{{#i18n.Translations}}{{key_actions_label}}{{/i18n.Translations}}
+
+ {{#i18n.Translations}}{{pubkey_label}}{{/i18n.Translations}}:
+
+
+
+ {{#i18n.Translations}}{{add_key_prompt}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{remove_key_prompt}}{{/i18n.Translations}}
+
+
+
+
+
{{#i18n.Translations}}{{nntp_login_label}}{{/i18n.Translations}}
+
+ {{#i18n.Translations}}{{username}}{{/i18n.Translations}}:
+
+
+
+ {{#i18n.Translations}}{{password}}{{/i18n.Translations}}:
+
+
+
+ {{#i18n.Translations}}{{add_user_prompt}}{{/i18n.Translations}}
+
+
+ {{#i18n.Translations}}{{remove_user_prompt}}{{/i18n.Translations}}
+
+
+
+
+
{{#i18n.Translations}}{{board_actions_label}}{{/i18n.Translations}}
+
+ {{#i18n.Translations}}{{board_name_title}}{{/i18n.Translations}}:
+
+
+
+ {{#i18n.Translations}}{{add_board_prompt}}{{/i18n.Translations}}
+
+
+ {{#i18n.Translations}}{{regenerate_prompt}}{{/i18n.Translations}}
+
+
+ {{#i18n.Translations}}{{ban_prompt}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{unban_prompt}}{{/i18n.Translations}}
+
+
+ {{#i18n.Translations}}{{nuke_prompt}}{{/i18n.Translations}}
+
+
+
+
+
+ {{#i18n.Translations}}{{light_actions_label}}{{/i18n.Translations}}
+
+
+ {{#i18n.Translations}}{{reload_templates_prompt}}{{/i18n.Translations}}
+
+
+
+
+
{{#i18n.Translations}}{{heavy_actions_label}}{{/i18n.Translations}}
+
+ {{#i18n.Translations}}{{regenerate_markup_prompt}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{regenerate_thumbs_prompt}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{feed_sync_prompt}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{expire_old_prompt}}{{/i18n.Translations}}
+
+
+
+
+
+ {{#i18n.Translations}}{{nojs_info}}{{/i18n.Translations}}
+
+
+
diff --git a/contrib/templates/placebo/navbar.mustache b/contrib/templates/placebo/navbar.mustache
new file mode 100644
index 0000000..5c0fa34
--- /dev/null
+++ b/contrib/templates/placebo/navbar.mustache
@@ -0,0 +1,56 @@
+{{!
+ navbar.mustache -- element on the top of each nod-mod page
+
+ TODO: make this not suck, have a board list, have board page list
+
+ template parameters:
+ - name ( the name of whatever resource we are on, board/thread )
+ - frontend ( the name of the frontend we are on )
+ - links ( a list of Link Models to display )
+ - prefix ( site prefix )
+ }}
+
+
diff --git a/contrib/templates/placebo/newboard.mustache b/contrib/templates/placebo/newboard.mustache
new file mode 100644
index 0000000..1889605
--- /dev/null
+++ b/contrib/templates/placebo/newboard.mustache
@@ -0,0 +1,56 @@
+
+
+ {{#i18n.Translations}}{{new_board_title}}{{/i18n.Translations}}
+
+
+
+
+
+ {{#i18n.Translations}}{{first_post_label}}{{/i18n.Translations}}
+
+
+
+
diff --git a/contrib/templates/placebo/overview.mustache b/contrib/templates/placebo/overview.mustache
new file mode 100644
index 0000000..2ad7e11
--- /dev/null
+++ b/contrib/templates/placebo/overview.mustache
@@ -0,0 +1,25 @@
+{{! overview.mustache
+paramters:
+
+- overview (list of PostModels in order of last posted)
+
+}}
+
+
+
+
+ {{#i18n.Translations}}{{newsgroup}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{posted}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{subject}}{{/i18n.Translations}}
+
+
+
+ {{#overview}}
+
+ {{Board}}
+ {{Date}}
+ {{Truncate.Subject}}
+
+ {{/overview}}
+
+
diff --git a/contrib/templates/placebo/post.mustache b/contrib/templates/placebo/post.mustache
new file mode 100644
index 0000000..f88f176
--- /dev/null
+++ b/contrib/templates/placebo/post.mustache
@@ -0,0 +1,37 @@
+
+ {{#post.Attachments}}
+
+ {{/post.Attachments}}
+
{{post.subject}} {{post.Name}} {{post.Posted}} №
+ № {{post.ShortHash}}
+
+
{{post.MessageID}}
+
+
{{post.RenderBodyPre}}
+
+
diff --git a/contrib/templates/placebo/post_fail.mustache b/contrib/templates/placebo/post_fail.mustache
new file mode 100644
index 0000000..e74265a
--- /dev/null
+++ b/contrib/templates/placebo/post_fail.mustache
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{post_failed_label}}{{/i18n.Translations}}: {{reason}}
+
+
diff --git a/contrib/templates/placebo/post_retry.mustache b/contrib/templates/placebo/post_retry.mustache
new file mode 100644
index 0000000..fcee14e
--- /dev/null
+++ b/contrib/templates/placebo/post_retry.mustache
@@ -0,0 +1,49 @@
+
+
+
+ try again
+
+
+
+
+
+
+ {{#attachment}}
+
+
+
+ {{/attachment}}
+
+
+
+
+
+
+
+
+
diff --git a/contrib/templates/placebo/post_success.mustache b/contrib/templates/placebo/post_success.mustache
new file mode 100644
index 0000000..a53f1b9
--- /dev/null
+++ b/contrib/templates/placebo/post_success.mustache
@@ -0,0 +1,17 @@
+{{!
+ post_success.mustache -- shown when we do a successful post
+ template parameters:
+ - redirect_url ( the url of the next page we should redirect to )
+ - message_id ( the value of the Message-ID header in the post we made, the truncated sha1 of this is the >>posthash )
+ }}
+
+
+
+
+
+
+
+
+ {{#i18n.Translations}}{{posted_as_label}}{{/i18n.Translations}} {{message_id}}
+
+
diff --git a/contrib/templates/placebo/postform.mustache b/contrib/templates/placebo/postform.mustache
new file mode 100644
index 0000000..cc5a547
--- /dev/null
+++ b/contrib/templates/placebo/postform.mustache
@@ -0,0 +1,42 @@
+{{!
+ postform.mustache -- the form for posting
+
+ template parameters:
+ - post_url ( the url of the post form )
+ - reference ( the post we are replying to, or empty string if it's an op )
+ - button ( the text for the reply button )
+ - files ( bool, do we allow attachments ? )
+ - csrf ( csrf token )
+ }}
+
diff --git a/contrib/templates/placebo/posts_graph.mustache b/contrib/templates/placebo/posts_graph.mustache
new file mode 100644
index 0000000..96c0262
--- /dev/null
+++ b/contrib/templates/placebo/posts_graph.mustache
@@ -0,0 +1,25 @@
+{{!
+posts graph.mustache -- post frequence graph
+parameters:
+
+ * graph - a postsGraph instance (see srnd/model.go)
+}}
+
+
+
+
+ {{#i18n.Translations}}{{day}}{{/i18n.Translations}}
+ {{#i18n.Translations}}{{posts}}{{/i18n.Translations}}
+
+
+
+
+ {{#graph.Scale}}
+
+ {{Day}}
+ {{Num}}
+ {{OvercockGraph}}
+
+ {{/graph.Scale}}
+
+
diff --git a/contrib/templates/placebo/thread.mustache b/contrib/templates/placebo/thread.mustache
new file mode 100644
index 0000000..2ad7b14
--- /dev/null
+++ b/contrib/templates/placebo/thread.mustache
@@ -0,0 +1,44 @@
+{{!
+ thread.mustache -- renders to a thread-*.html page, shows the entire thread
+ template parameters:
+ - board ( the Board Model of the board this thread was posted in )
+ - thread ( the Thread Model of the current thread being rendered )
+
+ Thread Model attributes:
+ - OP , the Post Model of the original poster
+ - Replies , a list of all the replies or empty if none
+ - Board , the name of the Board this thread is on
+ - BoardURL , the url that points to the board index page
+}}
+
+
+
+ {{board.Board}}
+
+
+
+
+ {{{ board.Navbar }}}
+
+
+
+
decentralized and distributed
+
+ {{Board.Name}}
+ {{{Postform}}}
+
+
+ {{{OP.RenderPost}}}
+ {{#Replies}}
+ {{{RenderPost}}}
+ {{/Replies}}
+
+
+
+
+ All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.
+ To make a DMCA request or report illegal content, please contact the administration
+
+
+
diff --git a/contrib/templates/placebo/ukko.mustache b/contrib/templates/placebo/ukko.mustache
new file mode 100644
index 0000000..34c1ac2
--- /dev/null
+++ b/contrib/templates/placebo/ukko.mustache
@@ -0,0 +1,34 @@
+{{!
+ ukko.mustache -- overboard, contains the last threads posted regardless of newsgroup
+ template parameters:
+ - prefix ( site prefix )
+ - threads ( a list of Thread Models that represent the latest threads )
+ }}
+
+
+
+
+ overboard
+
+
+
+
+
+ OVERCHAN
+ {{#threads}}
+
+ {{{OP.RenderPost}}}
+ {{#Replies}}
+ {{{RenderPost}}}
+ {{/Replies}}
+
+
+ {{/threads}}
+
+
+ All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.
+ To make a DMCA request or report illegal content, please contact the administration
+
+
+