{"id":13630271,"url":"https://github.com/josephspurrier/gowebapp","last_synced_at":"2026-01-22T06:28:04.248Z","repository":{"id":49403403,"uuid":"38215254","full_name":"josephspurrier/gowebapp","owner":"josephspurrier","description":"Basic MVC Web Application in Go","archived":false,"fork":false,"pushed_at":"2021-05-23T12:15:32.000Z","size":417,"stargazers_count":1151,"open_issues_count":2,"forks_count":196,"subscribers_count":53,"default_branch":"master","last_synced_at":"2025-04-18T02:44:13.535Z","etag":null,"topics":["go","golang","web-application"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/josephspurrier.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-06-28T21:39:48.000Z","updated_at":"2025-04-01T10:46:02.000Z","dependencies_parsed_at":"2022-09-14T08:00:54.027Z","dependency_job_id":null,"html_url":"https://github.com/josephspurrier/gowebapp","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/josephspurrier/gowebapp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josephspurrier%2Fgowebapp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josephspurrier%2Fgowebapp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josephspurrier%2Fgowebapp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josephspurrier%2Fgowebapp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/josephspurrier","download_url":"https://codeload.github.com/josephspurrier/gowebapp/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josephspurrier%2Fgowebapp/sbom","scorecard":{"id":533610,"data":{"date":"2025-08-11","repo":{"name":"github.com/josephspurrier/gowebapp","commit":"1f05cb0701a71bc4185817e73bca0e8c43408a39"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":0,"reason":"Found 1/28 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 3 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T06:20:50.220Z","repository_id":49403403,"created_at":"2025-08-20T06:20:50.221Z","updated_at":"2025-08-20T06:20:50.221Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28656841,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"online","status_checked_at":"2026-01-22T02:00:07.137Z","response_time":144,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","golang","web-application"],"created_at":"2024-08-01T22:01:36.676Z","updated_at":"2026-01-22T06:28:04.233Z","avatar_url":"https://github.com/josephspurrier.png","language":"Go","funding_links":[],"categories":["Go","Repositories"],"sub_categories":[],"readme":"# GoWebApp\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/josephspurrier/gowebapp)](https://goreportcard.com/report/github.com/josephspurrier/gowebapp)\n[![GoDoc](https://godoc.org/github.com/josephspurrier/gowebapp?status.svg)](https://godoc.org/github.com/josephspurrier/gowebapp) \n\nBasic MVC Web Application in Go\n\n#### I recommend you use Blue Jay which is the latest version of this project: [https://github.com/blue-jay/blueprint](https://github.com/blue-jay/blueprint).\n\nThis project demonstrates how to structure and build a website using the Go language without a framework. There is a blog article you can read at [http://www.josephspurrier.com/go-web-app-example/](http://www.josephspurrier.com/go-web-app-example/). There is a full application I built with an earlier version of the project at [https://github.com/verifiedninja/webapp](https://github.com/verifiedninja/webapp). There is an API version of this project at [https://github.com/josephspurrier/gowebapi](https://github.com/josephspurrier/gowebapi).\n\nTo download, run the following command:\n\n~~~\ngo get github.com/josephspurrier/gowebapp\n~~~\n\nIf you are on Go 1.5, you need to set GOVENDOREXPERIMENT to 1. If you are on Go 1.4 or earlier, the code will not work because it uses the vendor folder.\n\n### Other Branches\n\n- 2021-02-17: There is a branch using Go modules (requires Go 1.13) available here: https://github.com/josephspurrier/gowebapp/tree/modules.\n- 2021-05-23: There is a branch using Go embedded assets (requires Go 1.16) available here: https://github.com/josephspurrier/gowebapp/tree/embedded-templates.\n\n## Quick Start with Bolt\n\nThe gowebapp.db file will be created once you start the application.\n\nBuild and run from the root directory. Open your web browser to: http://localhost. You should see the welcome page.\n\nNavigate to the login page, and then to the register page. Create a new user and you should be able to login. That's it.\n\n## Quick Start with MongoDB\n\nStart MongoDB.\n\nOpen config/config.json and edit the Database section so the connection information matches your MongoDB instance. Also, change Type from Bolt to MongoDB.\n\nBuild and run from the root directory. Open your web browser to: http://localhost. You should see the welcome page.\n\nNavigate to the login page, and then to the register page. Create a new user and you should be able to login. That's it.\n\n## Quick Start with MySQL\n\nStart MySQL and import config/mysql.sql to create the database and tables.\n\nOpen config/config.json and edit the Database section so the connection information matches your MySQL instance. Also, change Type from Bolt to MySQL.\n\nBuild and run from the root directory. Open your web browser to: http://localhost. You should see the welcome page.\n\nNavigate to the login page, and then to the register page. Create a new user and you should be able to login. That's it.\n\n## Overview\n\nThe web app has a public home page, authenticated home page, login page, register page,\nabout page, and a simple notepad to demonstrate the CRUD operations.\n\nThe entrypoint for the web app is gowebapp.go. The file loads the application settings, \nstarts the session, connects to the database, sets up the templates, loads \nthe routes, attaches the middleware, and starts the web server.\n\nThe front end is built using Bootstrap with a few small changes to fonts and spacing. The flash \nmessages are customized so they show up at the bottom right of the screen.\n\nAll of the error and warning messages should be either displayed either to the \nuser or in the console. Informational messages are displayed to the user via \nflash messages that disappear after 4 seconds. The flash messages are controlled \nby JavaScript in the static folder.\n\n## Structure\n\nRecently, the folder structure changed. After looking at all the forks \nand reusing my project in different places, I decided to move the Go code to the \n**app** folder inside the **vendor** folder so the github path is not littered \nthroughout the many imports. I did not want to use relative paths so the vendor\nfolder seemed like the best option.\n\nThe project is organized into the following folders:\n\n~~~\nconfig\t\t- application settings and database schema\nstatic\t\t- location of statically served files like CSS and JS\ntemplate\t- HTML templates\n\nvendor/app/controller\t- page logic organized by HTTP methods (GET, POST)\nvendor/app/shared\t\t- packages for templates, MySQL, cryptography, sessions, and json\nvendor/app/model\t\t- database queries\nvendor/app/route\t\t- route information and middleware\n~~~\n\nThere are a few external packages:\n\n~~~\ngithub.com/gorilla/context\t\t\t\t- registry for global request variables\ngithub.com/gorilla/sessions\t\t\t\t- cookie and filesystem sessions\ngithub.com/go-sql-driver/mysql \t\t\t- MySQL driver\ngithub.com/haisum/recaptcha\t\t\t\t- Google reCAPTCHA support\ngithub.com/jmoiron/sqlx \t\t\t\t- MySQL general purpose extensions\ngithub.com/josephspurrier/csrfbanana \t- CSRF protection for gorilla sessions\ngithub.com/julienschmidt/httprouter \t- high performance HTTP request router\ngithub.com/justinas/alice\t\t\t\t- middleware chaining\ngithub.com/mattn/go-sqlite3\t\t\t\t- SQLite driver\ngolang.org/x/crypto/bcrypt \t\t\t\t- password hashing algorithm\n~~~\n\nThe templates are organized into folders under the **template** folder:\n\n~~~\nabout/about.tmpl       - quick info about the app\nindex/anon.tmpl\t       - public home page\nindex/auth.tmpl\t       - home page once you login\nlogin/login.tmpl\t   - login page\nnotepad/create.tmpl    - create note\nnotepad/read.tmpl      - read a note\nnotepad/update.tmpl    - update a note\npartial/footer.tmpl\t   - footer\npartial/menu.tmpl\t   - menu at the top of all the pages\nregister/register.tmpl - register page\nbase.tmpl\t\t       - base template for all the pages\n~~~\n\n## Templates\n\nThere are a few template funcs that are available to make working with the templates \nand static files easier:\n\n~~~ html\n\u003c!-- CSS files with timestamps --\u003e\n{{CSS \"static/css/normalize3.0.0.min.css\"}}\nparses to\n\u003clink rel=\"stylesheet\" type=\"text/css\" href=\"/static/css/normalize3.0.0.min.css?1435528339\" /\u003e\n\n\u003c!-- JS files with timestamps --\u003e\n{{JS \"static/js/jquery1.11.0.min.js\"}}\nparses to\n\u003cscript type=\"text/javascript\" src=\"/static/js/jquery1.11.0.min.js?1435528404\"\u003e\u003c/script\u003e\n\n\u003c!-- Hyperlinks --\u003e\n{{LINK \"register\" \"Create a new account.\"}}\nparses to\n\u003ca href=\"/register\"\u003eCreate a new account.\u003c/a\u003e\n\n\u003c!-- Output an unescaped variable (not a safe idea, but I find it useful when troubleshooting) --\u003e\n{{.SomeVariable | NOESCAPE}}\n\n\u003c!-- Time format --\u003e\n{{.SomeTime | PRETTYTIME}}\nparses to format\n3:04 PM 01/02/2006\n~~~\n\nThere are a few variables you can use in templates as well:\n\n~~~ html\n\u003c!-- Use AuthLevel=auth to determine if a user is logged in (if session.Values[\"id\"] != nil) --\u003e\n{{if eq .AuthLevel \"auth\"}}\nYou are logged in.\n{{else}}\nYou are not logged in.\n{{end}}\n\n\u003c!-- Use BaseURI to print the base URL of the web app --\u003e\n\u003cli\u003e\u003ca href=\"{{.BaseURI}}about\"\u003eAbout\u003c/a\u003e\u003c/li\u003e\n\n\u003c!-- Use token to output the CSRF token in a form --\u003e\n\u003cinput type=\"hidden\" name=\"token\" value=\"{{.token}}\"\u003e\n~~~\n\nIt's also easy to add template-specific code before the closing \u003c/head\u003e and \u003c/body\u003e tags:\n\n~~~ html\n\u003c!-- Code is added before the closing \u003c/head\u003e tag --\u003e\n{{define \"head\"}}\u003cmeta name=\"robots\" content=\"noindex\"\u003e{{end}}\n\n...\n\n\u003c!-- Code is added before the closing \u003c/body\u003e tag --\u003e\n{{define \"foot\"}}{{JS \"//www.google.com/recaptcha/api.js\"}}{{end}}\n~~~\n\n## JavaScript\n\nYou can trigger a flash notification using JavaScript.\n\n~~~ javascript\nflashError(\"You must type in a username.\");\n\nflashSuccess(\"Record created!\");\n\nflashNotice(\"There seems to be a piece missing.\");\n\nflashWarning(\"Something does not seem right...\");\n~~~\n\n## Controllers\n\nThe controller files all share the same package name. This cuts down on the \nnumber of packages when you are mapping the routes. It also forces you to use\na good naming convention for each of the funcs so you know where each of the \nfuncs are located and what type of HTTP request they each are mapped to.\n\n### These are a few things you can do with controllers.\n\nAccess a gorilla session:\n\n~~~ go\n// Get the current session\nsess := session.Instance(r)\n...\n// Close the session after you are finished making changes\nsess.Save(r, w)\n~~~\n\nTrigger 1 of 4 different types of flash messages on the next page load (no other code needed):\n\n~~~ go\nsess.AddFlash(view.Flash{\"Sorry, no brute force :-)\", view.FlashNotice})\nsess.Save(r, w) // Ensure you save the session after making a change to it\n~~~\n\nValidate form fields are not empty:\n\n~~~ go\n// Ensure a user submitted all the required form fields\nif validate, missingField := view.Validate(r, []string{\"email\", \"password\"}); !validate {\n\tsess.AddFlash(view.Flash{\"Field missing: \" + missingField, view.FlashError})\n\tsess.Save(r, w)\n\tLoginGET(w, r)\n\treturn\n}\n~~~\n\nRender a template:\n\n~~~ go\n// Create a new view\nv := view.New(r)\n\n// Set the template name\nv.Name = \"login/login\"\n\n// Assign a variable that is accessible in the form\nv.Vars[\"token\"] = csrfbanana.Token(w, r, sess)\n\n// Refill any form fields from a POST operation\nview.Repopulate([]string{\"email\"}, r.Form, v.Vars)\n\n// Render the template\nv.Render(w)\n~~~\n\nReturn the flash messages during an Ajax request:\n\n~~~ go\n// Get session\nsess := session.Instance(r)\n\n// Set the flash message\nsess.AddFlash(view.Flash{\"An error occurred on the server. Please try again later.\", view.FlashError})\nsess.Save(r, w)\n\n// Display the flash messages as JSON\nv := view.New(r)\nv.SendFlashes(w)\n~~~\n\nHandle the database query:\n\n~~~ go\n// Get database result\nresult, err := model.UserByEmail(email)\n\nif err == sql.ErrNoRows {\n\t// User does not exist\n} else if err != nil {\n\t// Display error message\n} else if passhash.MatchString(result.Password, password) {\n\t// Password matches!\t\n} else {\n\t// Password does not match\n}\n~~~\n\nSend an email:\n\n~~~ go\n// Email a user\nerr := email.SendEmail(email.ReadConfig().From, \"This is the subject\", \"This is the body!\")\nif err != nil {\n\tlog.Println(err)\n\tsess.AddFlash(view.Flash{\"An error occurred on the server. Please try again later.\", view.FlashError})\n\tsess.Save(r, w)\n\treturn\n}\n~~~\n\nValidate a form if the Google reCAPTCHA is enabled in the config:\n\n~~~ go\n// Validate with Google reCAPTCHA\nif !recaptcha.Verified(r) {\n\tsess.AddFlash(view.Flash{\"reCAPTCHA invalid!\", view.FlashError})\n\tsess.Save(r, w)\n\tRegisterGET(w, r)\n\treturn\n}\n~~~\n\n## Database\n\nIt's a good idea to abstract the database layer out so if you need to make \nchanges, you don't have to look through business logic to find the queries. All\nthe queries are stored in the models folder.\n\nThis project supports BoltDB, MongoDB, and MySQL. All the queries are stored in\nthe same files so you can easily change the database without modifying anything\nbut the config file.\n\nThe user.go and note.go files are at the root of the model directory and are a\ncompliation of all the queries for each database type. There are a few hacks in\nthe models to get the structs to work with all the supported databases.\n\nConnect to the database (only once needed in your application):\n\n~~~ go\n// Connect to database\ndatabase.Connect(config.Database)\n~~~\n\nRead from the database:\n\n~~~ go\nresult := User{}\nerr := database.DB.Get(\u0026result, \"SELECT id, password, status_id, first_name FROM user WHERE email = ? LIMIT 1\", email)\nreturn result, err\n~~~\n\nWrite to the database:\n\n~~~ go\n_, err := database.DB.Exec(\"INSERT INTO user (first_name, last_name, email, password) VALUES (?,?,?,?)\", firstName, lastName, email, password)\nreturn err\n~~~\n\n## Middleware\n\nThere are a few pieces of middleware included. The package called csrfbanana \nprotects against Cross-Site Request Forgery attacks and prevents double submits. \nThe package httprouterwrapper provides helper functions to make funcs compatible \nwith httprouter. The package logrequest will log every request made against the \nwebsite to the console. The package pprofhandler enables pprof so it will work \nwith httprouter. In route.go, all the individual routes use alice to make \nchaining very easy.\n\n## Configuration\n\nTo make the web app a little more flexible, you can make changes to different \ncomponents in one place through the config.json file. If you want to add any \nof your own settings, you can add them to config.json and update the structs\nin gowebapp.go and the individual files so you can reference them in your code. \nThis is config.json:\n\n~~~ json\n{\n\t\"Database\": {\n\t\t\"Type\": \"Bolt\",\n\t\t\"Bolt\": {\t\t\n \t\t\t\"Path\": \"gowebapp.db\"\n  \t\t},\n\t\t\"MongoDB\": {\n\t\t\t\"URL\": \"127.0.0.1\",\n\t\t\t\"Database\": \"gowebapp\"\n\t\t},\n\t\t\"MySQL\": {\n\t\t\t\"Username\": \"root\",\n\t\t\t\"Password\": \"\",\n\t\t\t\"Name\": \"gowebapp\",\n\t\t\t\"Hostname\": \"127.0.0.1\",\n\t\t\t\"Port\": 3306,\n\t\t\t\"Parameter\": \"?parseTime=true\"\n\t\t}\n\t},\n\t\"Email\": {\n\t\t\"Username\": \"\",\n\t\t\"Password\": \"\",\n\t\t\"Hostname\": \"\",\n\t\t\"Port\": 25,\n\t\t\"From\": \"\"\n\t},\n\t\"Recaptcha\": {\n\t\t\"Enabled\": false,\n\t\t\"Secret\": \"\",\n\t\t\"SiteKey\": \"\"\n\t},\n\t\"Server\": {\n\t\t\"Hostname\": \"\",\n\t\t\"UseHTTP\": true,\n\t\t\"UseHTTPS\": false,\n\t\t\"HTTPPort\": 80,\n\t\t\"HTTPSPort\": 443,\n\t\t\"CertFile\": \"tls/server.crt\",\n\t\t\"KeyFile\": \"tls/server.key\"\n\t},\n\t\"Session\": {\n\t\t\"SecretKey\": \"@r4B?EThaSEh_drudR7P_hub=s#s2Pah\",\n\t\t\"Name\": \"gosess\",\n\t\t\"Options\": {\n\t\t\t\"Path\": \"/\",\n\t\t\t\"Domain\": \"\",\n\t\t\t\"MaxAge\": 28800,\n\t\t\t\"Secure\": false,\n\t\t\t\"HttpOnly\": true\n\t\t}\n\t},\n\t\"Template\": {\n\t\t\"Root\": \"base\",\n\t\t\"Children\": [\n\t\t\t\"partial/menu\",\n\t\t\t\"partial/footer\"\n\t\t]\n\t},\n\t\"View\": {\n\t\t\"BaseURI\": \"/\",\n\t\t\"Extension\": \"tmpl\",\n\t\t\"Folder\": \"template\",\n\t\t\"Name\": \"blank\",\n\t\t\"Caching\": true\n\t}\n}\n~~~\n\nTo enable HTTPS, set UseHTTPS to true, create a folder called tls in the root, \nand then place the certificate and key files in that folder.\n\n## Screenshots\n\nPublic Home:\n\n![Image of Public Home](https://cloud.githubusercontent.com/assets/2394539/11319464/e2cd0eac-9045-11e5-9b24-5e480240cd69.jpg)\n\nAbout:\n\n![Image of About](https://cloud.githubusercontent.com/assets/2394539/11319462/e2c4d2d2-9045-11e5-805f-8b40598c92c3.jpg)\n\nRegister:\n\n![Image of Register](https://cloud.githubusercontent.com/assets/2394539/11319466/e2d03500-9045-11e5-9c8e-c28fe663ed0f.jpg)\n\nLogin:\n\n![Image of Login](https://cloud.githubusercontent.com/assets/2394539/11319463/e2cd1a00-9045-11e5-8b8e-68030d870cbe.jpg)\n\nAuthenticated Home:\n\n![Image of Auth Home](https://cloud.githubusercontent.com/assets/2394539/14809208/75f340d2-0b59-11e6-8d2a-cd26ee872281.PNG)\n\nView Notes:\n\n![Image of Notepad View](https://cloud.githubusercontent.com/assets/2394539/14809205/75f08432-0b59-11e6-8737-84ee796bd82e.PNG)\n\nAdd Note:\n\n![Image of Notepad Add](https://cloud.githubusercontent.com/assets/2394539/14809207/75f338f8-0b59-11e6-9719-61355957996c.PNG)\n\nEdit Note:\n\n![Image of Notepad Edit](https://cloud.githubusercontent.com/assets/2394539/14809206/75f33970-0b59-11e6-8acf-b3d533477aac.PNG)\n\n## Feedback\n\nAll feedback is welcome. Let me know if you have any suggestions, questions, or criticisms. \nIf something is not idiomatic to Go, please let me know know so we can make it better.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosephspurrier%2Fgowebapp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjosephspurrier%2Fgowebapp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosephspurrier%2Fgowebapp/lists"}