commit 48ef17dd9ebc46b8bff1444fcdace94dbc716191 Author: Thomas Schöbel-Theuer Date: Sun Nov 17 23:37:52 2013 -0800 Create gh-pages branch via GitHub diff --git a/images/bg_hr.png b/images/bg_hr.png new file mode 100644 index 00000000..7973bd69 Binary files /dev/null and b/images/bg_hr.png differ diff --git a/images/blacktocat.png b/images/blacktocat.png new file mode 100644 index 00000000..6e264fe5 Binary files /dev/null and b/images/blacktocat.png differ diff --git a/images/icon_download.png b/images/icon_download.png new file mode 100644 index 00000000..a2a287f6 Binary files /dev/null and b/images/icon_download.png differ diff --git a/images/sprite_download.png b/images/sprite_download.png new file mode 100644 index 00000000..f2babd57 Binary files /dev/null and b/images/sprite_download.png differ diff --git a/index.html b/index.html new file mode 100644 index 00000000..67e7885c --- /dev/null +++ b/index.html @@ -0,0 +1,176 @@ + + + + + + + + + + + Mars + + + + + +
+
+ View on GitHub + +

Mars

+

Asynchronous Block-Level Storage Replication

+ +
+ Download this project as a .zip file + Download this project as a tar.gz file +
+
+
+ + +
+
+

+MARS = Multiversion Asynchronous Replication System

+ +

MARS Logo

+ +

GPLed software AS IS, sponsored by 1&1 Internet AG (www.1und1.de). Contact: tst@1und1.de

+ +

+What is MARS Light?

+ +

Main features:

+ +
    +
  • Anytime Consistency
  • +
  • Arbitrary Distances
  • +
  • Tolerates Flaky Networks
  • +

MARS Light is almost a drop-in replacement for DRBD (block-level storage replication). It runs as a Linux kernel module.

+ +

In contrast to plain DRBD, it works asynchronously and over +arbitrary distances. Our internal 1&1 testing runs between datacenters +in the US and Europe. MARS uses very different technology under the +hood, similar to transaction logging of database systems.

+ +

Reliability: application and replication are completely decoupled. +Networking problems (e.g. packet loss, bottlenecks) have no +impact onto your application at the primary side.

+ +

Anytime Consistency: on a secondary node, its version of the underlying +disk device is always consistent in itself, but may be outdated +(represent a former state from the primary side). Thanks to +incremental replication of the transaction logfiles, usually the +lag-behind will be only a few seconds, or parts of a second.

+ +

Synchronous or near-synchronous operating modes are planned for +the future, but are expected to reliably work only over short +distances (less than 50km), due to fundamental properties +of distributed systems.

+ +

WARNING! Current stage is BETA. Don't put productive data on it!

+ +

+Documentation / Manual

+ +

See https://github.com/schoebel/mars/blob/master/docu/mars-manual.pdf

+ +

+Concepts

+ +

For a very short intro, see my LCA2013 presentation docu/MARS_LCA2013.pdf .

+ +

There is also an internal 2-years old concept paper which is so much outdated, +that I don't want to publish it.

+ +

The fundamental construction principle of the planned MARS Full +is called Instance Oriented Programming (IOP) and is described in +the following paper:

+ +

http://athomux.net/papers/paper_inst2.pdf

+ +

+History

+ +

As you can see in the git log, it evolved from a very experimental +concept study, starting in the Summer of 2010. +At this time, I was working on it in my spare time.

+ +

In Summer 2011, an "official" internal 1&1 project started, which aimed +to deliver a proof of concept.

+ +

In February 2012, a pilot system was rolled out to an internal statistics +server, which collects statistics data from thousands of other servers, +and thus produces a very heavy random-access write load, formerly +replicated with DRBD (which led to performance problems due to massive +randomness). After switching to MARS, the performance was provably +better. +That server was selected because potential loss of statistics data +would be not be that critical as with other productive data, but +nevertheless it operates on productive data and loads.

