Code Monkey home page Code Monkey logo

midjourney-api's Introduction

midjourney-client

Node.js client for the unofficial MidJourney api.

English / 中文文档

Discord server npm version

What's new

Example

To run the included example, you must have Node.js installed. Then, run the following commands in the root directory of this project:

  1. clone the repository

    git clone https://github.com/erictik/midjourney-client.git
    cd midjourney-client
  2. install dependencies

    yarn
    # or npm
    npm install
  3. set the environment variables

  • Login DiscordF12 OR Ctrl + Shift + I (or Command + Option + I on Mac) to open the developer tools AND paste the following code into the console

    window.webpackChunkdiscord_app.push([
      [Math.random()],
      {},
      (req) => {
        for (const m of Object.keys(req.c)
          .map((x) => req.c[x].exports)
          .filter((x) => x)) {
          if (m.default && m.default.getToken !== undefined) {
            return copy(m.default.getToken());
          }
          if (m.getToken !== undefined) {
            return copy(m.getToken());
          }
        }
      },
    ]);
    console.log("%cWorked!", "font-size: 50px");
    console.log(`%cYou now have your token in the clipboard!`, "font-size: 16px");

    OR use network your Discord TOKEN

  • Join my discord server

    export SERVER_ID="1082500871478329374"
    export CHANNEL_ID="1094892992281718894"
    
  • OR Create a server and Invite Midjourney Bot to Your Server

    # How to get server and channel ids:
    # when you click on a channel in your server in the browser
    # expect to have the follow URL pattern
    # `https://discord.com/channels/$SERVER_ID/$CHANNEL_ID`
    export SERVER_ID="your-server-id"
    export CHANNEL_ID="your-channel-id"
  • wirte your token to .env file or set the environment variables

      #example variables, please set up yours
    
      export SERVER_ID="1082500871478329374"
      export CHANNEL_ID="1094892992281718894"
      export SALAI_TOKEN="your-discord-token"
  • Then, run the example with the following command:

    npx tsx example/imagine-ws.ts

    OR

    yarn example:imagine
    # or npm
    npm run example:imagine
  • more example

Usage

  1. Install

    npm i midjourney
    # or
    yarn add midjourney
  2. config param

    export interface MJConfigParam {
      SalaiToken: string; //DISCORD_TOKEN
      ChannelId?: string; //DISCORD_CHANNEL_ID
      ServerId?: string; //DISCORD_SERVER_ID
      BotId?: typeof MJBot | typeof NijiBot; //DISCORD_BOT_ID MJBot OR NijiBot
      Debug?: boolean; // print log
      ApiInterval?: number; //ApiInterval request api interval
      Limit?: number; //Limit of get message list
      MaxWait?: number;
      Remix?: boolean; //Remix:true use remix mode
      Ws?: boolean; //Ws:true use websocket get discord message (ephemeral message)
      HuggingFaceToken?: string; //HuggingFaceToken for verify human
      SessionId?: string;
      DiscordBaseUrl?: string;
      ImageProxy?: string;
      WsBaseUrl?: string;
      fetch?: FetchFn; //Node.js<18 need node.fetch Or proxy
      WebSocket?: WebSocketCl; //isomorphic-ws Or proxy
    }
  3. Use Imagine 、Variation and Upscale

    import { Midjourney } from "midjourney";
    const client = new Midjourney({
      ServerId: <string>process.env.SERVER_ID,
      ChannelId: <string>process.env.CHANNEL_ID,
      SalaiToken: <string>process.env.SALAI_TOKEN,
      Debug: true,
      Ws: true, //enable ws is required for remix mode (and custom zoom)
    });
    await client.init();
    const prompt =
      "Christmas dinner with spaghetti with family in a cozy house, we see interior details , simple blue&white illustration";
    //imagine
    const Imagine = await client.Imagine(
      prompt,
      (uri: string, progress: string) => {
        console.log("loading", uri, "progress", progress);
      }
    );
    console.log(Imagine);
    if (!Imagine) {
      console.log("no message");
      return;
    }
    //U1 U2 U3 U4 V1 V2 V3 V4  "Vary (Strong)" ...
    //⬅️,⬆️,⬇️,➡️
    const V1CustomID = Imagine.options?.find((o) => o.label === "V1")?.custom;
    if (!V1CustomID) {
      console.log("no V1");
      return;
    }
    // Varition V1
    const Varition = await client.Custom({
      msgId: <string>Imagine.id,
      flags: Imagine.flags,
      customId: V1CustomID,
      content: prompt, //remix mode require content
      loading: (uri: string, progress: string) => {
        console.log("loading", uri, "progress", progress);
      },
    });
    console.log(Varition);
    const U1CustomID = Imagine.options?.find((o) => o.label === "U1")?.custom;
    if (!U1CustomID) {
      console.log("no U1");
      return;
    }
    // Upscale U1
    const Upscale = await client.Custom({
      msgId: <string>Imagine.id,
      flags: Imagine.flags,
      customId: U1CustomID,
      loading: (uri: string, progress: string) => {
        console.log("loading", uri, "progress", progress);
      },
    });
    if (!Upscale) {
      console.log("no Upscale");
      return;
    }
    console.log(Upscale);
    const zoomout = Upscale?.options?.find((o) => o.label === "Custom Zoom");
    if (!zoomout) {
      console.log("no zoomout");
      return;
    }
    // Custom Zoom
    const CustomZoomout = await client.Custom({
      msgId: <string>Upscale.id,
      flags: Upscale.flags,
      content: `${prompt} --zoom 2`, // Custom Zoom  require content
      customId: zoomout.custom,
      loading: (uri: string, progress: string) => {
        console.log("loading", uri, "progress", progress);
      },
    });
    console.log(CustomZoomout);

