Hey guys!
We've just released a major update on Crater Invoice: [https://craterapp.com](https://craterapp.com/?fbclid=IwAR2c5RN365G5ckM89Wp0jJP9-CFZElo2DGNvQavdQXzD5NMSjINnO5_4r-g).
It's a free & open-source Self Hosted Invoice app built with Laravel, TailwindCSS & VueJS.
You can also use mobile apps that allow you to manage your business on the go!
Android: [https://play.google.com/store/apps/details...](https://play.google.com/store/apps/details?id=com.craterapp.app&hl=en_IN&gl=US&fbclid=IwAR0CbGjvkPEFPvD1y9EpBHi6ULHQkyTvh29N8iEf94RBWxvcUO02OXe0IzE)
IOS: [https://apps.apple.com/us/app/crater-invoice/id1489169767](https://apps.apple.com/us/app/crater-invoice/id1489169767?fbclid=IwAR1arkGZrDIn4l3nYo69KwzbN6UnJzxYip2JyEzmrRLdMNJmiTlyUfmCv3I)
New changes:
* Replaced Bootstrap CSS framework with Tailwind CSS
* Upgraded to Laravel 8
* Added ability to create & download file & DB Backups
* Added File-Disk Configuration Settings ( Saves PDFs or Backups to Digital Ocean Spaces, AWS S3 & Dropbox)
* Added new Customer View page
* Added Custom Notes for Estimates, Payments & Invoices
* Added Unit & Feature Tests
* Revamped API + API Documentation
* Added ability to Edit Email Subject & Description with placeholders before sending out an Invoice or Estimate Email
* Added Custom Fields - Customize your Address formats on PDFs ( use custom or basic fields according to your preference)
* Added Global Search
* Added ability to Manage Admins (Add, Edit, and remove Admins)
Thanks. Going through the code will be a very useful learning experience.
This is brilliant. Amazing work, thank you.
What did you use for the mobile apps? Is it open source too?
Wow that’s extraordinary! Thank you for sharing your work! I will have a good time learning by reading your code. What did you develop the app/s in and is this also available open? I’m slowly diving into app development and learning by reading and testing code would be amazing, especially from a real world app. Most tutorials cut too many corners on best practices etc.
Was going to try and install this with a Docker setup, and saw you already have one ready to go!
Nice app, can’t wait to dive into it.
Hey! This is just… extraordinary!
Can I ask what did you use for the mobile app? How did you achieve the social login? I am struggling a lot with that. I would really appreciate it.
This is amazing!
One thing I would recommend doing is scrambling the alphabets on the `config/hashids.php` for each connection.
If you utilize the same alphabet order, the hash for Invoice 1 will be the same for Estimate 1 and the same for Payment 1. This potentially makes it easier for someone to guess a hash and try to access it via your UI.
I’d also recommend salting with a unique string for the app, so that different apps have different salts.
I’d also recommend not using similar characters like `1` and `l` and letters that can be used for curse words. https://github.com/vinkla/hashids#curse-words-
// https://onlinerandomtools.com/shuffle-letters
‘connections’ => [
‘main’ => [
‘salt’ => config(‘app.key’) . ‘main’,
‘length’ => 8,
‘alphabet’ => ‘xj9ek35m87arv6w2npbzdg4y’
],
\App\Models\Agreement::class => [
‘salt’ => \App\Models\Agreement::class . config(‘app.key’),
‘length’ => 8,
‘alphabet’ => ‘4qm2rdnzaepw765bxv389kgyj’
],
\App\Models\Contact::class => [
‘salt’ => \App\Models\Contact::class . config(‘app.key’),
‘length’ => 8,
‘alphabet’ => ‘dnjy63apmzxgvr792b854kew’
],
\App\Models\ContactPlan::class => [
‘salt’ => \App\Models\ContactPlan::class . config(‘app.key’),
‘length’ => 8,
‘alphabet’ => ‘8ngxm5pzbre9vy4kj632wda7’
],
\App\Models\Bookings\Calendar::class => [
‘salt’ => \App\Models\Bookings\Calendar::class . config(‘app.key’),
‘length’ => 8,
‘alphabet’ => ‘y7rj3x6z25nv8bdke9m4wapg’
],
\App\Models\Bookings\Event::class => [
‘salt’ => \App\Models\Bookings\Event::class . config(‘app.key’),
‘length’ => 8,
‘alphabet’ => ‘2pn53wy64gj8earv97dbxkzm’
],
\App\Models\Invoice::class => [
‘salt’ => \App\Models\Invoice::class . config(‘app.key’),
‘length’ => 8,
‘alphabet’ => ‘8dm6gyje47xpa3kzv9brwn52’
],
\App\Models\Offer::class => [
‘salt’ => \App\Models\Offer::class . config(‘app.key’),
‘length’ => 8,
‘alphabet’ => ‘z4867dv2n3mjp5wybrekxag9’
],
\App\Models\Plan::class => [
‘salt’ => \App\Models\Plan::class . config(‘app.key’),
‘length’ => 8,
‘alphabet’ => ‘nzge9mv6jwxkb3587ydpr24a’
],
\App\Models\Product::class => [
‘salt’ => \App\Models\Product::class . config(‘app.key’),
‘length’ => 8,
‘alphabet’ => ‘yamd476pngwrx5k2vzejb389’
],
\App\Models\Rank::class => [
‘salt’ => \App\Models\Rank::class . config(‘app.key’),
‘length’ => 8,
‘alphabet’ => ‘4832ngvzmer67x59jykpdabw’
],
\App\Models\Roster::class => [
‘salt’ => \App\Models\Roster::class . config(‘app.key’),
‘length’ => 8,
‘alphabet’ => ‘d74xyzmngkwe5j8p32vra69b’
],
\App\Models\Style::class => [
‘salt’ => \App\Models\Style::class . config(‘app.key’),
‘length’ => 8,
‘alphabet’ => ‘rbym76ae9d8p5j3z2gkxvn4w’
],
Outstanding – thanks!
FYI there’s a broken link here- the repo link hits a 404:
[https://github.com/bytefury/crater-mobile#web](https://github.com/bytefury/crater-mobile#web)
Looks like wholesale theft of Invoice Ninja code.
This is incredible. How do you make money?
This is really nice! Only thing missing when you want to use this as a EU company is the VAT number on the invoices. But I think that shouldn’t be to hard to add it in by myself. Thanks for this amazing work
Oh wow, that’s impressive.
Why build this app in Vue if you have a wealth of experience using React? Just curious is all 🙂
Thanks! By the way, I checked the linked GitHub and found that it’s using DomPDF. How do you handle invoice pagination and customization? Any difficulties you faced in creating the PDF templates? I’ve used it before, and found so many limitations in the styling options. Would like to know if it’s worth it or should i look at another method.