+ +

After curing some small infancy problems, that server runs until today +without problems. It was upgraded to newer versions of MARS several +times (indicated by some of the git tags). Our sysadmins switched the +primary side a few times, without informing me, so I could +sleep better at night without knowing what they did ;)

+ +

In Summer 2012, the next "official" internal 1&1 project started. Its goal +was to reach enterprise grade, and therefore to rollout MARS Light on +~15 productive servers, starting with less critical systems like ones +for test webspaces etc.

+ +

In December 2012 (shortly before Christmas), I got the official permission +from our CTO Henning Kettler to publish MARS under GPL on github.

+ +

Many thanks to him!

+ +

Before that point, I was bound to my working contract which kept internal +software as secret by default (when there was no explicit permission).

+ +

Now there is a chance to build up an opensource +community for MARS, partially outside of 1&1.

+ +

Please contribute! I will be open.

+ +

I also try to respect the guidelines from Linus, but probably this +will need more work. I am already planning to invest some time into +community revision of the sourcecode, but there is not yet any schedule.

+ +

In May 2013, I got help by my new collegue Frank Liepold. He is working +on a fully automatic test suite which automates regression tests +(goal: rolling releases). That test suite is based on the internal +test suite of blkreplay and can be found in the test_suite/ subdirectory.

+ +

In November 2013, internal 1&1 projects started for mass rollout to several thousands of servers.

+ +

Although the software continues to be labelled "beta" for the next future, it has reached enterprise grade due to our internal rating process.

+ +

+Future Plans

+ +

Smaller Reworks: in Winter 2013/2014, some smaller changes to the symlink tree are planned, in order to make it more readable for humans and to prepare for future enhancements. They will only change the syntax, not the semantics. There will be an uprade plan, i.e. the old symlink tree remains usable; only newly created clusters will use the new structure.

+ +

In parallel, the software will be internally divided into three parts:

+ +
    +
  1. Generic brick framework
  2. +
  3. AIO personality with XIO bricks
  4. +
  5. MARS Light application
  6. +

I hope this will make MARS more attractive for the mainline Linux kernel community.