route-map


Projects


Support

If you find it valuable and would like to show your support, any donations would be greatly appreciated. Your contribution helps me maintain and improve the program.

   Buy Me a Coffee

Star History

Star History Chart

midjourney-api's People

Contributors

1395173231 avatar artemptushkin avatar autemox avatar deniska83 avatar estebanrestoy avatar happyvee avatar iamkunal9 avatar jakowenko avatar muyibo avatar xdpcs avatar zcpua 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

midjourney-api's Issues

Upscale functionality: wrong parameter used in WaitOptionMessage

Hi!

inside src/midjourney.ts I need to change the async Upscale method using a return as follow:
return await this.WaitOptionMessage(content, 'Image #' + index, loading)
I discovered that inside my channel on Discord after my request prompt, midjourney bot put a "Image #" text followed by the index of image choosen in upscale request.

I hope this is useful.

Regards,
Roberto

账号池轮询

请问后面会出账号池轮询功能吗,一个账号会不够用 同时作业太少了

The Variation interface cannot be used properly.

async function main() {
const client = new Midjourney({
...config,
})
const msg = await client.Imagine('a dog, blue ears, and a red nose')
console.log({ msg })
if (!msg) {
console.log('no message')
return
}
const msg2 = await client.Variation(
msg.content,
2,
msg.id,
msg.hash,
(uri) => {
console.log('loading', uri)
},
)
console.log({ msg2 })
}
main()

and then it return the result like:

{
msg: {
id: '1111517800503201842',
uri: 'https://cdn.discordapp.com/attachments/1107512663669493833/1111517799899205662/RuthDavis_a_dog_blue_ears_and_a_red_nose_5192b71e-a948-477e-a87b-99ed7bd9857c.png',
hash: '5192b71e-a948-477e-a87b-99ed7bd9857c',
content: 'a dog, blue ears, and a red nose --seed 7856 --v 5',
progress: 'done'
}
}
{ msg2: null }

variation invalid

image

According to the example code, after the execution is completed, V2 will not generate pictures

Unable to use package

I'm getting this error message after installing midjourney-api package, what might be a problem, and how to solve it?

image

feature request: remix mode

thank you for amazing work, I've study the code few days ago , theres remix api in the Midjourney class , but deleted in later commit , is there any way to support this function ?

cannot find ../libs

Hi, I have quite a problem to make this work. Could you please help me a little bit?

  1. Made a clone of https://github.com/erictik/midjourney-api
  2. setup all env variables (hopefully correct) and installed via command "yarn" in a root of the repo
  3. Then I tried run node example with a command "node example/imagine.js".

Error: Cannot find module '../libs'

Error: ImagineApi failed with status 400

Error: ImagineApi failed with status 400
    at Midjourney.Imagine (d:\work\project\test\midjourney-api\src\midjourney.ts:46:13)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at main (d:\work\project\test\midjourney-api\example\imagine-ws.ts:20:15)

Docker fails

The program fails in Docker container when submitting the prompt from the UI:

