diff --git a/apps.api.php b/apps.api.php
index 4b30528..fe19487 100644
--- a/apps.api.php
+++ b/apps.api.php
@@ -60,6 +60,7 @@ function hook_apps_servers_info() {
       'title' => t('Store Title'), //the title to be use for the server
       'description' => t('A description of the server and what apps it might have'),
       'manifest' => 'http://apps.com/app/query', // the location of the  json manifest
+      'makefile' => 'example.make', // make for example
     ),
   );
 }
diff --git a/apps.manifest.inc b/apps.manifest.inc
index e8b4948..054faa5 100755
--- a/apps.manifest.inc
+++ b/apps.manifest.inc
@@ -178,50 +178,75 @@ function apps_request_manifest($server) {
   apps_request_manifest_image_process($manifest);
 
   // If there is no remote server, or we're in offline mode, stop here
-  if (!$server['manifest'] || variable_get('apps_offline_mode', FALSE)) {
+  if (!$server['manifest'] && !$server['makefile'] || variable_get('apps_offline_mode', FALSE)) {
     return $manifest;
   }
 
   // Now process remote apps
-  $info =  drupal_parse_info_file(dirname(__FILE__) . '/apps.info');
-  $rest_data = array(
-    'client_id' => apps_client_id(),
-    'apps_version' => $info['version'],
-    'format' => 'json',
-  ) + $server;
-
-  $url = url($server['manifest'], array('query' => $rest_data));
-  $request = drupal_http_request($url);
-
-  if (isset($request->error)) {
-    $msg = t("Manifest error from @server: @error", array('@server' => $server['title'], '@error' => $request->error));
-    watchdog("apps", $msg);
-    drupal_set_message($msg, 'warning');
-  }
-  else if ($remote_manifest = json_decode($request->data, TRUE)) {
-    // Translate index to machine name
-    foreach ($remote_manifest['apps'] as $index => $app) {
-      // If it is already a local app, note the remote version
-      if (array_key_exists($app['machine_name'], $manifest['apps'])) {
-        $manifest['apps'][$app['machine_name']]['remote manifest'] = $app;
+  if (!empty($server['manifest'])) {
+    $info =  drupal_parse_info_file(dirname(__FILE__) . '/apps.info');
+    $rest_data = array(
+      'client_id' => apps_client_id(),
+      'apps_version' => $info['version'],
+      'format' => 'json',
+    ) + $server;
+  
+    $url = url($server['manifest'], array('query' => $rest_data));
+    $request = drupal_http_request($url);
+  
+    if (isset($request->error)) {
+      $msg = t("Manifest error from @server: @error", array('@server' => $server['title'], '@error' => $request->error));
+      watchdog("apps", $msg);
+      drupal_set_message($msg, 'warning');
+    }
+    else if ($remote_manifest = json_decode($request->data, TRUE)) {
+      // Translate index to machine name
+      foreach ($remote_manifest['apps'] as $index => $app) {
+        // If it is already a local app, note the remote version
+        if (array_key_exists($app['machine_name'], $manifest['apps'])) {
+          $manifest['apps'][$app['machine_name']]['remote manifest'] = $app;
+        }
+        // else translate index to machine name
+        else {
+          $remote_manifest['apps'][$app['machine_name']] = $app;
+          $remote_manifest['apps'][$app['machine_name']]['remote'] = TRUE;
+        }
+        unset($remote_manifest['apps'][$index]);
       }
-      // else translate index to machine name
-      else {
-        $remote_manifest['apps'][$app['machine_name']] = $app;
-        $remote_manifest['apps'][$app['machine_name']]['remote'] = TRUE;
+      apps_request_manifest_image_process($remote_manifest);
+      $manifest['apps'] = array_merge($remote_manifest['apps'], $manifest['apps']);
+      cache_set("apps_manifest_{$server['name']}", $manifest, 'cache', REQUEST_TIME + 60 +30);
+    }
+    else {
+      $msg = t("Manifest JSON from @server not parsable", array('@server' => $server['title']));
+      watchdog("apps", $msg);
+      drupal_set_message($msg, 'warning');
+    }
+  }
+  if (!empty($server['makefile'])) {
+    $info = drupal_parse_info_file($server['makefile']);
+    foreach ($info['projects'] as $key => $data) {
+      if ($data['type'] == 'apps') {
+        unset($data['type']);
+        foreach ($data as $machine_name => $apps) {
+          if (!is_array($apps['screenshots']) && !empty($apps['screenshots'])) {
+            $apps['screenshots'] = array(
+              $apps['screenshots'],
+            );
+          }
+          $apps['machine_name'] = $machine_name;
+          $data['apps'][$machine_name] = $apps;
+          unset($data[$machine_name]);
+        }
+        $data['featured app'] = $key;
+        apps_request_manifest_image_process($data);
+        foreach ($data['apps'] as $machine_name => $apps) {
+          $manifest['apps'][$machine_name] = $apps;
+        }
       }
-      unset($remote_manifest['apps'][$index]);
     }
-    apps_request_manifest_image_process($remote_manifest);
-    $manifest['apps'] = array_merge($remote_manifest['apps'], $manifest['apps']);
     cache_set("apps_manifest_{$server['name']}", $manifest, 'cache', REQUEST_TIME + 60 +30);
   }
-  else {
-    $msg = t("Manifest JSON from @server not parsable", array('@server' => $server['title']));
-    watchdog("apps", $msg);
-    drupal_set_message($msg, 'warning');
-  }
-
   return $manifest;
 }
 
