{"id":17026577,"url":"https://github.com/jamiefdhurst/journal","last_synced_at":"2026-05-01T13:02:09.565Z","repository":{"id":57522504,"uuid":"53569218","full_name":"jamiefdhurst/journal","owner":"jamiefdhurst","description":"A simple blog available as an API, written in Go with accompanying tests and documentation. Can be used as a useful starting point for Go web projects.","archived":false,"fork":false,"pushed_at":"2026-04-29T12:21:18.000Z","size":817,"stargazers_count":4,"open_issues_count":4,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-29T13:35:43.962Z","etag":null,"topics":["golang","rest-api","sqlite","unit-testing"],"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/jamiefdhurst.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-03-10T08:47:37.000Z","updated_at":"2026-04-29T12:14:37.000Z","dependencies_parsed_at":"2022-09-26T18:01:51.473Z","dependency_job_id":"52612c59-f748-452e-be5e-4beb8fdd3700","html_url":"https://github.com/jamiefdhurst/journal","commit_stats":null,"previous_names":[],"tags_count":43,"template":false,"template_full_name":null,"purl":"pkg:github/jamiefdhurst/journal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamiefdhurst%2Fjournal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamiefdhurst%2Fjournal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamiefdhurst%2Fjournal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamiefdhurst%2Fjournal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jamiefdhurst","download_url":"https://codeload.github.com/jamiefdhurst/journal/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamiefdhurst%2Fjournal/sbom","scorecard":{"id":504560,"data":{"date":"2025-08-11","repo":{"name":"github.com/jamiefdhurst/journal","commit":"3c68a13b8b7cd64865c885487937093f0d24dcce"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.2,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: topLevel 'contents' permission set to 'write': .github/workflows/build.yml:18","Warn: no topLevel permission defined: .github/workflows/deploy.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/test.yml:11","Info: topLevel 'issues' permission set to 'read': .github/workflows/test.yml:12","Warn: topLevel 'checks' permission set to 'write': .github/workflows/test.yml:13","Info: no jobLevel write permissions found"],"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":"Code-Review","score":0,"reason":"Found 0/21 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":"Maintained","score":1,"reason":"0 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"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":"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":"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":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/build.yml:21"],"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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:63: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:83: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:95: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/deploy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/deploy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/deploy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/deploy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/deploy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:76: update your workflow using https://app.stepsecurity.io/secureworkflow/jamiefdhurst/journal/test.yml/main?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating golang:1.22-bookworm to golang:1.22-bookworm@sha256:3d699e4d15d0f8f13c9195c0632a16702b8cbdece2955af1c23b37ae5d55a253","Warn: containerImage not pinned by hash: Dockerfile:11: pin your Docker image by updating debian:bookworm to debian:bookworm@sha256:731dd1380d6a8d170a695dbeb17fe0eade0e1c29f654cf0a3a07f372191c3f4b","Warn: containerImage not pinned by hash: Dockerfile.test:1: pin your Docker image by updating golang:1.22-bookworm to golang:1.22-bookworm@sha256:3d699e4d15d0f8f13c9195c0632a16702b8cbdece2955af1c23b37ae5d55a253","Warn: goCommand not pinned by hash: Dockerfile.test:13-19","Warn: goCommand not pinned by hash: Dockerfile.test:13-19","Warn: goCommand not pinned by hash: Dockerfile.test:13-19","Warn: goCommand not pinned by hash: .github/workflows/test.yml:40","Warn: goCommand not pinned by hash: .github/workflows/test.yml:41","Warn: goCommand not pinned by hash: .github/workflows/test.yml:42","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of  18 third-party GitHubAction dependencies pinned","Info:   0 out of   3 containerImage dependencies pinned","Info:   0 out of   6 goCommand dependencies pinned"],"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":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.9.6 not signed: https://api.github.com/repos/jamiefdhurst/journal/releases/173030224","Warn: release artifact v0.9.5 not signed: https://api.github.com/repos/jamiefdhurst/journal/releases/173029818","Warn: release artifact v0.9.4 not signed: https://api.github.com/repos/jamiefdhurst/journal/releases/172425137","Warn: release artifact v0.9.3 not signed: https://api.github.com/repos/jamiefdhurst/journal/releases/156576999","Warn: release artifact v0.9.2 not signed: https://api.github.com/repos/jamiefdhurst/journal/releases/155773105","Warn: release artifact v0.9.6 does not have provenance: https://api.github.com/repos/jamiefdhurst/journal/releases/173030224","Warn: release artifact v0.9.5 does not have provenance: https://api.github.com/repos/jamiefdhurst/journal/releases/173029818","Warn: release artifact v0.9.4 does not have provenance: https://api.github.com/repos/jamiefdhurst/journal/releases/172425137","Warn: release artifact v0.9.3 does not have provenance: https://api.github.com/repos/jamiefdhurst/journal/releases/156576999","Warn: release artifact v0.9.2 does not have provenance: https://api.github.com/repos/jamiefdhurst/journal/releases/155773105"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 11 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"}},{"name":"Vulnerabilities","score":2,"reason":"8 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-4gmj-3p3h-gm8h","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T22:57:45.774Z","repository_id":57522504,"created_at":"2025-08-19T22:57:45.774Z","updated_at":"2025-08-19T22:57:45.774Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32497815,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"online","status_checked_at":"2026-05-01T02:00:05.856Z","response_time":64,"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":["golang","rest-api","sqlite","unit-testing"],"created_at":"2024-10-14T07:33:35.966Z","updated_at":"2026-05-01T13:02:09.559Z","avatar_url":"https://github.com/jamiefdhurst.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Journal\n\n![License](https://img.shields.io/github/license/jamiefdhurst/journal.svg)\n[![Build](https://github.com/jamiefdhurst/journal/actions/workflows/build.yml/badge.svg)](https://github.com/jamiefdhurst/journal/actions/workflows/build.yml)\n[![Latest Version](https://img.shields.io/github/release/jamiefdhurst/journal.svg)](https://github.com/jamiefdhurst/journal/releases)\n\nA simple web-based journal written in Go. You can post, edit and view entries,\nwith the addition of an API.\n\nIt makes use of a SQLite database to store the journal entries.\n\n[API Documentation](api/README.md) - also available via `openapi.yml` as a URL\nwhen deployed.\n\n[Installation Guide](docs/installation.md) - full installation guide covering\nall methods, configuration reference, and reverse proxy setup.\n\n[User Guide](docs/user-guide.md) - creating and editing entries, and\nnavigating the journal.\n\n![Screenshot of Journal](/docs/screenshot.png)\n\n## Purpose\n\nJournal serves as an easy-to-read and simple Golang program for new developers \nto try their hand at modifying, extending and playing with. It deliberately has \nonly one dependency to ensure that the full end-to-end flow of the system can \nbe understood through standard Golang libraries.\n\nIt's also a nice little Journal that you can use to keep your thoughts in, or \nas a basic blog platform.\n\n## Installation\n\nSee the [Installation Guide](docs/installation.md) for full details, including\nconfiguration, running as a service, and setting up a reverse proxy.\n\n### Homebrew (macOS)\n\n```bash\nbrew tap jamiefdhurst/journal\nbrew install journal\n```\n\n### Docker / Container Runtime\n\n```bash\ndocker run -d \\\n  --name journal \\\n  -p 3000:3000 \\\n  -v /var/lib/journal:/go/data \\\n  jamiefdhurst/journal:latest\n```\n\nImages are also published to the GitHub Container Registry as\n`ghcr.io/jamiefdhurst/journal:latest`.\n\n### Debian / Ubuntu (apt)\n\n```bash\ncurl -fsSL https://jamiefdhurst.github.io/packages/journal.asc \\\n  | sudo tee /usr/share/keyrings/journal.asc \u003e /dev/null\n\necho \"deb [signed-by=/usr/share/keyrings/journal.asc] \\\n  https://jamiefdhurst.github.io/packages stable main\" \\\n  | sudo tee /etc/apt/sources.list.d/journal.list\n\nsudo apt update \u0026\u0026 sudo apt install journal\n```\n\n### CentOS / RHEL / Fedora (yum/dnf)\n\n```bash\nsudo tee /etc/yum.repos.d/journal.repo \u003e /dev/null \u003c\u003c'EOF'\n[journal]\nname=Journal\nbaseurl=https://jamiefdhurst.github.io/packages/yum\nenabled=1\ngpgcheck=1\ngpgkey=https://jamiefdhurst.github.io/packages/journal.asc\nEOF\n\nsudo yum install journal\n```\n\n### ZIP archive (all platforms)\n\nPre-built archives for Linux and macOS (amd64 and arm64) are attached to every\n[GitHub release](https://github.com/jamiefdhurst/journal/releases). Download\nthe archive for your platform, extract it, and run the `journal` binary inside.\n\n### Build from source\n\n```bash\ngit clone https://github.com/jamiefdhurst/journal.git\ncd journal\ngo mod download\ngo build -o journal ./cmd/journal\n./journal\n```\n\n## Configuration through Environment Variables\n\nThe application uses environment variables to configure all aspects.\n\nYou can optionally supply these through a `.env` file that will be parsed before\nany additional environment variables.\n\n### General Configuration\n\n* `J_CREATE` - Set to `0` to disable post creation\n* `J_WEB_PATH` - Override the directory used to locate web assets (templates, static files, themes). Defaults to the directory containing the binary, or the current working directory.\n* `J_DB_PATH` - Path to SQLite DB - default is `./data/journal.db`\n* `J_DESCRIPTION` - Set the HTML description of the Journal\n* `J_EDIT` - Set to `0` to disable post modification\n* `J_EXCERPT_WORDS` - The length of the post shown as a preview/excerpt in the index, default `50`\n* `J_GA_CODE` - Google Analytics tag value, starts with `UA-`, or ignore to disable Google Analytics\n* `J_PORT` - Port to expose over HTTP, default is `3000`\n* `J_POSTS_PER_PAGE` - Posts to display per page, default `20`\n* `J_THEME` - Theme to use from within the _web/themes_ folder, defaults to `default`\n* `J_TITLE` - Set the title of the Journal\n\n### SSL/TLS Configuration\n\n* `J_SSL_CERT` - Path to SSL certificate file for HTTPS (enables SSL when set)\n* `J_SSL_KEY` - Path to SSL private key file for HTTPS\n\n### Session and Cookie Security\n\n* `J_SESSION_KEY` - 32-byte encryption key for session data (AES-256). Must be exactly 32 printable ASCII characters. If not set, a random key is generated on startup (sessions won't persist across restarts).\n* `J_SESSION_NAME` - Cookie name for sessions, default `journal-session`\n* `J_COOKIE_DOMAIN` - Domain restriction for cookies, default is current domain only\n* `J_COOKIE_MAX_AGE` - Cookie expiry time in seconds, default `2592000` (30 days)\n* `J_COOKIE_HTTPONLY` - Set to `0` or `false` to allow JavaScript access to cookies (not recommended). Default is `true` for XSS protection.\n\n**Note:** When `J_SSL_CERT` is configured, session cookies automatically use the `Secure` flag to prevent transmission over unencrypted connections.\n\n## Layout\n\nThe project layout follows the standard set out in the following document:\n[https://github.com/golang-standards/project-layout](https://github.com/golang-standards/project-layout)\n\n* `/api` - API documentation\n* `/internal/app/controller` - Controllers for the main application\n* `/internal/app/model` - Models for the main application\n* `/internal/app/router` - Implementation of router for given app\n* `/pkg/adapter` - Adapters for connecting to external services\n* `/pkg/controller` - Controller logic\n* `/pkg/database` - Database connection logic\n* `/pkg/router` - Router for handling services\n* `/test` - API tests\n* `/test/data` - Test data\n* `/test/mocks` - Mock files for testing\n* `/web/static` - Compiled static public assets\n* `/web/templates` - View templates\n* `/web/themes` - Front-end themes, a default theme is included\n\n## Development\n\n### Back-end\n\nThe back-end can be extended and modified following the folder structure above. \nTests for each file live alongside and are designed to be easy to read and as \nfunctionally complete as possible.\n\nThe easiest way to develop incrementally is to use a local go installation and\nrun your Journal as follows:\n\n```bash\ngo run ./cmd/journal\n```\n\nNaturally, any changes to the logic or functionality will require a restart of \nthe binary itself.\n\n#### Dependencies\n\nThe application has the following dependencies (using go.mod and go.sum):\n\n- [github.com/ncruces/go-sqlite3](https://github.com/ncruces/go-sqlite3)\n- [github.com/gomarkdown/markdown](https://github.com/gomarkdown/markdown)\n\nThis can be installed using the following commands from the journal folder:\n\n```bash\ngo get -v ./...\n```\n\n#### Templates\n\nThe templates are in `html/template` format in _web/templates_ and are used \nwithin each of the controllers. These can be modified while the binary stays \nloaded, as they are loaded on the fly by the application as it runs and serves \ncontent.\n\n### Front-end\n\nThe front-end source files are intended to be divided into themes within the\n_web/themes_ folder. Each theme can include icons and a CSS stylesheet.\n\nA simple, basic and minimalist \"default\" theme is included, but any other \nthemes can be built and modified.\n\n### Building/Testing\n\nAll pushed code is currently built using GitHub Actions to test PRs, build \npackages and create releases.\n\nTo test locally, simply use:\n\n```bash\ngo test -v ./...\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamiefdhurst%2Fjournal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjamiefdhurst%2Fjournal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamiefdhurst%2Fjournal/lists"}