diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..40feb583ae2a81fe36d0ccc153f5ceb6be18c576
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,58 @@
+#include <QString>
+#include <QStringList>
+#include <QUrl>
+#include <QJsonObject>
+#include <QCommandLineParser>
+#include <QCoreApplication>
+#include <QGuiApplication>
+#include <QIcon>
+#include <QQmlApplicationEngine>
+#include <QQmlContext>
+
+#include "core/config.h"
+#include "core/network.h"
+#include "handlers/xdgurl.h"
+#include "utility/file.h"
+
+int main(int argc, char *argv[])
+{
+    // Init
+    //QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // Qt 5.6 or higher
+    QGuiApplication app(argc, argv);
+
+    Core::Config *appConfig = new Core::Config(":/configs");
+    QJsonObject appConfigApplication = appConfig->get("application");
+    Core::Config *userConfig = new Core::Config(Utility::File::xdgConfigHomePath() + "/" + appConfigApplication["id"].toString());
+    Core::Network *asyncNetwork = new Core::Network(true);
+    //Core::Network *syncNetwork = new Core::Network(false);
+
+    app.setApplicationName(appConfigApplication["name"].toString());
+    app.setApplicationVersion(appConfigApplication["version"].toString());
+    app.setOrganizationName(appConfigApplication["organization"].toString());
+    app.setOrganizationDomain(appConfigApplication["domain"].toString());
+    app.setWindowIcon(QIcon::fromTheme(appConfigApplication["id"].toString(), QIcon(appConfigApplication["icon"].toString())));
+
+    // Setup CLI
+    QCommandLineParser clParser;
+    clParser.setApplicationDescription(appConfigApplication["description"].toString());
+    clParser.addHelpOption();
+    clParser.addVersionOption();
+    clParser.addPositionalArgument("xdgurl", "XDG-URL");
+    clParser.process(app);
+
+    const QStringList args = clParser.positionalArguments();
+
+    if (args.size() != 1) {
+        clParser.showHelp(1);
+    }
+
+    const QString xdgurl = args.at(0);
+
+    // Setup QML
+    QQmlApplicationEngine qmlAppEngine;
+    QQmlContext *qmlContext = qmlAppEngine.rootContext();
+    qmlContext->setContextProperty("xdgUrlHandler", new Handlers::XdgUrl(xdgurl, appConfig, userConfig, asyncNetwork));
+    qmlAppEngine.load(QUrl("qrc:/qml/main.qml"));
+
+    return app.exec();
+}