diff --git a/.gitignore b/.gitignore
index 8a9b369..75a083d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,4 +14,8 @@
articles
# generated files
-webroot
\ No newline at end of file
+webroot
+
+# built binaries
+go
+srndv2
diff --git a/contrib/static/chen-chan-faq.html b/contrib/static/chen-chan-faq.html
new file mode 100644
index 0000000..4592b8a
--- /dev/null
+++ b/contrib/static/chen-chan-faq.html
@@ -0,0 +1,52 @@
+
nntpchan faq
+
+
nntpchan faq
+
+
What is nntpchan?
+
NNTPCchan is a federated imageboard that spans across several networks including tor, i2p and anonet. There are no central servers so that as long as 1 server is left the forum will continue to function.
+
+
How is this different from *chan?
+
NNTPChan is by design invulnerable to global censorship. All moderation is local to each server.
+
+
How does moderation work then?
+
Moderation is done with our special tripcodes (ed25519-sha512 signed posts). Anyone can give moderation suggestions, but that doesn't mean anyone will accept them. Those who trust the actions of a moderator can have their frontend whitelist the moderation actions and have them performed without oversight by another moderator.
+
+
How can I remove content from nntpchan completely?
+
‾\(._.)/‾ I don't know. You probably can't unless every server agrees to remove the content, even then, nothing prevents someone from reposting it. You can't delete what you post on the internet.
+
+
do you allow child porn?
+
no.
+
+
Do you allow XYZ content?
+
If it violates USA Law or causes problems with my host, no. Otherwise, probably.
+
+
Someone posted something I don't like but it's not illegal
+
That is not my problem. All posts on this site are the responsibility of the individual poster and not the administration of this server
basically no stuff that will fuck with the functioning of the site.
+ - stuff that will get me in trouble like cp.
+ - flood/spam. duplicate posts may also get baleeted.
+
+
+
guidelines and things to keep in mind
+
+ - i don't owe you shiieet. you don't owe me shieet.
+ - administration style: benevolent dictatorship.
+
+
+
diff --git a/contrib/static/chen-chan.css b/contrib/static/chen-chan.css
new file mode 100644
index 0000000..ea49e4f
--- /dev/null
+++ b/contrib/static/chen-chan.css
@@ -0,0 +1,7 @@
+body{font-family:monospace}
+dl{max-width:84ch}
+dd{margin-left:4ch;overflow:auto}
+.memearrows{color:green}
+pre{margin: 0 0 0 0}
+table,th,td{border:1px solid gray}
+table {border-collapse:collapse}
\ No newline at end of file
diff --git a/contrib/templates/chen-chan/board.mustache b/contrib/templates/chen-chan/board.mustache
new file mode 100644
index 0000000..265c9f6
--- /dev/null
+++ b/contrib/templates/chen-chan/board.mustache
@@ -0,0 +1,27 @@
+{{!
+ 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}}}
+ {{{form}}}
+
+
diff --git a/contrib/templates/chen-chan/boardlist.mustache b/contrib/templates/chen-chan/boardlist.mustache
new file mode 100644
index 0000000..f443599
--- /dev/null
+++ b/contrib/templates/chen-chan/boardlist.mustache
@@ -0,0 +1,33 @@
+{{!
+ 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}} boards
+
+
diff --git a/contrib/templates/chen-chan/frontpage.mustache b/contrib/templates/chen-chan/frontpage.mustache
new file mode 100644
index 0000000..246f007
--- /dev/null
+++ b/contrib/templates/chen-chan/frontpage.mustache
@@ -0,0 +1,11 @@
+{{!
+ frontpage.mustache -- template for index.html
+ template parameters:
+ - boardgraph ( a boardPageRows instance, see srnd/model.go )
+ - postgraph ( a postsGraph instance , see srnd/model.go )
+ - overview ( an 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 )
+}}
+{{frontend}} on nntpchan
diff --git a/contrib/templates/chen-chan/graph_history.mustache b/contrib/templates/chen-chan/graph_history.mustache
new file mode 100644
index 0000000..12eb506
--- /dev/null
+++ b/contrib/templates/chen-chan/graph_history.mustache
@@ -0,0 +1,36 @@
+{{!
+graph_history.mustache
+template parameters:
+- history ( a list of PostEntry instances, see srnd/model.go )
+
+}}
+
+
+
+
+
+ Post History
+
+
+
+
+
+
+
Month
+
Posts
+
+
+
+
+ {{#history.Scale}}
+
+
{{Date}}
+
{{Num}}
+
{{OvercockGraph}}
+
+ {{/history.Scale}}
+
+
+
+
+
diff --git a/contrib/templates/chen-chan/keygen.mustache b/contrib/templates/chen-chan/keygen.mustache
new file mode 100644
index 0000000..8b41aea
--- /dev/null
+++ b/contrib/templates/chen-chan/keygen.mustache
@@ -0,0 +1,15 @@
+{{!
+ 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 )
+}}
+new tripcode
diff --git a/contrib/templates/chen-chan/modlogin.mustache b/contrib/templates/chen-chan/modlogin.mustache
new file mode 100644
index 0000000..d6a9984
--- /dev/null
+++ b/contrib/templates/chen-chan/modlogin.mustache
@@ -0,0 +1,7 @@
+login
+
+
diff --git a/contrib/templates/chen-chan/modlogin_result.mustache b/contrib/templates/chen-chan/modlogin_result.mustache
new file mode 100644
index 0000000..a86984b
--- /dev/null
+++ b/contrib/templates/chen-chan/modlogin_result.mustache
@@ -0,0 +1,9 @@
+{{!
+ 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
+}}
+login
{{message}}
diff --git a/contrib/templates/chen-chan/modpage.mustache b/contrib/templates/chen-chan/modpage.mustache
new file mode 100644
index 0000000..29ff402
--- /dev/null
+++ b/contrib/templates/chen-chan/modpage.mustache
@@ -0,0 +1,79 @@
+{{!
+ modpage.mustache -- the moderator panel when logged in
+ template parameters:
+ - prefix ( the site's prefix )
+}}
+
+
+
+
+ nntpchan mod page
+
+
+
post actions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
key actions
+
+
+
+
+
+
+
+
+
+
+
+
+
board actions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
lightweight actions
+
+
+
+
+
+
very load heavy actions, use with care
+
+
+
+
+
+
+
+
+
status
+
+
+
+
+
+
diff --git a/contrib/templates/chen-chan/navbar.mustache b/contrib/templates/chen-chan/navbar.mustache
new file mode 100644
index 0000000..90f2a62
--- /dev/null
+++ b/contrib/templates/chen-chan/navbar.mustache
@@ -0,0 +1,12 @@
+{{!
+ 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/chen-chan/post_retry.mustache b/contrib/templates/chen-chan/post_retry.mustache
new file mode 100644
index 0000000..d235fbc
--- /dev/null
+++ b/contrib/templates/chen-chan/post_retry.mustache
@@ -0,0 +1,40 @@
+try again
+
+
diff --git a/contrib/templates/chen-chan/post_success.mustache b/contrib/templates/chen-chan/post_success.mustache
new file mode 100644
index 0000000..2db06f4
--- /dev/null
+++ b/contrib/templates/chen-chan/post_success.mustache
@@ -0,0 +1,7 @@
+{{!
+ 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 )
+}}
+
posted as {{message_id}}
diff --git a/contrib/templates/chen-chan/postform.mustache b/contrib/templates/chen-chan/postform.mustache
new file mode 100644
index 0000000..243d595
--- /dev/null
+++ b/contrib/templates/chen-chan/postform.mustache
@@ -0,0 +1,20 @@
+{{!
+ 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 )
+}}
+
diff --git a/contrib/templates/chen-chan/posts_graph.mustache b/contrib/templates/chen-chan/posts_graph.mustache
new file mode 100644
index 0000000..5ce3b9a
--- /dev/null
+++ b/contrib/templates/chen-chan/posts_graph.mustache
@@ -0,0 +1,7 @@
+{{!
+posts graph.mustache -- post frequence graph
+parameters:
+
+ * graph - a postsGraph instance (see srnd/model.go)
+}}
+
date
posts
cock
{{#graph.Scale}}
{{Day}}
{{Num}}
{{OvercockGraph}}
{{/graph.Scale}}
diff --git a/contrib/templates/chen-chan/thread.mustache b/contrib/templates/chen-chan/thread.mustache
new file mode 100644
index 0000000..c2afb7f
--- /dev/null
+++ b/contrib/templates/chen-chan/thread.mustache
@@ -0,0 +1,23 @@
+{{!
+ 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 )
+ - form ( the post form markup )
+
+ 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
+}}
+{{thread.OP.Subject}}
+ {{{thread.Navbar}}}
+ {{{form}}}
+