Code Monkey home page Code Monkey logo

sdk-for-android's Introduction

Appwrite Android SDK

Maven Central License Version Build Status Twitter Account Discord

This SDK is compatible with Appwrite server version 1.5.x. For older versions, please check previous releases.

Appwrite is an open-source backend as a service server that abstract and simplify complex and repetitive development tasks behind a very simple to use REST API. Appwrite aims to help you develop your apps faster and in a more secure way. Use the Android SDK to integrate your app with the Appwrite server to easily start interacting with all of Appwrite backend APIs and tools. For full API documentation and tutorials go to https://appwrite.io/docs

Appwrite

Installation

Gradle

Appwrite's Android SDK is hosted on Maven Central. In order to fetch the Appwrite SDK, add this to your root level build.gradle(.kts) file:

repositories {      
    mavenCentral()
}

If you would like to fetch our SNAPSHOT releases, you need to add the SNAPSHOT maven repository to your build.gradle(.kts):

repositories {
    maven {
        url "https://s01.oss.sonatype.org/content/repositories/snapshots/"
    }
}

Next, add the dependency to your project's build.gradle(.kts) file:

implementation("io.appwrite:sdk-for-android:5.0.0")

Maven

Add this to your project's pom.xml file:

<dependencies>
    <dependency>
        <groupId>io.appwrite</groupId>
        <artifactId>sdk-for-android</artifactId>
        <version>5.0.0</version>
    </dependency>
</dependencies>

Getting Started

Add your Android Platform

