MagicMirror² v2.14.0 is available! For more information about this release, check out this topic.

Calendar Module: How to declare local calendar

  • Hi all,

    maybe a stupid question but I cannot figure it out. I host my own Calendar file using Radicale Server on same Raspberry pi as the Mirror is but I have no idea how to access the local .ics file within the Mirror. I´ve tried both, local path ala /home/pi/…/MyCalendar.ics and also via https://IP-Address:5232/user/MyCalendar.ics but nothin works. Could anyone please guide me on how to set up the calendar properly? Thanks in Advance

  • Did nobody every used a local file instead of Icloud or whatever? Am I the first? Even SMB or NFS would be fine but non of them is working…

  • Project Sponsor

    I’m currently trying to do the same as a modification to the compliments module. As part of the gift, my wife is writing up about 100 compliments for the recipients. That’s a bit much to throw into the config.js file, so I am attempting to get it to load the JSON for the compliments array in a separate file.

    I’ve had some success. I managed to get the file loaded into a variable. I can log out the contents of the array. What I can’t seem to do it get that variable into the existing compliments code. Hopefully you’ll have more success. Loading JSON file code taken from Codepen.

    complimentFile: function(callback) {
    	var xobj = new XMLHttpRequest();
    	xobj.overrideMimeType("application/json");'GET', this.file([***file name***]), true); 
    	xobj.onreadystatechange = function () {
    		if (xobj.readyState == 4 && xobj.status == "200") {

    And the call:

    randomCompliment: function() {
    	var compliments = this.complimentArray();
    		var complimentFile = this.complimentFile(function (response) {
    		     var json = JSON.parse(response);
    		var index = this.randomIndex(compliments);
    		return compliments[index];

    With this code, I can get the console to show the contents of the JSON file. In the log, I can see the first of the morning compliments I set up in my external file. But for the life of me, I can’t seem to get that json object out of the function. Javascript is obviously not my thing.

  • Project Sponsor Module Developer


    I’m not programmer either but doesn’t this line just call the first object in the json file?

    function readTextFile(file, callback) {
    var rawFile = new XMLHttpRequest();
    rawFile.overrideMimeType(“application/json”);“GET”, file, true);
    rawFile.onreadystatechange = function() {
    if (rawFile.readyState === 4 && rawFile.status == “200”) {

    readTextFile("/Users/Documents/workspace/test.json", function(text){
    var data = JSON.parse(text);

  • @bhepler thanks for the input but unfortunately your Problem is different to mine. The Calendar Module is already looking for an external ics File, all I need to know is the correct syntax for a local File instead of somewhere on a Webserver.

  • Moderator

    A quick search for “local ics” would return this: 🙂

  • @yawns hm Im pretty sure I searched for these two words before I opened the thread but didnt found it… I tried already something like this but without webcal prefix. I will try when I have a connection and give feedback. Thanks for the Link.

  • @yawns now I remember… i tried it that way and now the calendar tells me “no upcoming events”, whats not true.

  • @yawns Ok, the link finally solved my problem. I tried first to place the ics file under /MagicMirror directly but that doesnt work. As mentioned in the link I also created a new folder under /MagicMirror/modules and it works now. Thanks for your help.

  • Project Sponsor Module Developer

    @bhepler something like this should do the job:

    move the call of complimentFile into the start method, you want to load that file only once not every 30 secs
    then override the the config compliments object with your data, that should be it

    start: function() {"Starting module: " +;
        this.lastComplimentIndex = -1;
        this.complimentFile((response) => {
            this.config.compliments = JSON.parse(response);
        // Schedule update timer.
        var self = this;
        setInterval(function() {
        }, this.config.updateInterval);

Log in to reply