PHPackages                             muhammad1200/blog-cms-package - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. muhammad1200/blog-cms-package

ActiveLibrary[Framework](/categories/framework)

muhammad1200/blog-cms-package
=============================

A Laravel publishing platform

016[6 PRs](https://github.com/Muhammad1200/blog-cms-package/pulls)PHPCI failing

Since Jan 14Pushed 10mo ago1 watchersCompare

[ Source](https://github.com/Muhammad1200/blog-cms-package)[ Packagist](https://packagist.org/packages/muhammad1200/blog-cms-package)[ RSS](/packages/muhammad1200-blog-cms-package/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (7)Used By (0)

 [![Build Status](https://github.com/austintoddj/canvas/workflows/tests/badge.svg)](https://github.com/austintoddj/canvas/actions) [![Total Downloads](https://camo.githubusercontent.com/549ab9ffca871b0bcdafd5a37f5f7f69e9f3f1fd7382a33ebfb8d34e791a6154/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f61757374696e746f64646a2f63616e766173)](https://packagist.org/packages/austintoddj/canvas) [![Latest Stable Version](https://camo.githubusercontent.com/fcaf4aa898432d48fd6e1bee5c37f68f73f4d50b3c26fd409beffb68b0835c94/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f61757374696e746f64646a2f63616e766173)](https://packagist.org/packages/austintoddj/canvas) [![License](https://camo.githubusercontent.com/545ff290a97c634835bd93b071cd4ea8009e2cc009e9e53cb3e4402bc13cb99a/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f61757374696e746f64646a2f63616e766173)](https://packagist.org/packages/austintoddj/canvas)

Introduction
------------

[](#introduction)

Canvas is a fully open source package to extend your existing [Laravel](https://laravel.com) application and get you up-and-running with a blog in just a few minutes. In addition to a distraction-free writing experience, you can view monthly trends on your content, get insights into reader traffic and more!

System Requirements
-------------------

[](#system-requirements)

- PHP &gt;= 7.3
- Laravel &gt;= 6.0
- One of the [five supported databases](https://laravel.com/docs/10.x/database#introduction) by Laravel

Installation
------------

[](#installation)

You may use composer to install Canvas into your Laravel project:

```
composer require muhammad1200/blog-cms-package
```

Publish the assets and primary configuration file using the `canvas:install` Artisan command:

```
php artisan canvas:install
```

Create a symbolic link to ensure file uploads are publicly accessible from the web using the `storage:link` Artisan command:

```
php artisan storage:link
```

Configuration
-------------

[](#configuration)

After publishing Canvas's assets, a primary configuration file will be located at `config/canvas.php`. This file allows you to customize various aspects of how your application uses the package.

Canvas exposes its UI at `/canvas` by default. This can be changed by updating either the `path` or `domain` option:

```
/*
|--------------------------------------------------------------------------
| Base Domain
|--------------------------------------------------------------------------
|
| This is the subdomain where Canvas will be accessible from. If the
| domain is set to null, Canvas will reside under the defined base
| path below. Otherwise, this will be used as the subdomain.
|
*/

'domain' => env('CANVAS_DOMAIN', null),

/*
|--------------------------------------------------------------------------
| Base Path
|--------------------------------------------------------------------------
|
| This is the URI where Canvas will be accessible from. If the path
| is set to null, Canvas will reside under the same path name as
| the application. Otherwise, this is used as the base path.
|
*/

'path' => env('CANVAS_PATH_NAME', 'canvas'),
```

Sometimes, you may want to apply custom roles or permissions when accessing Canvas. You can create and attach any additional middleware here:

```
/*
|--------------------------------------------------------------------------
| Route Middleware
|--------------------------------------------------------------------------
|
| These middleware will be attached to every route in Canvas, giving you
| the chance to add your own middleware to this list or change any of
| the existing middleware. Or, you can simply stick with the list.
|
*/

'middleware' => [
    'web',
],
```

Canvas uses the storage disk for media uploads. You may configure the different filesystem options here:

```
/*
|--------------------------------------------------------------------------
| Storage
|--------------------------------------------------------------------------
|
| This is the storage disk Canvas will use to put file uploads. You may
| use any of the disks defined in the config/filesystems.php file and
| you may also change the maximum upload size from its 3MB default.
|
*/

'storage_disk' => env('CANVAS_STORAGE_DISK', 'local'),

'storage_path' => env('CANVAS_STORAGE_PATH', 'public/canvas'),

'upload_filesize' => env('CANVAS_UPLOAD_FILESIZE', 3145728),
```

Roles &amp; Permissions
-----------------------

[](#roles--permissions)

Canvas comes with 3 pre-defined roles out-of-the-box:

- **Contributor** (A user who can write and manage their own posts but cannot publish them)
- **Editor** (A user who can publish and manage posts including the posts of other users)
- **Admin** (A user who can do everything and see everything)

When you install a fresh version of Canvas, you'll have a default admin user set up automatically. From there, you can perform any basic CRUD actions on users, as well as assign their various roles.

Canvas UI
---------

[](#canvas-ui)

**Want a beautiful, Medium.com-inspired frontend?** Use the `canvas:ui` Artisan command to install the scaffolding:

```
php artisan canvas:ui
```

After generating the frontend scaffolding, your `package.json` file will include the necessary dependencies to install and compile:

```
# Using NPM
npm install
npm run dev

# Using Yarn
yarn
yarn dev
```

That's it! You can navigate to `/canvas-ui` and check it out for yourself. You're free to modify any aspect of it that you'd like.

Unsplash Integration
--------------------

[](#unsplash-integration)

**Want access to the entire [Unsplash](https://unsplash.com) library?** Set up a new application at , grab your access key, and update `config/canvas.php`:

```
/*
|--------------------------------------------------------------------------
| Unsplash Integration
|--------------------------------------------------------------------------
|
| Visit https://unsplash.com/oauth/applications to create a new Unsplash
| app. Use the confidential Access Key given to you to integrate with
| the API. Note that demo apps are limited to 50 requests per hour.
|
*/

'unsplash' => [
    'access_key' => env('CANVAS_UNSPLASH_ACCESS_KEY'),
]
```

E-mail Notifications
--------------------

[](#e-mail-notifications)

**Want a weekly summary?** Canvas allows users to receive a weekly digest of their authored content. Once your application is [configured for sending mail](https://laravel.com/docs/10.x/mail), update `config/canvas.php`:

```
/*
|--------------------------------------------------------------------------
| E-Mail Notifications
|--------------------------------------------------------------------------
|
| This option controls e-mail notifications that will be sent via the
| default application mail driver. A default option is provided to
| support the notification system as an opt-in feature.
|
|
*/

'mail' => [
    'enabled' => env('CANVAS_MAIL_ENABLED', false),
]
```

Since this feature runs on [Laravel's Scheduler](https://laravel.com/docs/10.x/scheduling), you'll need to add the following cron entry to your server:

```
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
```

API
---

[](#api)

Installing [Canvas UI](#canvas-ui) will be the most efficient way to get up and running with a frontend interface to display your data. However many users will opt for creating this by hand since it gives flexibility to their design aesthetic.

Using the `published` scope will allow you to only retrieve posts that have a published date in the past:

```
Canvas\Models\Post::published()->get()
```

You can also retrieve the inverse with a `draft` scope:

```
Canvas\Models\Post::draft()->get()
```

To return a single post, you'll likely want to find it by a given slug, as well as include related entities such as:

```
$post = Canvas\Models\Post::with('user', 'tags', 'topic')->firstWhere('slug', $slug);
```

> **Important:** In the same method that returns a post, make sure you fire the `PostViewed` event, or else a view/visit will not be recorded.

```
event(new Canvas\Events\PostViewed($post));
```

You can find a tag by a given slug:

```
Canvas\Models\Tag::with('posts')->firstWhere('slug', $slug);
```

And a similar query can be used for a topic:

```
Canvas\Models\Topic::with('posts')->firstWhere('slug', $slug);
```

Users can be retrieved by their `id`, `username`, or `email`:

```
$user = Canvas\Models\User::find($id);
$user = Canvas\Models\User::firstWhere('username', $username);
$user = Canvas\Models\User::firstWhere('email', $email);
```

Additionally, you can return the users' published posts with their associated topic:

```
$user->posts()->published()->with('topic')
```

Updates
-------

[](#updates)

Canvas follows [Semantic Versioning](https://semver.org) and increments versions as `MAJOR.MINOR.PATCH` numbers.

- Major versions **will** contain breaking changes, so follow the [upgrade guide](.github/UPGRADE.md) for a step-by-step breakdown
- Minor and patch versions should **never** contain breaking changes, so you can safely update the package by following the steps below:

You may update your Canvas installation using composer:

```
composer update
```

Run any new migrations using the `canvas:migrate` Artisan command:

```
php artisan canvas:migrate
```

Re-publish the assets using the `canvas:publish` Artisan command:

```
php artisan canvas:publish
```

To keep the assets up-to-date and avoid issues in future updates, you may add the `canvas:publish` command to the `post-update-cmd` scripts in your application's `composer.json` file:

```
{
    "scripts": {
        "post-update-cmd": [
            "@php artisan canvas:publish --ansi"
        ]
    }
}
```

Contributing
------------

[](#contributing)

Thank you for considering contributing to Canvas! The [contribution guide can be found here](https://github.com/austintoddj/canvas/blob/master/.github/CONTRIBUTING.md).

Testing
-------

[](#testing)

Run the tests with:

```
composer test
```

Troubleshooting
---------------

[](#troubleshooting)

If you're running into problems, feel free to [open a new issue](https://github.com/austintoddj/canvas/issues) or check the [Discussions](https://github.com/austintoddj/canvas/discussions) forum to see if anyone else has run into something similar.

License
-------

[](#license)

Canvas is open-sourced software licensed under the [MIT license](license).

Credits
-------

[](#credits)

- [@austintoddj](https://twitter.com/austintoddj)
- [@talvbansal](https://twitter.com/talv)
- [@reliq](https://twitter.com/IAmReliq)
- [@mithicher](https://twitter.com/mithicher)
- [@themsaid](https://twitter.com/themsaid)
- [@NinaLimpi](https://twitter.com/NinaLimpi)

###  Health Score

19

—

LowBetter than 10% of packages

Maintenance38

Infrequent updates — may be unmaintained

Popularity6

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity22

Early-stage or recently created project

 Bus Factor1

Top contributor holds 75% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/d7609ff43d4ee1bddb56826a5eeb66d878863cb2c4c5225d1f3d2785bfec3783?d=identicon)[Sammay4190](/maintainers/Sammay4190)

---

Top Contributors

[![Muhammad1200](https://avatars.githubusercontent.com/u/33632686?v=4)](https://github.com/Muhammad1200 "Muhammad1200 (12 commits)")[![SammayKhan](https://avatars.githubusercontent.com/u/188966263?v=4)](https://github.com/SammayKhan "SammayKhan (4 commits)")

### Embed Badge

![Health badge](/badges/muhammad1200-blog-cms-package/health.svg)

```
[![Health](https://phpackages.com/badges/muhammad1200-blog-cms-package/health.svg)](https://phpackages.com/packages/muhammad1200-blog-cms-package)
```

###  Alternatives

[laravel/telescope

An elegant debug assistant for the Laravel framework.

5.2k67.8M191](/packages/laravel-telescope)[spiral/roadrunner

RoadRunner: High-performance PHP application server and process manager written in Go and powered with plugins

8.4k12.2M84](/packages/spiral-roadrunner)[nolimits4web/swiper

Most modern mobile touch slider and framework with hardware accelerated transitions

41.8k177.2k1](/packages/nolimits4web-swiper)[laravel/dusk

Laravel Dusk provides simple end-to-end testing and browser automation.

1.9k36.7M256](/packages/laravel-dusk)[laravel/prompts

Add beautiful and user-friendly forms to your command-line applications.

708181.8M592](/packages/laravel-prompts)[cakephp/chronos

A simple API extension for DateTime.

1.4k47.7M121](/packages/cakephp-chronos)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