To initialize your SDK and start interacting with Appwrite services, you need to add a new Android platform to your project. To add a new platform, go to your Appwrite console, select your project (create one if you haven't already), and click the 'Add Platform' button on the project Dashboard.

From the options, choose to add a new Android platform and add your app credentials.

Add your app name and package name. Your package name is generally the applicationId in your app-level build.gradle file. By registering a new platform, you are allowing your app to communicate with the Appwrite API.

Registering additional activities

In order to capture the Appwrite OAuth callback url, the following activity needs to be added to your AndroidManifest.xml. Be sure to replace the [PROJECT_ID] string with your actual Appwrite project ID. You can find your Appwrite project ID in your project settings screen in the console.

<manifest>
    <application>
        <activity android:name="io.appwrite.views.CallbackActivity" >
            <intent-filter android:label="android_web_auth">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="appwrite-callback-[PROJECT_ID]" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Init your SDK

Initialize your SDK with your Appwrite server API endpoint and project ID, which can be found in your project settings page.

import io.appwrite.Client
import io.appwrite.services.Account

val client = Client(context)
  .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
  .setProject("5df5acd0d48c2") // Your project ID
  .setSelfSigned(true) // Remove in production

Before starting to send any API calls to your new Appwrite instance, make sure your Android emulators has network access to the Appwrite server hostname or IP address.

When trying to connect to Appwrite from an emulator or a mobile device, localhost is the hostname of the device or emulator and not your local Appwrite instance. You should replace localhost with your private IP. You can also use a service like ngrok to proxy the Appwrite API.

Make Your First Request

Once your SDK object is set, access any of the Appwrite services and choose any request to send. Full documentation for any service method you would like to use can be found in your SDK documentation or in the [API References](https://appwrite.io/docs) section.

// Register User
val account = Account(client)
val response = account.create(
    ID.unique(),
    "[email protected]",
    "password",
    "Walter O'Brien"
)

Full Example

import io.appwrite.Client
import io.appwrite.services.Account
import io.appwrite.ID

val client = Client(context)
  .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
  .setProject("5df5acd0d48c2") // Your project ID
  .setSelfSigned(true) // Remove in production

val account = Account(client)
val user = account.create(
    ID.unique(),
    "[email protected]",
    "password",
    "Walter O'Brien"
)

Error Handling

The Appwrite Android SDK raises an AppwriteException object with message, code and response properties. You can handle any errors by catching AppwriteException and present the message to the user or handle it yourself based on the provided error information. Below is an example.

try {
    var user = account.create(ID.unique(),"[email protected]","password","Walter O'Brien")
    Log.d("Appwrite user", user.toMap())
} catch(e : AppwriteException) {
    e.printStackTrace()
}

Learn more

You can use the following resources to learn more and get help

Contribution

This library is auto-generated by Appwrite custom SDK Generator. To learn more about how you can help us improve this SDK, please check the contribution guide before sending a pull-request.

License

Please see the BSD-3-Clause license file for more information.

sdk-for-android's People

Contributors

abnegate avatar christyjacob4 avatar eldadfux avatar lohanidamodar avatar meldiron avatar sin-sumit avatar torstendittmann avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sdk-for-android's Issues

πŸ“š Documentation: Improve Appwrite Android documentation for beginners with Jetpack Compose project

πŸ’­ Description

I'm finding the current Appwrite Android documentation a bit challenging for beginners, especially the examples. Many existing examples haven't been updated to utilize Kotlin flows, which are the modern standard for asynchronous operations. Additionally, the playground examples feel too abstract and lack real-world context. Adding a complete project with Jetpack Compose would be a game changer for the community.

It would not only make Appwrite more accessible with up-to-date flow-based examples, but also showcase its capabilities in a tangible, real-world scenario. This would significantly lower the learning curve for new developers and unlock the full potential of Appwrite.

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

πŸ› Bug Report: Storage getFileDownload fails for big file (1GB) due to OutOfMemoryError

πŸ‘Ÿ Reproduction steps

Download a big file (1GB) with getFileDownload

πŸ‘ Expected behavior

It should download the file.

There is a client.chunkedUpload i guess we also need a client.chunkedDownload

πŸ‘Ž Actual Behavior

Throws java.lang.OutOfMemoryError:

AndroidRuntime  E  FATAL EXCEPTION: OkHttp Dispatcher
                E  java.lang.OutOfMemoryError: Failed to allocate a 268435472 byte allocation with 6275072 free bytes and 124MB until OOM, target footprint 143753320, growth limit 268435456
                E      at java.util.Arrays.copyOf(Arrays.java:3161)
                E      at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
                E      at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
                E      at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
                E      at kotlin.io.ByteStreamsKt.copyTo(IOStreams.kt:108)
                E      at kotlin.io.ByteStreamsKt.copyTo$default(IOStreams.kt:103)
                E      at kotlin.io.ByteStreamsKt.readBytes(IOStreams.kt:136)
                E      at io.appwrite.Client$awaitResponse$2$1.onResponse(Client.kt:511)
                E      at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
                E      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
                E      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
                E      at java.lang.Thread.run(Thread.java:919)

🎲 Appwrite version

Version 1.4.x

πŸ’» Operating system

Linux

🧱 Your Environment

Appwrite 1.4.5
sdk-for-android:4.0.0

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

πŸ› Bug Report: io.appwrite.WebAuthComponent$Companion.cleanUp (WebAuthComponent.kt:94)

πŸ‘Ÿ Reproduction steps

Screen Shot 2023-09-18 at 11 19 30

There's always a crash going on in the background.

πŸ‘ Expected behavior

fix

πŸ‘Ž Actual Behavior

I sent

🎲 Appwrite version

Version 1.4.x

πŸ’» Operating system

Linux

🧱 Your Environment

No response

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

πŸ› Bug Report:

πŸ‘Ÿ Reproduction steps

Unable to login through google login

Error : This provider is not enabled in appwrite console.
Android Version - 13
Device - samsung note 10 lite

πŸ‘ Expected behavior

It should show the list of emails available on the device

πŸ‘Ž Actual Behavior

Showing error :
Error : This provider is not enabled in appwrite console.

🎲 Appwrite version

Version 1.2.x

πŸ’» Operating system

MacOS

🧱 Your Environment

No response

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

πŸ› Bug Report: Persistent login is broken on Android 12

Appwrite Android SDK uses cookies to achieve persistent login and store user session. More specifically it uses https://github.com/gotev/android-cookie-store library to store cookies.

But as is mentioned in gotev/android-cookie-store#28 storing cookies does not work anymore on Android 12 and most likely support for it will just go downhill from now on due to Google policies.

I am aware that this should be handled in Android Cookie Store library, but since safest way to tackle this is to migrate away to proper token authentication and not use library at all - I am leaving this here.

At the moment it is not possible to use Appwrite Android SDK with Android 12. As soon as the app is closed, session is lost and you would have to login again and again.

πŸ› Bug Report: functions.createExecution() throwing java.lang.ClassCastException

πŸ‘Ÿ Reproduction steps

Appwrite Version 0.12 / SDK Version 0.3.0
Create a function execution via functions.createExecution()

πŸ‘ Expected behavior

Get the respective Execution Object and the function to be executed.

πŸ‘Ž Actual Behavior

Function is not being executed.

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double due to

🎲 Appwrite version

Different version (specify in environment)

πŸ’» Operating system

Linux

🧱 Your Environment

No response

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

Upgrade our issue templates to use GitHub issue forms ✍️

Introduction

GitHub has recently rolled out a public beta for their issue forms feature. This would allow you to create interactive issue templates and validate them 🀯.

Appwrite currently uses the older issue template format. Your task is to create GitHub issue forms for this repository. Please use Appwrite's issue templates as a reference for this PR.

Tasks summary:

  • Fork & clone this repository
  • Prepare bug report issue form in .github/ISSUE_TEMPLATE/bug.yaml
  • Prepare documentation issue form in .github/ISSUE_TEMPLATE/documentation.yaml
  • Prepare feature request issue form in .github/ISSUE_TEMPLATE/feature.yaml
  • Push changes to master and test issue forms on your fork
  • Submit pull request

If you need any help, reach out to us on our Discord server.

Are you ready to work on this issue? πŸ€” Let us know, and we will assign it to you 😊

Happy Appwriting!

toString() on a Map.Entry in Kotlin returns the value around [ ]

httpBuilder.addQueryParameter(it.key + "[]", it.value.toString())

it.value.toString()
The toString function of a Map.Entry will add brackets around the string, which are then URL encoded to %5B and %5D which breaks the filter on the server side and returns nothing.

For example, if you call
Database(Client.client).listDocuments("123456", filters = listOf("author=[email protected]"))

The URL generated will be
http://192.168.0.1/v1/database/collections/123456/documents?filters%5B%5D=%5Bauthor%3Dme%40example.com%5D

The expected URL looks like this
http://192.168.0.1/v1/database/collections/123456/documents?filters%5B%5D=author%3Dme%40example.com

see https://pl.kotl.in/leQ4MEljA

πŸ› Bug Report: getSession() throwing NullPointerException for sessions being created via email / password

πŸ‘Ÿ Reproduction steps

Appwrite Version 0.12 / SDK Version 0.3.0
Create a Session via email / password, try to get the session via getSession()

πŸ‘ Expected behavior

Get the respective Session

πŸ‘Ž Actual Behavior

NullPointerException due to requiring providerToken not to be nullable.

providerToken = map["providerToken"] as String,

Unfortunately this entry seems to be null when creating a session via email / password.

🎲 Appwrite version

Different version (specify in environment)

πŸ’» Operating system

Linux

🧱 Your Environment

No response

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

Exceptions are a serious problem.

πŸ‘Ÿ Reproduction steps

Sending exceptions in every negative case of the application leads to serious issues. Is it correct to use try-catch everywhere.

Even though I don't use try-catch, some exceptions still cause the application to crash. Firebase Crashlytics is full of crashes. We need to urgently move away from this try-catch approach. If necessary, it should be handled within the SDK. We shouldn't force the person using the SDK to put try-catch everywhere; it's not clean code at all.

πŸ‘ Expected behavior

lol

πŸ‘Ž Actual Behavior

lol

🎲 Appwrite version

Appwrite Cloud

πŸ’» Operating system

Linux

🧱 Your Environment

lol

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

KMP Support ?

Refactor Current SDK and dependencies like,

okHttp -> Ktor,
GSON -> Kotlinx.serialization

and add support for more targets which Kotlin can support like JAVA, android, Native, JS and even IOS if you want all from a single codebase, hence maintaining and adding new Features will be easier too,

and I will love to contribute too...., maybe in near future when I get some time at my hand.

πŸ“š Documentation: Check Session

πŸ’­ Description

Hi, I want to check session on reopen app and get account object. How can I do?

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

πŸ› Bug Report: NullPointerException occurring when calling account.createEmailPasswordSession()

πŸ‘Ÿ Reproduction steps

Android SDK version 5.0.0
Creating session with by email and password

πŸ‘ Expected behavior

Session should be created.

πŸ‘Ž Actual Behavior

FATAL EXCEPTION: OkHttp Dispatcher Process: com.anshtya.myhub, PID: 13693 java.lang.NullPointerException: null cannot be cast to non-null type kotlin.collections.List<kotlin.Any> at io.appwrite.models.Session$Companion.from(Session.kt:241) at io.appwrite.services.Account$createEmailPasswordSession$converter$1.invoke(Account.kt:1155) at io.appwrite.services.Account$createEmailPasswordSession$converter$1.invoke(Account.kt:1153) at io.appwrite.Client$awaitResponse$2$1.onResponse(Client.kt:541) at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012)

Session.kt:241

factors = map["factors"] as List<Any>,

In SDK version 4.0.0 session got created without any errors.

🎲 Appwrite version

Appwrite Cloud

πŸ’» Operating system

Linux

🧱 Your Environment

No response

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

File Download Progress callbackπŸš€ Feature:

πŸ”– Feature description

When we download a file we don't get a progress of how much file is downloaded.

🎀 Pitch

Features uses examples:
We can use this feature so file sharing kind of apps or some chat app that has a image upload or download feature.

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

πŸ› Bug Report: Missing "project=<projectid>" in createOAuth2Session()'s URL in android SDK

πŸ‘Ÿ Reproduction steps

when using

val client = Client(this)
           .setEndpoint("https://192.168.101.5/v1")
           .setProject("projectid")
            val con = this
GlobalScope.launch {
     val account = Account(client)
     val session = account.createOAuth2Session(con, "google")
}

its giving 412 error in browser
image0

and the url was "http://192.168.101.5/v1/account/sessions/oauth2/google?"
and it was missing project=projectid
should be like "http://192.168.101.5/v1/account/sessions/oauth2/google?project=projectid"

but after manually adding it is giving this error
image0-2

so instead of ip i used the domain which is connected to cloudflare and not appwrite i just used cloudflare tunneling to host my server so i am using my domain name with cloudflare and not appwrite however replacing ip with domain name gives me this error
image0-3

i have double checked project id app id and app secret in appwrite server and cloud.google.com too. And by the way i am using kotlin SDK with version 1.2.0

πŸ‘ Expected behavior

it should be redirected and have my credentials to create a new user

πŸ‘Ž Actual Behavior

missing url data problem with redirecting to google cloud api

🎲 Appwrite version

Version 1.2.x

πŸ’» Operating system

Linux

🧱 Your Environment

No environment customization just using cloudflare to connect my server with domain using tunnel

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

πŸ› Bug Report: Failed to resolve: com.squareup.okhttp3:okhttp-bom:4.10.0

πŸ‘Ÿ Reproduction steps

After adding "implementation("io.appwrite:sdk-for-android:4.0.0")" to my build.gradle.kts

πŸ‘ Expected behavior

BUILD SUCCESSFUL

πŸ‘Ž Actual Behavior

Failed to resolve: com.squareup.okhttp3:okhttp-bom:4.10.0

🎲 Appwrite version

Appwrite Cloud

πŸ’» Operating system

Linux

🧱 Your Environment

Kotlin SDK

@Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed
plugins {
    alias(libs.plugins.androidApplication)
    alias(libs.plugins.kotlinAndroid)
}

android {
    namespace = "space.technet.assistant"
    compileSdk = 34

    defaultConfig {
        applicationId = "space.technet.assistant"
        minSdk = 26
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary = true
        }
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.4.3"
    }
    packaging {
        resources {
            excludes += "/META-INF/{AL2.0,LGPL2.1}"
        }
    }
}

