diff --git a/pycper.c b/pycper.c
new file mode 100644
index 0000000..5c5ec22
--- /dev/null
+++ b/pycper.c
@@ -0,0 +1,125 @@
+#if LIBCPER_PYTHON
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+#include <libcper/cper-parse-str.h>
+#include <libcper/cper-parse.h>
+
+PyObject *convert_to_pydict(json_object *jso)
+{
+	PyObject *ret = Py_None;
+	enum json_type type = json_object_get_type(jso);
+	//printf("type: %d ", type);
+	switch (type) {
+	case json_type_null:
+		//printf("json_type_null\n");
+		ret = Py_None;
+		break;
+	case json_type_boolean: {
+		//printf("json_type_boolean\n");
+		int b = json_object_get_boolean(jso);
+		ret = PyBool_FromLong(b);
+	} break;
+	case json_type_double: {
+		//printf("json_type_double\n");
+		double d = json_object_get_double(jso);
+		ret = PyFloat_FromDouble(d);
+	} break;
+
+	case json_type_int: {
+		//printf("json_type_int\n");
+		int64_t i = json_object_get_int64(jso);
+		ret = PyLong_FromLong(i);
+	} break;
+	case json_type_object: {
+		//printf("json_type_object\n");
+		ret = PyDict_New();
+
+		json_object_object_foreach(jso, key1, val)
+		{
+			PyObject *pyobj = convert_to_pydict(val);
+			if (key1 != NULL) {
+				//printf("Parsing %s\n", key1);
+				if (pyobj == NULL) {
+					pyobj = Py_None;
+				}
+				PyDict_SetItemString(ret, key1, pyobj);
+			}
+		}
+	} break;
+	case json_type_array: {
+		//printf("json_type_array\n");
+		ret = PyList_New(0);
+		int arraylen = json_object_array_length(jso);
+
+		for (int i = 0; i < arraylen; i++) {
+			//printf("Parsing %d\n", i);
+			json_object *val = json_object_array_get_idx(jso, i);
+			PyObject *pyobj = convert_to_pydict(val);
+			if (pyobj == NULL) {
+				pyobj = Py_None;
+			}
+			PyList_Append(ret, pyobj);
+		}
+	} break;
+	case json_type_string: {
+		//printf("json_type_string\n");
+		const char *strval = json_object_get_string(jso);
+		ret = PyUnicode_FromString(strval);
+	} break;
+	}
+	return ret;
+}
+
+static PyObject *parse(PyObject *self, PyObject *args)
+{
+	(void)self;
+	PyObject *ret;
+	const unsigned char *data;
+	Py_ssize_t count;
+
+	if (!PyArg_ParseTuple(args, "y#", &data, &count)) {
+		return NULL;
+	}
+
+	char *jstrout = cperbuf_to_str_ir(data, count);
+	if (jstrout == NULL) {
+		free(jstrout);
+		return NULL;
+	}
+	json_object *jout = cper_buf_to_ir(data, count);
+	if (jout == NULL) {
+		free(jstrout);
+		free(jout);
+		return NULL;
+	}
+
+	ret = convert_to_pydict(jout);
+
+	//ret = PyUnicode_FromString(jstrout);
+	free(jout);
+	free(jstrout);
+	return ret;
+}
+
+static PyMethodDef methods[] = {
+	{ "parse", (PyCFunction)parse, METH_VARARGS, NULL },
+	{ NULL, NULL, 0, NULL },
+};
+
+static struct PyModuleDef module = {
+	PyModuleDef_HEAD_INIT,
+	"cper",
+	NULL,
+	-1,
+	methods,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+};
+
+PyMODINIT_FUNC PyInit_cper(void)
+{
+	return PyModule_Create(&module);
+}
+#endif