+
+
+ + + + + + + + diff --git a/javascripts/main.js b/javascripts/main.js new file mode 100644 index 00000000..d8135d37 --- /dev/null +++ b/javascripts/main.js @@ -0,0 +1 @@ +console.log('This would be the main JS file.'); diff --git a/params.json b/params.json new file mode 100644 index 00000000..71eb1617 --- /dev/null +++ b/params.json @@ -0,0 +1 @@ +{"name":"Mars","tagline":"Asynchronous Block-Level Storage Replication","body":"# MARS = Multiversion Asynchronous Replication System\r\n\r\n![MARS Logo](https://github.com/schoebel/mars/blob/master/docu/images/earth-mars-transfer.jpg)\r\n\r\nGPLed software AS IS, sponsored by 1&1 Internet AG (www.1und1.de). Contact: tst@1und1.de\r\n\r\n## What is MARS Light?\r\n\r\nMain features:\r\n* Anytime Consistency\r\n* Arbitrary Distances\r\n* Tolerates Flaky Networks\r\n\r\nMARS Light is almost a drop-in replacement for DRBD (block-level storage replication). It runs as a Linux kernel module.\r\n\r\nIn contrast to plain DRBD, it works _asynchronously_ and over\r\narbitrary distances. Our internal 1&1 testing runs between datacenters\r\nin the US and Europe. MARS uses very different technology under the\r\nhood, similar to transaction logging of database systems.\r\n\r\nReliability: application and replication are completely decoupled.\r\nNetworking problems (e.g. packet loss, bottlenecks) have no\r\nimpact onto your application at the primary side.\r\n\r\nAnytime Consistency: on a secondary node, its version of the underlying\r\ndisk device is always consistent in itself, but may be outdated\r\n(represent a former state from the primary side). Thanks to\r\nincremental replication of the transaction logfiles, usually the\r\nlag-behind will be only a few seconds, or parts of a second.\r\n\r\nSynchronous or near-synchronous operating modes are planned for\r\nthe future, but are expected to _reliably_ work only over short \r\ndistances (less than 50km), due to fundamental properties\r\nof distributed systems.\r\n\r\nWARNING! Current stage is BETA. Don't put productive data on it!\r\n\r\n## Documentation / Manual\r\n\r\nSee https://github.com/schoebel/mars/blob/master/docu/mars-manual.pdf\r\n\r\n## Concepts\r\n\r\nFor a very short intro, see my LCA2013 presentation docu/MARS_LCA2013.pdf .\r\n\r\nThere is also an internal 2-years old concept paper which is so much outdated,\r\nthat I don't want to publish it. \r\n\r\nThe fundamental construction principle of the planned MARS Full\r\nis called Instance Oriented Programming (IOP) and is described in\r\nthe following paper:\r\n\r\nhttp://athomux.net/papers/paper_inst2.pdf\r\n\r\n## History\r\n\r\nAs you can see in the git log, it evolved from a very experimental\r\nconcept study, starting in the Summer of 2010.\r\nAt this time, I was working on it in my spare time.\r\n\r\nIn Summer 2011, an \"official\" internal 1&1 project started, which aimed\r\nto deliver a proof of concept.\r\n\r\nIn February 2012, a pilot system was rolled out to an internal statistics\r\nserver, which collects statistics data from thousands of other servers,\r\nand thus produces a very heavy random-access write load, formerly\r\nreplicated with DRBD (which led to performance problems due to massive\r\nrandomness). After switching to MARS, the performance was provably\r\nbetter.\r\nThat server was selected because potential loss of statistics data\r\nwould be not be that critical as with other productive data, but\r\nnevertheless it operates on productive data and loads.\r\n\r\nAfter curing some small infancy problems, that server runs until today\r\nwithout problems. It was upgraded to newer versions of MARS several\r\ntimes (indicated by some of the git tags). Our sysadmins switched the\r\nprimary side a few times, without informing me, so I could\r\nsleep better at night without knowing what they did ;)\r\n\r\nIn Summer 2012, the next \"official\" internal 1&1 project started. Its goal\r\nwas to reach enterprise grade, and therefore to rollout MARS Light on\r\n~15 productive servers, starting with less critical systems like ones\r\nfor test webspaces etc.\r\n\r\nIn December 2012 (shortly before Christmas), I got the official permission\r\nfrom our CTO Henning Kettler to publish MARS under GPL on github.\r\n\r\nMany thanks to him!\r\n\r\nBefore that point, I was bound to my working contract which kept internal\r\nsoftware as secret by default (when there was no explicit permission).\r\n\r\nNow there is a chance to build up an opensource\r\ncommunity for MARS, partially outside of 1&1.\r\n\r\nPlease contribute! I will be open.\r\n\r\nI also try to respect the guidelines from Linus, but probably this\r\nwill need more work. I am already planning to invest some time into\r\ncommunity revision of the sourcecode, but there is not yet any schedule.\r\n\r\nIn May 2013, I got help by my new collegue Frank Liepold. He is working\r\non a fully automatic test suite which automates regression tests\r\n(goal: rolling releases). That test suite is based on the internal\r\ntest suite of blkreplay and can be found in the test_suite/ subdirectory.\r\n\r\nIn November 2013, internal 1&1 projects started for mass rollout to several thousands of servers.\r\n\r\nAlthough the software continues to be labelled \"beta\" for the next future, it has reached enterprise grade due to our internal rating process.\r\n\r\n## Future Plans\r\n\r\nSmaller Reworks: in Winter 2013/2014, some smaller changes to the symlink tree are planned, in order to make it more readable for humans and to prepare for future enhancements. They will only change the syntax, not the semantics. There will be an uprade plan, i.e. the old symlink tree remains usable; only newly created clusters will use the new structure.\r\n\r\nIn parallel, the software will be internally divided into three parts:\r\n\r\n1. Generic brick framework\r\n2. AIO personality with XIO bricks\r\n3. MARS Light application\r\n\r\nI hope this will make MARS more attractive for the mainline Linux kernel community.","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file diff --git a/stylesheets/pygment_trac.css b/stylesheets/pygment_trac.css new file mode 100644 index 00000000..e65cedff --- /dev/null +++ b/stylesheets/pygment_trac.css @@ -0,0 +1,70 @@ +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f0f3f3; } +.highlight .c { color: #0099FF; font-style: italic } /* Comment */ +.highlight .err { color: #AA0000; background-color: #FFAAAA } /* Error */ +.highlight .k { color: #006699; font-weight: bold } /* Keyword */ +.highlight .o { color: #555555 } /* Operator */ +.highlight .cm { color: #0099FF; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #009999 } /* Comment.Preproc */ +.highlight .c1 { color: #0099FF; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #0099FF; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { background-color: #FFCCCC; border: 1px solid #CC0000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #003300; font-weight: bold } /* Generic.Heading */ +.highlight .gi { background-color: #CCFFCC; border: 1px solid #00CC00 } /* Generic.Inserted */ +.highlight .go { color: #AAAAAA } /* Generic.Output */ +.highlight .gp { color: #000099; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #003300; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #99CC66 } /* Generic.Traceback */ +.highlight .kc { color: #006699; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #006699; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #006699; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #006699 } /* Keyword.Pseudo */ +.highlight .kr { color: #006699; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #007788; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #FF6600 } /* Literal.Number */ +.highlight .s { color: #CC3300 } /* Literal.String */ +.highlight .na { color: #330099 } /* Name.Attribute */ +.highlight .nb { color: #336666 } /* Name.Builtin */ +.highlight .nc { color: #00AA88; font-weight: bold } /* Name.Class */ +.highlight .no { color: #336600 } /* Name.Constant */ +.highlight .nd { color: #9999FF } /* Name.Decorator */ +.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CC0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #CC00FF } /* Name.Function */ +.highlight .nl { color: #9999FF } /* Name.Label */ +.highlight .nn { color: #00CCFF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #330099; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #003333 } /* Name.Variable */ +.highlight .ow { color: #000000; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #FF6600 } /* Literal.Number.Float */ +.highlight .mh { color: #FF6600 } /* Literal.Number.Hex */ +.highlight .mi { color: #FF6600 } /* Literal.Number.Integer */ +.highlight .mo { color: #FF6600 } /* Literal.Number.Oct */ +.highlight .sb { color: #CC3300 } /* Literal.String.Backtick */ +.highlight .sc { color: #CC3300 } /* Literal.String.Char */ +.highlight .sd { color: #CC3300; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #CC3300 } /* Literal.String.Double */ +.highlight .se { color: #CC3300; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #CC3300 } /* Literal.String.Heredoc */ +.highlight .si { color: #AA0000 } /* Literal.String.Interpol */ +.highlight .sx { color: #CC3300 } /* Literal.String.Other */ +.highlight .sr { color: #33AAAA } /* Literal.String.Regex */ +.highlight .s1 { color: #CC3300 } /* Literal.String.Single */ +.highlight .ss { color: #FFCC33 } /* Literal.String.Symbol */ +.highlight .bp { color: #336666 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #003333 } /* Name.Variable.Class */ +.highlight .vg { color: #003333 } /* Name.Variable.Global */ +.highlight .vi { color: #003333 } /* Name.Variable.Instance */ +.highlight .il { color: #FF6600 } /* Literal.Number.Integer.Long */ + +.type-csharp .highlight .k { color: #0000FF } +.type-csharp .highlight .kt { color: #0000FF } +.type-csharp .highlight .nf { color: #000000; font-weight: normal } +.type-csharp .highlight .nc { color: #2B91AF } +.type-csharp .highlight .nn { color: #000000 } +.type-csharp .highlight .s { color: #A31515 } +.type-csharp .highlight .sc { color: #A31515 } diff --git a/stylesheets/stylesheet.css b/stylesheets/stylesheet.css new file mode 100644 index 00000000..d8dde90f --- /dev/null +++ b/stylesheets/stylesheet.css @@ -0,0 +1,419 @@ +/******************************************************************************* +Slate Theme for GitHub Pages +by Jason Costello, @jsncostello +*******************************************************************************/ + +@import url(pygment_trac.css); + +/******************************************************************************* +MeyerWeb Reset +*******************************************************************************/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; +} + +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + +ol, ul { + list-style: none; +} + +blockquote, q { +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/******************************************************************************* +Theme Styles +*******************************************************************************/ + +body { + box-sizing: border-box; + color:#373737; + background: #212121; + font-size: 16px; + font-family: 'Myriad Pro', Calibri, Helvetica, Arial, sans-serif; + line-height: 1.5; + -webkit-font-smoothing: antialiased; +} + +h1, h2, h3, h4, h5, h6 { + margin: 10px 0; + font-weight: 700; + color:#222222; + font-family: 'Lucida Grande', 'Calibri', Helvetica, Arial, sans-serif; + letter-spacing: -1px; +} + +h1 { + font-size: 36px; + font-weight: 700; +} + +h2 { + padding-bottom: 10px; + font-size: 32px; + background: url('../images/bg_hr.png') repeat-x bottom; +} + +h3 { + font-size: 24px; +} + +h4 { + font-size: 21px; +} + +h5 { + font-size: 18px; +} + +h6 { + font-size: 16px; +} + +p { + margin: 10px 0 15px 0; +} + +footer p { + color: #f2f2f2; +} + +a { + text-decoration: none; + color: #007edf; + text-shadow: none; + + transition: color 0.5s ease; + transition: text-shadow 0.5s ease; + -webkit-transition: color 0.5s ease; + -webkit-transition: text-shadow 0.5s ease; + -moz-transition: color 0.5s ease; + -moz-transition: text-shadow 0.5s ease; + -o-transition: color 0.5s ease; + -o-transition: text-shadow 0.5s ease; + -ms-transition: color 0.5s ease; + -ms-transition: text-shadow 0.5s ease; +} + +a:hover, a:focus {text-decoration: underline;} + +footer a { + color: #F2F2F2; + text-decoration: underline; +} + +em { + font-style: italic; +} + +strong { + font-weight: bold; +} + +img { + position: relative; + margin: 0 auto; + max-width: 739px; + padding: 5px; + margin: 10px 0 10px 0; + border: 1px solid #ebebeb; + + box-shadow: 0 0 5px #ebebeb; + -webkit-box-shadow: 0 0 5px #ebebeb; + -moz-box-shadow: 0 0 5px #ebebeb; + -o-box-shadow: 0 0 5px #ebebeb; + -ms-box-shadow: 0 0 5px #ebebeb; +} + +pre, code { + width: 100%; + color: #222; + background-color: #fff; + + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + font-size: 14px; + + border-radius: 2px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + + + +} + +pre { + width: 100%; + padding: 10px; + box-shadow: 0 0 10px rgba(0,0,0,.1); + overflow: auto; +} + +code { + padding: 3px; + margin: 0 3px; + box-shadow: 0 0 10px rgba(0,0,0,.1); +} + +pre code { + display: block; + box-shadow: none; +} + +blockquote { + color: #666; + margin-bottom: 20px; + padding: 0 0 0 20px; + border-left: 3px solid #bbb; +} + +ul, ol, dl { + margin-bottom: 15px +} + +ul li { + list-style: inside; + padding-left: 20px; +} + +ol li { + list-style: decimal inside; + padding-left: 20px; +} + +dl dt { + font-weight: bold; +} + +dl dd { + padding-left: 20px; + font-style: italic; +} + +dl p { + padding-left: 20px; + font-style: italic; +} + +hr { + height: 1px; + margin-bottom: 5px; + border: none; + background: url('../images/bg_hr.png') repeat-x center; +} + +table { + border: 1px solid #373737; + margin-bottom: 20px; + text-align: left; + } + +th { + font-family: 'Lucida Grande', 'Helvetica Neue', Helvetica, Arial, sans-serif; + padding: 10px; + background: #373737; + color: #fff; + } + +td { + padding: 10px; + border: 1px solid #373737; + } + +form { + background: #f2f2f2; + padding: 20px; +} + +/******************************************************************************* +Full-Width Styles +*******************************************************************************/ + +.outer { + width: 100%; +} + +.inner { + position: relative; + max-width: 640px; + padding: 20px 10px; + margin: 0 auto; +} + +#forkme_banner { + display: block; + position: absolute; + top:0; + right: 10px; + z-index: 10; + padding: 10px 50px 10px 10px; + color: #fff; + background: url('../images/blacktocat.png') #0090ff no-repeat 95% 50%; + font-weight: 700; + box-shadow: 0 0 10px rgba(0,0,0,.5); + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; +} + +#header_wrap { + background: #212121; + background: -moz-linear-gradient(top, #373737, #212121); + background: -webkit-linear-gradient(top, #373737, #212121); + background: -ms-linear-gradient(top, #373737, #212121); + background: -o-linear-gradient(top, #373737, #212121); + background: linear-gradient(top, #373737, #212121); +} + +#header_wrap .inner { + padding: 50px 10px 30px 10px; +} + +#project_title { + margin: 0; + color: #fff; + font-size: 42px; + font-weight: 700; + text-shadow: #111 0px 0px 10px; +} + +#project_tagline { + color: #fff; + font-size: 24px; + font-weight: 300; + background: none; + text-shadow: #111 0px 0px 10px; +} + +#downloads { + position: absolute; + width: 210px; + z-index: 10; + bottom: -40px; + right: 0; + height: 70px; + background: url('../images/icon_download.png') no-repeat 0% 90%; +} + +.zip_download_link { + display: block; + float: right; + width: 90px; + height:70px; + text-indent: -5000px; + overflow: hidden; + background: url(../images/sprite_download.png) no-repeat bottom left; +} + +.tar_download_link { + display: block; + float: right; + width: 90px; + height:70px; + text-indent: -5000px; + overflow: hidden; + background: url(../images/sprite_download.png) no-repeat bottom right; + margin-left: 10px; +} + +.zip_download_link:hover { + background: url(../images/sprite_download.png) no-repeat top left; +} + +.tar_download_link:hover { + background: url(../images/sprite_download.png) no-repeat top right; +} + +#main_content_wrap { + background: #f2f2f2; + border-top: 1px solid #111; + border-bottom: 1px solid #111; +} + +#main_content { + padding-top: 40px; +} + +#footer_wrap { + background: #212121; +} + + + +/******************************************************************************* +Small Device Styles +*******************************************************************************/ + +@media screen and (max-width: 480px) { + body { + font-size:14px; + } + + #downloads { + display: none; + } + + .inner { + min-width: 320px; + max-width: 480px; + } + + #project_title { + font-size: 32px; + } + + h1 { + font-size: 28px; + } + + h2 { + font-size: 24px; + } + + h3 { + font-size: 21px; + } + + h4 { + font-size: 18px; + } + + h5 { + font-size: 14px; + } + + h6 { + font-size: 12px; + } + + code, pre { + min-width: 320px; + max-width: 480px; + font-size: 11px; + } + +}