dependencies {
    implementation(libs.core.ktx)
    implementation(libs.lifecycle.runtime.ktx)
    implementation(libs.activity.compose)
    implementation(platform(libs.compose.bom))
    implementation(libs.ui)
    implementation(libs.ui.graphics)
    implementation(libs.ui.tooling.preview)
    implementation(libs.material3)
    implementation(platform(libs.compose.bom))
    implementation(libs.androidx.foundation.android)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.test.ext.junit)
    androidTestImplementation(libs.espresso.core)
    androidTestImplementation(platform(libs.compose.bom))
    androidTestImplementation(libs.ui.test.junit4)
    androidTestImplementation(platform(libs.compose.bom))
    debugImplementation(libs.ui.tooling)
    debugImplementation(libs.ui.test.manifest)
    implementation(libs.androidx.navigation.compose)
    implementation("io.appwrite:sdk-for-android:4.0.0")
    //implementation("com.squareup.okhttp3:okhttp-bom:4.10.0")

}

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

More encapsulation in the SDK

I think that all calls should return a better type than "OkHttp.Response"

For example, wouldn't it be nice to type:
val session = Account(Client.client).createSession("user", "pass")
and then the session would be (for example) of the AppwriteSession type. That object could have members like "isSuccess", "sessionID" or stuff like that.

