{"id":38964647,"url":"https://github.com/beranradek/artbeams","last_synced_at":"2026-01-17T16:28:16.736Z","repository":{"id":149841365,"uuid":"354546253","full_name":"beranradek/artbeams","owner":"beranradek","description":"Open source CMS for JVM. Simple, functional.","archived":false,"fork":false,"pushed_at":"2026-01-02T18:20:52.000Z","size":6089,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-05T05:35:53.669Z","etag":null,"topics":["cms","jvm-applications"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/beranradek.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":null,"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":"2021-04-04T13:08:54.000Z","updated_at":"2026-01-02T18:20:56.000Z","dependencies_parsed_at":"2023-12-23T22:05:21.752Z","dependency_job_id":"85b3d622-486c-4aa0-8ad6-62affa959fb8","html_url":"https://github.com/beranradek/artbeams","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/beranradek/artbeams","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beranradek%2Fartbeams","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beranradek%2Fartbeams/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beranradek%2Fartbeams/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beranradek%2Fartbeams/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/beranradek","download_url":"https://codeload.github.com/beranradek/artbeams/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beranradek%2Fartbeams/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28511864,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T13:38:16.342Z","status":"ssl_error","status_checked_at":"2026-01-17T13:37:44.060Z","response_time":85,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["cms","jvm-applications"],"created_at":"2026-01-17T16:28:16.625Z","updated_at":"2026-01-17T16:28:16.712Z","avatar_url":"https://github.com/beranradek.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ArtBeams\n\n**Open source CMS** for blogs with admin interface. Simple, functional.\n\nBuilt with Spring Boot framework, Kotlin language, JOOQ (and PostgreSQL) for persistence layer, \nSpring Security, Spring MVC for handling requests, Apache FreeMarker and Bootstrap templates, Formio form definition, binding and validation library (https://github.com/beranradek/formio), \nGoogle APIs for integration with Google Docs, Browscap for browser detection,\nHttpClient and Jackson for integration with JSON APIs, \nzxcvbn library for password strength estimation, \nmailgun-java for sending transactional Mailgun emails, \nApache PDFBox for manipulation of PDF files, \nScrimage image library for manipulation of images, \nKotest and MockK for unit tests, Flexmark for markdown editor, CKEditor WYSIWYG editor, \nEvernote API for Evernote integration, Google reCaptcha and more.\n\n## Implemented features\n\n* Public blog with articles, categories, comments, search, products to purchase, integration of social networks, terms and conditions, data privacy and cookies policy, contact form.\n* Administration of article categories, articles, roles, users, comments, products and orders. Markdown editor and WYSIWYG editor.\n* Simple client zone for customers to view their purchased products.\n* Google Doc integration - syncing article content with Google Doc content.\n  Application is authorized to access content editor's Google documents via Google OAuth2.\n* Evernote integration using simple developer token \n  (real applications authenticate with Evernote using OAuth, but for the purpose of exploring the API, you can get a developer token that allows you to access your own Evernote account. To get a developer token, visit https://www.evernote.com/api/DeveloperToken.action).\n* Mailer for Mailgun transactional emails.\n* MailerLite webhook integration for real-time subscriber status synchronization.\n\n## MailerLite Webhook Configuration\n\nTo enable automatic synchronization of subscriber unsubscribe events with your ArtBeams database:\n\n1. **Configure webhook secret**: Add `mailerlite.webhook.secret` to your application configuration\n2. **Register webhook in MailerLite**:\n   - Go to MailerLite dashboard → Integrations → Webhooks\n   - Create new webhook with URL: `https://yourdomain.com/api/webhook/mailerlite/events`\n   - Select events: `subscriber.unsubscribed`, `subscriber.removed_from_group`\n   - Use your configured secret for authentication\n3. The webhook will automatically update user consent status in your database when users unsubscribe\n\n## Development\n\n### Conventions\n\nPackages are organized by feature, not by layer.\nA feature usually consists of an `admin` subpackage for admin controllers, services and forms; \nof `controller` subpackage for public web controllers, `service` subpackage for services,\n`repository` subpackage for repositories and `domain` subpackage for domain data classes. \n\n### Common package\n\nPackage `common` contains common cross-cutting functionalities, patterns and utilities.\n\nFor example: `OperationCtx` - operation context; counting of user accesses; `AbstractJsonApi`; \n`Asset` data model with common `AssetAttributes` and `AssetRepository`; \n`AuthorizationCodeGenerator` and `AuthorizationCodeValidator`; \n`BaseController` as base class for public controllers; email validator for advanced email format and domain validation;\n`OperationException` as base class of application-specific exception hierarchy and related `Preconditions`,\n`ErrorCode` and `StatusCode`, file management utils; \nFormio form library validators and library extensions for Kotlin and Spring file uploads; \nFreeMarker configuration; JSON ObjectMapper; `MailgunMailSender`;\n`MarkdownConverter` for conversion of markup to HTML; \ndata overview pagination utilities; JOOQ converters;\n`AbstractRecordFetcher`, `AbstractRecordStorage` and `AbstractMappingRepository` as abstract repository classes\nand interfaces; queue for asynchronous processing of entries with re-tries and exponential backoff; \nencryption, encoding and hashing security utilities; date and text utilities.\n\n### GIT branches\n\n* Remote \"origin\" branch for GitHub and remote \"master\" branch for Heroku can be used.\n* Pushing from local master to both remotes: \"origin\" (for GitHub git) and \"master\" (for Heroku deployment).\n\n### Gradle build\n\nBuild using `./gradlew clean build`\n\nUpdating gradle wrapper: Update gradle version in build.gradle or springBootVersion of spring-boot-gradle-plugin \nand run: `gradle wrapper`\n\n### Automatic application restarts using Spring Developer Tools\n\nIn IDE is usually not compiling immediately the changed sources, manual rebuild is required so the application\nis automatically restarted (like Ctrl + F9 in IntelliJ IDEA). \nThis involves also changes in templates (but change in a template does not invoke application restart because it is not necessary - templates are not cached in development mode).\n(see https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html).\n\n## Quick start guide\n\n* Configure database in application.properties.\n* Create DB tables using sql/create*.sql scripts.\n* Fill in DB tables using sql/insert*.sql scripts, fill in your own configuration and translations.\n* Run application with local config: `./gradlew :bootRun --args='--spring.profiles.active=local'`, or:\n* Run Application main class with VM options: `-DJDBC_DATABASE_URL=jdbc:postgresql://localhost:5432/\u003cdb-name\u003e -DJDBC_DATABASE_USERNAME=... -DJDBC_DATABASE_PASSWORD=...`\n\n* **Default Admin User**: A default admin user is created on the first application run. Change the password of admin user!\n  * **Login**: `admin`\n  * **Password**: `adminadmin`\n\n### Troubleshooting\n\n* **Localization Encoding**: If you encounter missing localization keys (e.g., `InvalidReferenceException: ... xlat['news.form.intro']`), it might be due to encoding issues when running `insert_localisation.sql`. On Windows, ensure you run the script with UTF-8 encoding:\n  ```powershell\n  $env:PGCLIENTENCODING='UTF8'; psql -U postgres -d artbeams -f src/main/resources/sql/insert_localisation.sql\n  ```\n\n### Running on Heroku\n\n* Add Heroku Procfile (provided)\n* In Heroku CLI run command: `heroku ps:scale web=1` (so the application has associated one dyno required for application run and application can start)\n* See Heroku documentation for more details\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fberanradek%2Fartbeams","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fberanradek%2Fartbeams","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fberanradek%2Fartbeams/lists"}