(base) morpher@rog ~/Documents/MyProjects/midjourney-ui (main)$ docker run --env-file .env -p 3000:3000 erictik/midjourney-ui
yarn run v1.22.19
$ next start
ready - started server on 0.0.0.0:3000, url: http://localhost:3000
imagine.handler unicorn
imagine.start unicorn
ReadableStream class {
  constructor(e2 = {}, t2 = {}) {
    void 0 === e2 ? e2 = null : D(e2, "First parameter");
    const r2 = Ye(t2, "Second parameter"), o2 = function(e3, t3) {
      F(e3, t3);
      const r3 = e3, o3 = null == r3 ? void 0 : r3.autoAllocateChunkSize, n3 = null == r3 ? void 0 : r3.cancel, a2 = null == r3 ? void 0 : r3.pull, i2 = null == r3 ? void 0 : r3.start, l2 = null == r3 ? void 0 : r3.type;
      return { autoAllocateChunkSize: void 0 === o3 ? void 0 : N(o3, `${t3} has member 'autoAllocateChunkSize' that`), cancel: void 0 === n3 ? void 0 : $t(n3, r3, `${t3} has member 'cancel' that`), pull: void 0 === a2 ? void 0 : Mt(a2, r3, `${t3} has member 'pull' that`), start: void 0 === i2 ? void 0 : Yt(i2, r3, `${t3} has member 'start' that`), type: void 0 === l2 ? void 0 : Qt(l2, `${t3} has member 'type' that`) };
    }(e2, "First parameter");
    var n2;
    if ((n2 = this)._state = "readable", n2._reader = void 0, n2._storedError = void 0, n2._disturbed = false, "bytes" === o2.type) {
      if (void 0 !== r2.size)
        throw new RangeError("The strategy for a byte stream cannot have a size function");
      Oe(this, o2, $e(r2, 0));
    } else {
      const e3 = Me(r2);
      It(this, o2, $e(r2, 1), e3);
    }
  }
  get locked() {
    if (!Vt(this))
      throw Kt("locked");
    return Ut(this);
  }
  cancel(e2) {
    return Vt(this) ? Ut(this) ? d(new TypeError("Cannot cancel a stream that already has a reader")) : Gt(this, e2) : d(Kt("cancel"));
  }
  getReader(e2) {
    if (!Vt(this))
      throw Kt("getReader");
    return void 0 === function(e3, t2) {
      F(e3, t2);
      const r2 = null == e3 ? void 0 : e3.mode;
      return { mode: void 0 === r2 ? void 0 : Nt(r2, `${t2} has member 'mode' that`) };
    }(e2, "First parameter").mode ? new ReadableStreamDefaultReader(this) : function(e3) {
      return new ReadableStreamBYOBReader(e3);
    }(this);
  }
  pipeThrough(e2, t2 = {}) {
    if (!H(this))
      throw Kt("pipeThrough");
    $(e2, 1, "pipeThrough");
    const r2 = xt(e2, "First parameter"), o2 = Ht(t2, "Second parameter");
    if (this.locked)
      throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream");
    if (r2.writable.locked)
      throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream");
    return m(kt(this, r2.writable, o2.preventClose, o2.preventAbort, o2.preventCancel, o2.signal)), r2.readable;
  }
  pipeTo(e2, t2 = {}) {
    if (!H(this))
      return d(Kt("pipeTo"));
    if (void 0 === e2)
      return d("Parameter 1 is required in 'pipeTo'.");
    if (!x(e2))
      return d(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"));
    let r2;
    try {
      r2 = Ht(t2, "Second parameter");
    } catch (e3) {
      return d(e3);
    }
    return this.locked ? d(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")) : e2.locked ? d(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")) : kt(this, e2, r2.preventClose, r2.preventAbort, r2.preventCancel, r2.signal);
  }
  tee() {
    if (!H(this))
      throw Kt("tee");
    if (this.locked)
      throw new TypeError("Cannot tee a stream that already has a reader");
    return Ot(this);
  }
  values(e2) {
    if (!H(this))
      throw Kt("values");
    return function(e3, t2) {
      const r2 = e3.getReader(), o2 = new te(r2, t2), n2 = Object.create(re);
      return n2._asyncIteratorImpl = o2, n2;
    }(this, function(e3, t2) {
      F(e3, t2);
      const r2 = null == e3 ? void 0 : e3.preventCancel;
      return { preventCancel: Boolean(r2) };
    }(e2, "First parameter").preventCancel);
  }
}
imagine.error [Error: A Node.js API is used (setImmediate) which is not supported in the Edge Runtime.
Learn more: https://nextjs.org/docs/api-reference/edge-runtime]

Why repeat the drawing?

const MaxWait = 600
const Limit = 100

export default async function (ctx: FunctionContext) {
  const { msg_id, imaginePrompt, serverId, channelId, salaiToken } = ctx.body

  const client = new Midjourney({
    ServerId: serverId,
    ChannelId: channelId,
    SalaiToken: salaiToken,
    Debug: true,
    MaxWait: MaxWait,
    SessionId: salaiToken,
    Limit: Limit,
  });
  const msg = await client.Imagine("A little pink elephant ", (uri) => {
    console.log("loading", uri);
  });
  return { msg }
}
image image

Small Variation issue

Hey again,

thx for ur great work !

I've noticed that if you variate a generation twice, seems like the code cannot make the difference between the first variation and the second one, so it takes the first one instead of waiting for the second one.

Feature asking

hi Erictik,

This is Weijiang, I really wanna give a BIG THANK YOU to your work! it help me a lot to ship the MJ feature.

Btw, some ideas:

  1. Tencent QQ had already integrate the Mj, wondering if you're interested to have a look?
  2. For the /relax and /fast mode, I found they're already on your roadmap, that's really cool, and want to know when can we start it?

Thanks,

Error: ImagineApi failed with status 400

Error: ImagineApi failed with status 400
at Midjourney.Imagine (/Users/username/github/midjourney-api/src/midjourney.ts:24:13)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at main (/Users/username/github/midjourney-api/example/imagine.ts:17:15)

Improvement idea

It would be nice to increase the delay for the returned {msg}, sometimes Midjourney can take time to start the generation, and msg is returned undefined before the generation ended.

I'm thinking about doing it manually meanwhile, can you help me by giving me the line of code (if possible) my knowledge are limited ?

Thank you

zlib error

  if (data.length >= 4 && data.readUInt32BE(data.length - 4) === 0x0ffff) {
    this.inflate.flush(
      ZlibConstants.Z_SYNC_FLUSH,
      this.handleFlushComplete.bind(this),
    )
  }

Sometimes an error occurs when executing the above statement

Uncaught Exception thrown Error: invalid stored block lengths
at Zlib.zlibOnError [as onerror] (node:zlib:189:17) {
errno: -3,
code: 'Z_DATA_ERROR'
}

I got an 400 error code for these three examples.

Error: ImagineApi failed with status 400
at Midjourney.Imagine (/Users/jinhu/Development/ChatAI/midjourney-api/src/midjourney.ts:23:13)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at main (/Users/jinhu/Development/ChatAI/midjourney-api/example/upscale.ts:17:15)
(base) ➜ midjourney-api git:(main) ✗

'no message found' error

Quite often no message found after awaiting imagine execution.
Idk on what variables it happens, it looks like it just randomly appears time to times.
Switching to new created clean channel helps for a while.

image

Upscale no msg return

Upscale no msg return. when the Upscale img has been created, but the msg2 not return, still repect waitting
cmd: npx tsx example/upscale.ts

stuck..

hi, nice script. but when yarn install still get stuck esbuild. and please add other command like info,describe

Is there a possibility to select one of the "first shots"

Hey Eric !

First Thanks for your amazing work, it works great on my side :)