With the current version, you have to type
var response = accountService.createSession(email.toString(), password.toString())
var json = response.body?.string() ?: ""
json = JSONObject(json).toString(8)
_response.postValue(Event(json))

Encapsulating the "Response" would also allow for a SDK side json parsing and also error handling. The AppwriteSession object I described above could contain an AppwriteException if the call failed, for example. But more importantly, it would remove the need to parse the json on the non sdk side.

πŸ› Bug Report: Invalid document structure: Unknown attribute: "mClassLoader"

πŸ‘Ÿ Reproduction steps

Setup appwrite
Create account and user object
Try to add document to database
okhttp tries to embed class loader into the api request thus crashing the app
Sample, running logEvent method causes the error/log

πŸ‘ Expected behavior

The request should succeed and the document should be created

πŸ‘Ž Actual Behavior

The app crashes (or in the linked app, logs the error) with

io.appwrite.exceptions.AppwriteException: Invalid document structure: Unknown attribute: "mClassLoader"
	at io.appwrite.Client$awaitResponse$2$1.onResponse(Client.kt:490)
	at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
  	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
  	at java.lang.Thread.run(Thread.java:1012)

🎲 Appwrite version

Appwrite Cloud

πŸ’» Operating system

Something else

🧱 Your Environment

The code runs on an Android device. I tried with SDK v3.0.0 and v3.0.1 both.

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

πŸš€ Feature: Add proguard/R8 rules

πŸ”– Feature description

Add proguard/R8 rules

🎀 Pitch

Add proguard/R8 rules for minify & shrinkResources

πŸ‘€ Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏒 Have you read the Code of Conduct?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.