diff --git a/pages/funding.md b/pages/funding.md new file mode 100644 index 0000000..3a62061 --- /dev/null +++ b/pages/funding.md @@ -0,0 +1,12 @@ +## Funding + +At Robur our focus is on the software we develop. We are passionate about our work and believe in the importance of creating and maintaining secure digital infrastructure. + +We get our funding through three avenues: grants for particular open-source projects, contracts for specific work including development and auditing, and public donations that help allow us to continue the work that isn't otherwise funded. + +We spend most of our funding on salaries, ensuring Robur keeps developing the software we think is important. We do not spend money on fancy parties or first class business trips. Our general breakdown of spending per year is: +- 83% on salaries +- 7% on necessary travel +- 10% on inecitable adminitrative costs + +If you are considering donating to us, hiring us, or giving us a grant you can be assured your money will be well spent on the actual end result of delivering the robust and secure digital infrastructure we strive for. diff --git a/pages/our_work.md b/pages/our_work.md index 4da92a1..a07803b 100644 --- a/pages/our_work.md +++ b/pages/our_work.md @@ -1,6 +1,8 @@ --- title: Our Work description: The Robur Cooperative +synopsis: | + We are a nonprofit open source software cooperative whose mission is to develop robust and secure digital infrastructure. We strive to enable more people to reliably run their own infrastructure by producing correct, surprise-free software to be deployed in real environments. Our software aims to meet the needs of anyone working in an environment where security and dependability is vital. --- {% include "templates/our_work.html" %} diff --git a/src/model.ml b/src/model.ml index f384741..8bcce1c 100644 --- a/src/model.ml +++ b/src/model.ml @@ -60,24 +60,28 @@ end module Our_work = struct type t = - { title : string option - ; description : string option + { title : string + ; description : string + ; synopsis : string ; technologies : string ; services : string } - let make ~technologies ~services page = - { title= Metadata.Page.title page - ; description = Metadata.Page.description page + let make ~technologies ~services (title, description, synopsis )= + { title + ; description + ; synopsis ; technologies ; services } let inject (type a) (module D : Key_value.DESCRIBABLE with type t = a) t = D.[ "active", object_ $ [ "page", string "our_work" ] - ; "page", object_ $ [ "title", string (Option.value ~default:"" t.title) - ; "description", string (Option.value ~default:"" t.description) ] + ; "page", object_ $ [ "title", string t.title + ; "description", string t.description ] + ; "synopsis", string t.synopsis + ; "title", string t.title + ; "description", string t.description ; "technologies", object_ $ [ "body", string t.technologies ] ; "services", object_ $ [ "body", string t.services ] ] - @ (Metadata.Page.inject (module D) (Metadata.Page.make t.title t.description)) end module Person = struct @@ -115,15 +119,17 @@ module About_us = struct ; current_members : (Person.t * string) list ; former_members : (Person.t * string) list ; retreats : string - ; network : string } + ; network : string + ; funding : string } - let make ~retreats ~network ~current_members ~former_members page = + let make ~retreats ~network ~funding ~current_members ~former_members page = { title= Metadata.Page.title page ; description= Metadata.Page.description page ; current_members ; former_members ; retreats - ; network } + ; network + ; funding } let inject (type a) (module D : Key_value.DESCRIBABLE with type t = a) t = D.[ "active", object_ $ [ "page", string "about_us" ] @@ -131,6 +137,7 @@ module About_us = struct ; "description", string (Option.value ~default:"" t.description) ] ; "retreats", object_ $ [ "body", string t.retreats ] ; "network", object_ $ [ "body", string t.network ] + ; "funding", object_ $ [ "body", string t.funding ] ; "team", object_ $ [ "body", string "FIXME" ; "current_members", list (List.map (fun (p, desc) -> object_ (("description", string desc) :: Person.inject (module D) p)) t.current_members) diff --git a/src/model.mli b/src/model.mli index edac50e..2bc32a7 100644 --- a/src/model.mli +++ b/src/model.mli @@ -19,7 +19,7 @@ module Our_work : sig type t val make : technologies:string -> services:string -> - Metadata.Page.t -> t + (string * string * string) -> t include Metadata.INJECTABLE with type t := t end @@ -38,6 +38,7 @@ module About_us : sig val make : retreats:string -> network:string + -> funding:string -> current_members:(Person.t * string) list -> former_members:(Person.t * string) list -> Metadata.Page.t -> t diff --git a/src/task.ml b/src/task.ml index b8510b8..abf288c 100644 --- a/src/task.ml +++ b/src/task.ml @@ -51,6 +51,23 @@ let generate_index target = Model.Index.make ~cooperative ~what_we_do page, content in with_layout (module Model.Index) read_model (index_html target) +module Page' = struct + type t = + { title : string + ; description : string + ; synopsis : string } + + let from_string (module V : Metadata.VALIDABLE) = function + | None -> Validate.error $ Error.Required_metadata [ "Page'" ] + | Some str -> + let open Validate.Monad in + V.from_string str >>= V.object_and @@ fun assoc -> + let* title = V.(required_assoc string) "title" assoc in + let* description = V.(required_assoc string) "description" assoc in + let* synopsis = V.(required_assoc string) "synopsis" assoc in + return { title; description; synopsis; } +end + let generate_about_us target = let open Build in let read_members dir = @@ -67,9 +84,10 @@ let generate_about_us target = &&& former_members &&& (Build.read_file "pages/retreats.md" >>> Markup.to_html) &&& (Build.read_file "pages/network.md" >>> Markup.to_html) + &&& (Build.read_file "pages/funding.md" >>> Markup.to_html) &&& (Metaformat.read_file_with_metadata (module Metadata.Page) "pages/about_us.md") - >>^ fun ((((current_members, former_members), retreats), network), (page, content)) -> - Model.About_us.make ~retreats ~network ~current_members ~former_members page, content in + >>^ fun (((((current_members, former_members), retreats), network), funding), (page, content)) -> + Model.About_us.make ~retreats ~network ~funding ~current_members ~former_members page, content in with_layout (module Model.About_us) read_model (about_us_html target) let generate_our_work target = @@ -77,7 +95,8 @@ let generate_our_work target = let read_model = (Build.read_file "pages/technologies.md" >>> Markup.to_html) &&& (Build.read_file "pages/services.md" >>> Markup.to_html) - &&& (Metaformat.read_file_with_metadata (module Metadata.Page) "pages/our_work.md") + &&& (Metaformat.read_file_with_metadata (module Page') "pages/our_work.md") >>^ fun ((technologies, services), (page, content)) -> - Model.Our_work.make ~technologies ~services page, content in + Model.Our_work.make ~technologies ~services + Page'.(page.title, page.description, page.synopsis), content in with_layout (module Model.Our_work) read_model (our_work_html target) diff --git a/templates/about_us.html b/templates/about_us.html index ccd9484..c70ccea 100644 --- a/templates/about_us.html +++ b/templates/about_us.html @@ -22,39 +22,39 @@
{{ member.name }}
+{{ member.name }}
{%- autoescape false -%} {{ member.description }} {% endautoescape -%}{{ member.name }}
{%- autoescape false -%} {{ member.description }} {% endautoescape -%}