Are you planning to have a solution to be able to select one of the 4 options, then retreive the uri ?

Or even to make variation/refresh just like on discord :)

Have a great day

promopt 中加上 图片地址,就没有返回了。

npx tsx example/imagine.ts
测试通过
把其中的 promopt 设置为: "https://i0.hdslb.com/bfs/vc/bc954b9250303d69f601b534424be6dc54c58ce8.png a cat",
就卡死了, 不知为什么。

我想要让 midjourney 按照图片生成图片。

const client = new Midjourney(
process.env.SERVER_ID,
process.env.CHANNEL_ID,
process.env.SALAI_TOKEN,
true
);
const msg = await client.Imagine(
"https://i0.hdslb.com/bfs/vc/bc954b9250303d69f601b534424be6dc54c58ce8.png a cat",
(uri: string, progress: string) => {
console.log("loading", uri, "progress", progress);
}
);

[202]:~/midjourney-api(main)$ ./init.sh MidjourneyMessage constructor 2023-05-12T09:35:17.751Z
Imagine https://i0.hdslb.com/bfs/vc/bc954b9250303d69f601b534424be6dc54c58ce8.png a cat --seed 2221 2023-05-12T09:35:17.752Z
await generate image 2023-05-12T09:35:18.372Z
0 wait no message found 2023-05-12T09:35:18.815Z
1 wait no message found 2023-05-12T09:35:21.326Z
2 wait no message found 2023-05-12T09:35:23.732Z
3 wait no message found 2023-05-12T09:35:26.107Z
4 wait no message found 2023-05-12T09:35:28.574Z
5 wait no message found 2023-05-12T09:35:30.984Z
6 wait no message found 2023-05-12T09:35:33.360Z
7 wait no message found 2023-05-12T09:35:35.738Z
8 wait no message found 2023-05-12T09:35:38.112Z

