Xanadu first public release!

Xanadu is a framework for developing Database Driven Web Apps.

Xanadu uses PHP / MySQL / HTML / Bootstrap / CSS / Javascript with several amazing includes.

We’ve been developing Database Apps for decades with FileMaker and Xojo. FileMaker rocks but licensing became too expensive. Xojo has fantastic pricing, but is perpetually buggy. We had to find an alternative platform. PHP kept coming up in our searches. Long story short, we decided PHP is the best option just to get back to an affordable and solid platform.

Xanadu is FREE because we want to help others. If there’s enough interest, we hope to build a community of developers.

Read more about Xanadu: Xanadu | CampSoftware


when i click on the [Xanadu | CampSoftware] and click again on the Xanadu is available for download at [GitHub.com/CampSoftware] but it going to some weird which is not even github

Thank you! Fixed. :slight_smile:

I’m adding more documentation ASAP.

Starting to add a Getting Started section.

I hope the very best success!

1 Like

Does it support a shopping cart ?

Not yet. Xan currently has modules for Home, Contacts with a related list of Comms, Stats, Settings, and Users.

Tables exist for Orders, OrdersItems, Products, Payments, Disbursements, but each of these needs to have modules added. The Shopping Cart will behave like an Order. Before that, I will add a Products module with a Purchase buttons using Stripe Checkout.

We also plan to Projects module with related Items which have related Tasks. Then create Orders from Billable Project Tasks.

1 Like

Congratulations, but I can’t resist the line: With seeing the name, at my age, the first image in my head was Olivia Newton-John and Gene Kelly on roller skates. After that came “Citizen Kane”, a reference I’m sure you’d prefer. :slight_smile:

Edit: Xojo left his home in Tuscon, Arizona, for some California grass.

1 Like

Xanadu now has two factor authentication via SMS using Twillo or Email via MailGun.

Link is at the top of this thread. :slight_smile:

Have questions? Hit reply and ask!

1 Like

Great stuff, @HalGumbert !

Not knowing too much about such things, I’m curious how your product compares/differs to/from something like Laraval?

I don’t know much about other frameworks like Laraval. From what I’ve seen there’s a lot of setting of json properties. I’d LOVE to see a ‘hello world’ for a simple Laraval app that accesses a database.

Regarding Xanadu, it works like you might imagine. Tomorrow I’ll work to get a live demo up and will post the link here.

A user loads a url. Almost all URLs load via index.php:

require_once( 'init.php' );

// Aloe Load
require_once( 'aloe/framework/load.php' );

// Request Route
require_once( 'router.php' );

// Response Return
  • init.php loads constants, settings, classes, and functions.
  • Aloe from Tim Dietrich does the session, request, and response management.
  • router.php examines the url/request and loads the requested response.
  • Finally the response is sent to the user.

If someone requests foo.com/contacts/123, it’s routed to /app/contacts-0-page.php. Here’s what is in /app/contacts:

  • The content can be loaded immediately or after the page loads via ajax. Loading immediately is faster.
  • The content is loaded via content-1-cards.php which then loads each card.
  • The php pages that begin with “do” are ajax calls that do their work in the background and then update the page when the response is sent.
  • In the example of do-contacts-name-update.php, when a user edits a field like Last Name the event “onchange” triggers and sends the field info to php via ajax which saves the data. Then the new “full name” in the page header and the name in the list of Contacts are updated.

I hope this helps. Tomorrow I’ll work on an interface video and get the live test site up. :slight_smile:

Take a few minutes to watch this. (There’s tons of videos, but I tried to find a short one to give you an overview)
I’ve been casually looking at Laravel for the past couple of weeks, then came across what you’ve got going so that’s why I asked, since they both seem to be php/database solutions?

Let me know what you think!


Thank you for that link. That was a really good demo. I wish I saw that a long time ago. I’m very interested, but not ready to move Xanadu to Laravel. I like Laravel’s structure.

After watching I googled a little about using ajax with form inputs and how to add a class to an input. I like their concept but MVC a little foreign to me. My brain is still procedural, but I’ll be thinking about this… :slight_smile:

What I thought was interesting is how you can change databases with just a config change, no code changes needed.
Routes are a new idea to me, but anyway, I expect I’ll be doing a lot more php so perhaps some tools are in order.

If you’d like to try out Xanadu, you can create a login here:

I’ll make an overview video later today this weekend starting from that page. :slight_smile:

Late to the party but… YEY! Congratulations.

1 Like

Been working on a huge update. Refactored how javascript is called. I hope to push the update today. :slight_smile:

It won’t change the UI, but the code will be cleaner!

Lots of updates!


  • Updated the init file loader to use HTTP_HOST instead of SERVER_NAME to load ‘init_DOMAIN.php’.

  • Updated the init file loader to use DIR instead of dirname( FILE ). Both are equivalant.

  • Updated upload.php to use permissions 775 instead of 777 when creating directories.


  • Moved the directories logs|brief|bucket to files/DOMAIN/logs|brief|bucket to separate between instances.

  • Updated Bucket Upload to use the new folder structure.


  • Updated XSS to use a Header rather than a Meta tag as Headers work with ‘frame-ancestors’.

  • Updated the database settings from a hardcoded ‘init_private.php’ to look for a file based on the domain name like ‘init_xanadu.xanweb.app.php’. A basic text 404 message is shown if the domain doesn’t match an existing file.


  • Updated Darkly css to comment out Google Font ‘Lato’ to prevent XSS notfications when Google Fonts is not approved. Darkly is for Dark Mode and from https://bootswatch.com


  • Update Reload and XSS formatting.


  • Updated the Session Updated and Expires timestamps comment.



  • Updated XSS Content-Security-Policy frame-ancestors to none.
  • Updated the mobile / narrow window hamburger menu to appear correctly appear in light and dark mode.
  • Updated xanLocationGet err.code = 2 message to help Mac Safari users enable Locations Services permissions.


  • Updated xanDo and xanDoSave so xanMessage to show an icon immediately and when done, a success or error messages is shown. On success, the icon and message fades out. Now uses a table for formatting.
  • Added sendSMSDebug function and constant for APP_SMS_TO_DEBUG. Moved the debug constants to init_private.php. Needed this to find a pesky error.
  • Added Logging PHP errors to a file in the logs folder.
  • Error fixed. Icon constants FA_SORT_ASC and FA_SORT_DESC were missing.
  • Added Session values for Path and Info in router.php.


  • Contacts: Fixed Table Row incrementer.
  • Contacts: Fixed missing ": " in NameUpdate.
  • Encoded the $aloe_request->path_get() and $aloe_request->path_components_get().
  • Updated xanMessage for xanDo and xanDoSave with larger icons and fix spacing in the javascript console.
  • Updated Users nameUpdate to use NameFull.


  • Replaced $tableRowIndex++ with ++$tableRowIndex to increment inline.


  • Added a preceding backslash before all usages of xan.


  • Moved xan.js from /include to /xan.


  • Replaced usages of $_POST with $aloe_request->post.
  • Replaced usages of \xan\valuePOST with \xan\paramEncode.
  • Removed the functions \xan\valuePOST and \xan\valueGET.


  • Updated paramEncode to accept a value or an array.
  • Fixed XSS Error regarding frame-ancestors by adding the site url.
1 Like