midjourney-ui: build and running failed

Any request in dev mode fires this error

Running on Ubuntu 20:
`error - node:child_process
Module build failed: UnhandledSchemeError: Reading from "node:child_process" is not handled by plugins (Unhandled scheme).
Webpack supports "data:" and "file:" URIs by default.
You may need an additional plugin to handle "node:" URIs.
Import trace for requested module:
node:child_process
./node_modules/discord.js/src/sharding/Shard.js
./node_modules/discord.js/src/index.js
./node_modules/midjourney/libs/midjourney.js
./node_modules/midjourney/libs/index.js
wait - compiling /_error (client and server)...
warn - ./node_modules/discord.js/src/client/websocket/WebSocketManager.js
Module not found: Can't resolve 'zlib-sync' in '/home/anton/_npm_projects/midjourney-ui/node_modules/discord.js/src/client/websocket'

Import trace for requested module:
./node_modules/discord.js/src/client/websocket/WebSocketManager.js
./node_modules/discord.js/src/index.js
./node_modules/midjourney/libs/midjourney.js
./node_modules/midjourney/libs/index.js
`

Running on Windows 10:
`

  • error node:child_process
    Module build failed: UnhandledSchemeError: Reading from "node:child_process" is not handled by plugins (Unhandled scheme).
    Webpack supports "data:" and "file:" URIs by default.
    You may need an additional plugin to handle "node:" URIs.
    Import trace for requested module:
    node:child_process
    ./node_modules/discord.js/src/sharding/Shard.js
    ./node_modules/discord.js/src/index.js
    ./node_modules/midjourney/libs/midjourney.js
    ./node_modules/midjourney/libs/index.js`

Trying to build also failed. Please assist

Repeated Text Error.

Hey, and thank you for uploading this,

I have two suggestions for improvement that I noticed while using it.

  1. If a prompt is sent twice with a time interval, the first message with the same text is returned.

Thus, a possibility is needed to write several messages with the same text.

  1. Besides there are concurrent jobs, these are also currently not implemented.

I would be happy if there is an option to run concurrent jobs as well as named jobs.
Tank you :)

fetch is not defined

I tried the example you provided but I got this error

ReferenceError: fetch is not defined
    at Midjourney.<anonymous> (D:\Projects\...\midjourney\node_modules\midjourney\libs\midjourney.js:49:34)

latest issue...

latest version, send error like this :

Error: ImagineApi failed with status 401
at Midjourney. (/main/server/node_modules/midjourney/libs/midjourney.js:26:23)

Bug report

The message always return NULL when i used this prompt to the client.Imagine

Prompt: "A dragon, a Chinese little girl in ancient attire,The dragon and the little girl are intimate, elegant, realistic, and have many details".

please have a look, 100% reproduced.

Run npx tsx ./example/imagine.ts with error. SyntaxError: Cannot use import statement outside a module

I can run 'node ./example/imagine.js but can't run 'npx tsx ./example/imagine.ts' with the following error

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/Users/xxx/Projects/js-project/midjourney-api/main.ts' imported from /Users/xxx/Projects/js-project/midjourney-api/
at __node_internal_captureLargerStackTrace (node:internal/errors:490:5)
at new NodeError (node:internal/errors:399:5)
at finalizeResolution (node:internal/modules/esm/resolve:231:11)
at moduleResolve (node:internal/modules/esm/resolve:850:10)
at defaultResolve (node:internal/modules/esm/resolve:1058:11)
at nextResolve (node:internal/modules/esm/loader:163:28)
at u (file:///Users/panjianbo/Projects/js-project/midjourney-api/node_modules/@esbuild-kit/esm-loader/dist/index.js:1:2406)
at nextResolve (node:internal/modules/esm/loader:163:28)
at ESMLoader.resolve (node:internal/modules/esm/loader:835:30)
at ESMLoader.getModuleJob (node:internal/modules/esm/loader:416:18)
at ESMLoader.import (node:internal/modules/esm/loader:517:22)
at node:internal/modules/run_main:56:28
at loadESM (node:internal/process/esm_loader:94:11)
at async handleMainPromise (node:internal/modules/run_main:66:12) {
code: 'ERR_MODULE_NOT_FOUND'

ReadMe correction

I love your Project!

A little Correction for the readme:
"
Then, run the example with the following command:

npx tsx example/imagine-ws.ts
npx tsx example/upscale-w.ts
"

should be :
"
Then, run the example with the following command:

npx tsx example/imagine-ws.ts
npx tsx example/upscale-ws.ts
"

Have a great day.

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.