Giter VIP home page Giter VIP logo

docs's Introduction

npm version

logo

Screeps is a MMO RTS sandbox game for programmers, wherein the core mechanic is programming your units AI. You control your colony by writing JavaScript which operate 24/7 in the single persistent world filled by other players on par with you.

This project is a distributed, standalone game server that allows you to launch your own game world on a local computer or dedicated server on the Internet.

Server launch

The server consists of multiple parallel processes linked to each other. There is a separate launcher process to launch them correctly, and these launchers have various versions for different purposes.

GUI launcher. This is the easiest way to launch the server. It comes with the standard package of the Steam version of the game. You launch the game via the server's executable file that shows the GUI with logs of all started processes and the CLI interface to control the server.

Console launcher. You can also launch the server without the GUI using the command line:

npm install screeps
npx screeps init
npx screeps start

Prerequisites:

You will be prompted for your Steam Web API key, you can obtain it on this page.

Your own launcher. The launchers are intended to launch other server's processes and give them correct environment variables. You can launch those processes your own way (for example, via upstart/systemd, for distributing them across different machines, or setting up an automated testing framework). Please refer to the file launcher/lib/start.js for the list of environment variables that each process needs.

Storage

The default built-in storage is based on LokiJS library which allows to embed it in pure JavaScript environments like the Steam game client. It stores all data in the db.json file. However, you can manually replace the storage engine with another community solution to improve performance.

See this step-by-step guide which explains how to install a standalone private server on Ubuntu using MongoDB and Redis as a storage.

Connect to server

You can connect to your private server using the Steam game client. Click "Change server" and enter your server credentials:

client

Launch options

If you use a stock launcher (either desktop or console), the file .screepsrc in the current catalog stores launch configuration options. You can specify them directly when you launch the server using the console command start.

> npx screeps start --help	
Usage: start [options]	
Start all processes. Launch options can be configured from command line or using the .screepsrc file in the same folder.	
Options:

    -h, --help               output usage information
    --db <path>              The path to the database file.
    --logdir <path>          The path to directory where logs will be created.
    --modfile <path>          The path to JSON file with the list of custom mods to load. Defaults to mods.json.
    --assetdir <path>        The path to directory where static assets are located.
    --port <port>            The port number on which the game server should listen. Defaults to 21025.
    --host <host>            The hostname on which the game server should listen. Defaults to 0.0.0.0.
    --password <password>    The server password which should be provided on user sign in. Default is empty.
    --cli_port <port>        The port number on which the CLI server should listen. Defaults to port+1.
    --cli_host <host>        The hostname on which the CLI server should listen. Defaults to 127.0.0.1.
    --runners_cnt <num>      The number of parallel runner worker processes to launch. Don't set this option greater than the number of your physical CPU cores. Default is 2.
    --processors_cnt <num>   The number of parallel processor worker processes to launch. Don't set this option greater than the number of your physical CPU cores. Default is 2.
    --steam_api_key <key>    If you launch the server without running the local Steam client, then the Steam Web API key is required for authenticating users. It can be obtained on this page: http://steamcommunity.com/dev/apikey

Modules

The server consists of 6 separate modules: launcher, storage, backend, engine, driver,common. They may be in the node_modules of any catalog according to the npm rules. Each module has its own code base and GitHub repository, while the engine module is shared between the official and standalone servers and other modules are developed specifically for the standalone server.

Each module is intended for its own strict purpose:

  • launcher launches the rest of the processes, and it includes the server control GUI.

  • storage contains a LokiJS-based database, a key-value storage, and a Pub/Sub mechanism. The rest of the processes connect to storage to exchange data.

  • backend contains an HTTP server accessed by clients and a CLI server for administration.

  • engine is the game core. It executes game scripts and interacts with game world objects.

  • driver is a link between the environment-independent engine (that is shared for the official server, standalone server, and in-browser simulation) and the immediate environment that hosts the game engine. You can replace this module with your own one, if you wish to use another method of storing and handling data.

  • common is a shared code base with useful utilities.

modules

Authentication

The server does not have any user authentication mechanism of its own. Instead, Steam is employed for this purpose, and the server has two mechanisms that work in parallel to achieve this:

  • Native authentication via the local Steam client on your machine. This is the easiest and handiest method that does not require any setting up and works automatically when launched via Steam.

  • If you want to launch your server on a machine without a Steam client installed, you will have to set up authentication via the Steam Web API. To do this, register a new Steam API Key on this page and set it as the steam_api_key option at the server launch.

Command Line Interface (CLI)

The running server process provides administrative access using a separate port (21026 by default) which allows executing inner server commands using batch commands. It is accessible through the Steam GUI or using this console command:

npx screeps cli

The CLI server contains a JavaScript virtual machine allowing to run any valid JS code and work with inner server functions. They allow changing game objects and call procedures, including those added by you. Some examples of such commands:

// Add an NPC bot to the map
bots.spawn('simplebot', 'W3N1');

// Send a server message to all connected users
system.sendServerMessage("OHAI");

// Generate a new room and add it to the world
map.generateRoom("E0N3", {sources: 4, terrainType: 2});

// View user's data by his username
storage.db['users'].findOne({username: "User"});

// Show all creeps in a room
storage.db['rooms.objects'].find({$and: [{room: 'W1N1'}, {type: 'creep'}]});

// Remove an object by its id
storage.db['rooms.objects'].removeWhere({_id: "abcdef"});

Type help() to get a detailed help for all available objects.

Mods

The game server is written in such a way that you can redefine and configure many aspects of its work. Do not modify server code directly! This will block you from updating with new releases, and the official Steam client of other players will stop connecting to your server. Rather than editing the server's source, create mods.

Mods are simple js files listed in the mods.json (the default folder can be changed through the modfile launch option). Each file must be a Node.js module that exports a single function that receives as an argument a config object:

module.exports = function (config) {

}

Each server process will automatically include all the mods at launch and pass the object config to them with properties corresponding to the type of the launched process. If the server consists of 10 processes, then each mod file will be requested 10 times, each time with a different type of config.

All config child objects are EventEmitter instances that you can listen for game engine events. They also contain some properties that can be simple numeral or string configuration parameters as well as functions that you can redefine thus changing server behavior. Their number will increase with time. We have not prepared documentation for all the available properties yet, but the folder example-mods offers a few simple examples of what you can change by mods. We also recommend to investigate the config object of various processes on your own to find out what is possible.

Installing mods

There are three methods to install a mod to your server:

  • Edit mods.json manually and add a new entry to the array in it.
  • If the mod is published to the NPM repository, you can run npm install my-screeps-mod in your server folder, and it will be added automatically. (CAUTION: There is a bug in some npm 5.x versions which prevents auto install hooks from running.) The mod's package.json should contain "screeps_mod":true parameter in this case:
{
  "name": "my-screeps-mod",
  "version": "1.0.0",
  "main": "my-screeps-mod.js",
  "screeps_mod": true
}
  • Using the Steam Workshop.

NPC bots

You can create autonomous NPC bot players on your private server. They work as regular players, but you can specify their AI scripts in bots option at your mods.json file. Initially there is one AI loaded into your server, called simplebot, but you can always add more, and share with other players.

Use the following CLI commands to control bot players on your server:

> help(bots);
Available methods:
 - bots.spawn(botAiName, roomName, [opts]) - Create a new NPC player with bot AI scripts, and spawn it to the specified room. 'opts' is an object with the following optional pr
operties:
    * name - the name of a bot player, default is randomly generated
    * cpu - the CPU limit of a bot user, default is 100
    * gcl - the Global Control Level of a bot user, default is 1
    * x - the X position of the spawn in the room, default is random
    * y - the Y position of the spawn in the room, default is random
 - bots.reload(botAiName) - Reload scripts for the specified bot AI.
 - bots.removeUser(username) - Delete the specified bot player and all its game objects.
Bot AIs:
 - simplebot [D:\SteamLibrary\steamapps\common\Screeps\server\@screeps\simplebot\src]

If you want to publish your bot AI to the NPM repository, set main.js as the main entry in your package.json, and add screeps_bot:true parameter:

{
  "name": "my-screeps-bot",
  "version": "1.0.0",
  "main": "src/main.js",  
  "screeps_bot": true
}

docs's People

Contributors

artch avatar bannmann avatar cp4r3z avatar creosteanu avatar daboross avatar dmitriyff avatar enr-beck avatar exav avatar helam24 avatar hiryus avatar ityper avatar jbyoshi avatar kevindewit avatar kyberprizrak avatar lf- avatar mnuck avatar nxtn avatar o4kapuk avatar pzyckoh avatar riftlurker avatar selareid avatar spedwards avatar subodai avatar syluximmortal avatar tedivm avatar thijsray avatar tylermarques avatar wolfwings avatar wtfrank avatar zyzyzyryxy 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

Watchers

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

docs's Issues

[Improvement] Creep.getActiveBodyparts CPU cost correction

The CPU cost of Creep.getActiveBodyparts should be "low" instead of "insignificant". Here's my reason.
Went for the engine and found that the actual codes of Creep.getActiveBodyparts is down below,

function _getActiveBodyparts(body, type) {
    var count = 0;
    for(var i = body.length-1; i>=0; i--) {
        if (body[i].hits <= 0)
            break;
        if (body[i].type === type)
            count++;
    }
    return count;
}

This loop can run up to 50 times in total, which may be a little costy and should not be "insignificant". And also, this result is not cached, which is worth noting in the api.
Spotted this problem after using a lot Creep.getActiveBodyparts and it ended up being the most CPU-costing in screeps-profiler.
I'm not a native English speaker, please excuse my grammar mistakes.

Creep.moveByPath incompatible with path returned by PathFinder.Search

This is incorrect:

A path value as returned from <a href="#Room.findPath"><code>Room.findPath</code></a>, <a href="#RoomPosition.findPathTo"><code>RoomPosition.findPathTo</code></a>, or <a href="#PathFinder.search"><code>PathFinder.search</code></a> methods. Both array form and serialized string form are accepted.

Creep.moveByPath is unable to accept an array of RoomPosition objects returned by PathFinder.search

Ideally, fix the bug; at least fix the doc to match current state.

Multilingual support?

Is it possible to make the site multilingual so we can contribute translations rather than fork and deploy my own?

a proplem

https://docs.screeps.com/contributed/modifying-prototypes.html

In set and get methods, "memory.sources" is different from "memory.sourceIds"

Object.defineProperty(Room.prototype, 'sources', {
    get: function() {
            // If we dont have the value stored locally
        if (!this._sources) {
                // If we dont have the value stored in memory
            if (!this.memory.sourceIds) {
                    // Find the sources and store their id's in memory, 
                    // NOT the full objects
                this.memory.sourceIds = this.find(FIND_SOURCES)
                                        .map(source => source.id);
            }
            // Get the source objects from the id's in memory and store them locally
            this._sources = this.memory.sourceIds.map(id => Game.getObjectById(id));//this
        }
        // return the locally stored value
        return this._sources;
    },
    set: function(newValue) {
        // when storing in memory you will want to change the setter
        // to set the memory value as well as the local value
        this.memory.sources = newValue.map(source => source.id);//this
        this._sources = newValue;
    },
    enumerable: false,
    configurable: true
});

dark mode theme support for docs

Can we have a dark mode on the docs?

Here is something I've been playing around with. I am a css amateur, so I will assume you will work out the issues but otherwise, here is the bulk of the work:

image

@media(prefers-color-scheme: dark) {
	body {
		color: #f5f7f9;
		background: #171f26;
	}
	#header-main {
		background: #171f26;
	}
	#header {
		background: #171f26;
	}
	#logo-docs {
		color: #9fa1ad;
	}
	.sidebar-link,
	.toc-link {
		color: #aaa;
	}
	#content-inner {
		background: #171f26;
	}
	#article-toc-top {
		color: #fff;
	}
	#article-toc-top:hover {
		color: #1094e8;
	}
	.article-title {
		color: #fff;
	}
	.article-content {
		color: #bbb;
	}
	.article-content blockquote {
		border: 1px solid #aaa;
		border-left: 5px solid #aaa;
		background: #333;
	}
	.article-content table {
		border: 1px solid #e3e3e3;
	}
	.article-content table tr:nth-child(2n) {
		background: #eee;
	}
	.article-footer {
		border-top: 1px solid #e3e3e3;
		color: #999;
	}
	#mobile-nav {
		background: #171f26;
	}
	.mobile-nav-toggle-bar {
		background: #aaa;
	}
	.mobile-nav-link {
		color: #aaa;
	}
	.mobile-nav-title {
		color: #666;
	}
	pre,
	code {
        color: #fff;
		background: #555;
	}
	#logo-wrap {
        background: #4f536d;
        border-radius: 10px;
    }
}

Indication of what methods cost

In the new API docs, there is a notable omission of the cost to run a given method. This is rather important to writing AIs that are efficient.

[Suggestion] Next, Prev replaced by the name of the page?

Just a small suggestion, but started with reading the "Introduction" page. in the bottom i noticed next and prev, although i would rather see which subject my next page would be!

for instance instead of "Next" -> "Next - Example" or -> ">/Example"

Feel free to make sub suggestions or criticize about my statement.

Misleading ticksToLive property description on StructureWall

http://docs.screeps.com/api/#StructureWall.ticksToLive

Reading this I thought that all novice area / respawn area walls would have that property and so I would distinguish them from "regular" walls by this.
Lately I found out that there were some "starting walls" created instead of safemode when a player spawned and this probably refers to those.

Since as far as I know there are no starting walls now, and no walls ever get this property, it should probably be removed from the docs.

I'd also like to see some remark (on http://docs.screeps.com/api/#StructureWall.hits or on http://docs.screeps.com/api/#StructureWall) stating that for novice/respawn area walls won't have hits property.

Clarify that PathFinder is enabled by default

The PathFinder module became enabled-by-default in 2016. However, the API documentation for PathFinder does not say so. PathFinder.use is still presented as if it enables an optional feature---now a deprecated optional feature.

I would suggest adding a sentence to the PathFinder module header:

This module exports the path-finding algorithm used internally by Creep.moveTo and other methods. It can be disabled to use an older, slower algorithm (although doing so is not recommended).

And a sentence to PathFinder.use:

PathFinder is enabled by default. This method can be used to disable or re-enable it.

And adjust the wording of places that reference PathFinder, such as Room.findPath:

This is only used when the new PathFinder is enabled. This option is ignored if PathFinder has been disabled.

This option cannot be used when the new PathFinder is enabled (use costCallback option instead). This option can only be used if PathFinder has been disabled. If PathFinder is enabled (which is the default), use the costCallback option instead.

Text to Talk is Broken

When using macOS' text-to-talk accessibility feature, it just says "Capitol P" no matter what selection you give it.

Interesting Facts That Makes Euro Truck Simulator The Best

Reals Facts That Make Euro Truck Simulator(ETS) The Best Gaming Simulator

  1. GRAPHICS
    The meticulous attention to detail in re-creating actual areas is an intriguing aspect of Euro Truck Simulator's aesthetics. SCS Software, the game's creators, uses a method called "photogrammetry" to take pictures of actual terrain and items, which are then incorporated into the game's virtual world. Highly realistic surroundings for roads, buildings, and landscapes are made possible by this approach. Players can thus experience an immersive driving environment while navigating European roads, complete with realistic graphical features.

  2. MODS
    The fact that Euro Truck Simulator has a committed and passionate modding community is an intriguing feature of the game. A vast range of custom mods made by players, such as new trucks, trailers, maps, and gameplay mechanics, have greatly expanded and improved the game. This degree of player participation in the community has helped the game maintain its popularity and replay value.

  3. REQUIREMENTS
    The low system requirements of Euro Truck Simulator make it playable on a variety of computer configurations. Here are a few intriguing details about using these systems to play the game:
    Sample of Some Low Required Spec
    • CPU: 2.4 GHz Intel Pentium 4 or equivalent and 1.10GHz Intel Celeron.
    • CPU SPEED: 1.10 GHz
    • RAM: 512 Mb (Windows XP) 1 GB (Windows Vista)
    • VIDEO CARD: GeForce 4 (not MX!) or better, ATI Radeon 8500 and other.
    • DEDICATED VIDEO RAM: 128 MB
    • PIXEL SHADER: 1.3
    • VERTEX SHADER: 1.3
    • OS: Windows XP or Windows Vista
    • FREE DISK SPACE: 5GB
    • SOUND CARD: Yes

• Euro Truck Simulator is well-optimized for PCs with minimal specifications. The game's designers have worked hard to make sure that it can operate properly on even older machines with basic hardware, enabling a larger audience to enjoy the simulation experience.
• Scalability: The game offers a number of visual options that can be modified to fit your PC's capability. This scalability makes it possible for players to strike the ideal mix between visual fidelity and performance, making it playable on PCs with lower hardware.
These factors have contributed to Euro Truck Simulator's popularity among gamers with older or budget-friendly computers, as it offers an enjoyable gaming experience even on less powerful hardware.

  1. CAMERA
    To improve the gaming experience, Euro Truck Simulator offers a choice of camera options. Here are some interesting facts about its camera capabilities:

  2. Multiple Camera Views: Euro Truck Simulator offers a variety of camera views, including the typical third-person view from a distance and even a free-roaming camera. Due to the variety, gamers can select the viewpoint that best suits their preferences and playing style.

  3. The game's interior camera perspective is extremely detailed, with perfectly recreated truck cabins. The complex dashboard displays, functional indicators, and even the genuine steering wheel action may be appreciated by players, adding to the immersion.

  4. Customizable Camera Controls: In Euro Truck Simulator, players can adjust the sensitivity and mouse/keyboard mapping for their camera controls. This adaptability enables players to customize the camera positioning to their preferences, which enhances the comfort and enjoyment of the game experience.

  5. Cinematic Camera option: The game also features a cinematic camera option that enables users to take breath-taking screenshots and in-game video. The Euro Truck Simulator community has produced some fantastic films and pictures as a result of this feature.

  6. VR Support: The use of virtual reality (VR) headsets with Euro Truck Simulator makes the game even more immersive. To increase the sensation of realism and presence, players can wear VR headsets to make themselves feel as though they are actually inside the truck's cabin.

These camera-associated capabilities

  1. CONTROLS
    There are many different control settings available in Euro Truck Simulator. The following are some fascinating details about its controls:

  2. Wheel and Pedal Support: One of Euro Truck Simulator's best features is its outstanding support for various steering wheels and pedal configurations. A very realistic driving experience is provided through the employment of realistic hardware by players to control their trucks.

  3. "Haptic Feedback": Numerous steering wheel configurations for Euro Truck Simulator also have "force feedback" or "haptic feedback." With the use of this technology, gamers can mimic rumbling over various terrains while also feeling the weight of the truck and the road surface.

  4. Key Mapping Customization: The game lets players completely alter how their control assignments are displayed. Since you may arrange your keyboard, mouse, joystick, or gamepad however you choose, it can be used with a variety of input devices.

  5. Multi-Monitor Support: Euro Truck Simulator supports multi-monitor configurations, giving players a wider, more immersive perspective of the road. Fans of simulation are particularly fond of this aspect.

  6. Console Controller Support: Euro Truck Simulator, a PC game at first, is now playable on PlayStation and Xbox gaming consoles. Because it supports controllers, users of various platforms can enjoy the game using their preferred input method.

  7. User-Defined Dead Zones: The game allows you to choose dead zones for your controls, giving you precise control over steering and sensitivity. For you to customize your driving experience, this is essential.

  8. Mouse Steering: Euro Truck Simulator has a different control method dubbed "mouse steering," in which users can direct the truck's movement using their mouse. For those who favor it, it's an unique approach of playing the game.

Whether a player prefers a casual experience with a controller or a highly realistic one with a full wheel and pedal setup, these control-related features help make Euro Truck Simulator accessible and popular to a wide range of gamers.

Missing Game.market.createOrder signature

In-game console suggestion shows this function as:

function(string type, string resourceType, number price, number totalAmount, string roomName) -> number

API docs mention another signature where all arguments are packed into an object:

function(object params) -> number

It seems both can be used but first one is missing in docs.

[Suggestion] Dark, White and Blue theme

I personally prefer the dark theme.

although some arg that white theme has better readability, make it so people can switch between themes, while keeping white theme default?

Feel free to make sub suggestions or criticize about my statement.

heuristicWeight info on docs is incorrect

Summary

At both occurences in the API reference, heuristicWeight is said to be 1.2 per default.
You can see this at:

However, the default is actually 1.0.

Engine showing the default is 1.0

https://github.com/screeps/driver/blob/master/lib/runtime/path-finder.js#L68

Trial showing the default is 1.0

const start = new RoomPosition(38, 6, "W1N4"); 
const stop = new RoomPosition(8, 41, "W1N4"); 
const { ops, cost, incomplete } = PathFinder.search(start, stop, {range: 0, maxOps: 10000 }); 
const tmp = { ops, cost, incomplete }; 
console.log(JSON.stringify(tmp))

// No heuristicWeight opt configured
// => [2:28:41 PM] [shard3]{"ops":78,"cost":41,"incomplete":false}
 
const { ops, cost, incomplete } = PathFinder.search(start, stop, {range: 0, maxOps: 10000, heuristicWeight: 1.2 }); 
const tmp = { ops, cost, incomplete }; 
console.log(JSON.stringify(tmp))

// If default is 1.2, this should be the same as above. It's not.
// => [2:28:52 PM] [shard3]{"ops":62,"cost":41,"incomplete":false}
 
const { ops, cost, incomplete } = PathFinder.search(start, stop, {range: 0, maxOps: 10000, heuristicWeight: 1.0 }); 
const tmp = { ops, cost, incomplete }; 
console.log(JSON.stringify(tmp))

// heuristicWeight 1.0 matches the call without this opt
// => [2:28:59 PM] [shard3]{"ops":78,"cost":41,"incomplete":false}```

Improve RoomPosition.findClosestBy*() Doc Clarity

RoomPosition.findClosestByPath(type, [opts]) will look for objects in the same room and RoomPosition.findClosestByPath(objects, [opts]) will check all objects passed in.
However, RoomPosition.findClosestByRange(objects, [opts]) will only check for objects in the same room, ignoring any objects in other rooms, which is inconsistent with the previous method.
Would you add some clarification about this in the api?

OBSTACLE_OBJECT_TYPES is outdated

#ingame
OBSTACLE_OBJECT_TYPES
spawn,creep,source,mineral,controller,constructedWall,extension,link,storage,tower,observer,powerSpawn,powerBank,lab,terminal,nuker

#from docs
OBSTACLE_OBJECT_TYPES: ["spawn", "creep", "wall", "source", "constructedWall", "extension", "link", "storage", "tower", "observer", "powerSpawn", "powerBank", "lab", "terminal","nuker"],

I think there's an overnight "reset" that isn't documented.

Hi, so I have a funny situation that Reddit helped me debug.

I read about the "global object wipe" thing that happens every tick.

any changes in these properties, appearing of new objects, and dismantling of old ones will happen only at the start of the next tick

That makes sense, and is something I have been keeping in mind. But my bug was different, and came about from the following situation:

// main.js
var spawn = Game.spawns.MySpawn;
module.exports = function() {
    // ...
    if (spawn.spawning) {
        // do nothing this tick
    }
    // ...
};

As you can see, var spawn is generated at compile time, which I thought would be more efficient. My code worked perfectly during the day, from morning til midnight. But overnight, my code would stop working. spawn.spawning would be stuck returning whatever it was returning at some point when I wasn't looking. If I changed any line of any file, it would start working, because main.js would get recompiled!

I believe that overnight, the Game object is recreated, such that Game.spawns.mySpawn is a new object. This means that var spawn is still pointing to the old object, which never gets updated, breaking my colony.

The fix was to do this:

module.exports = function() {
    var spawn = Game.spawns.MySpawn;
    // ...
};

It took a post on Reddit to debug this because I had no idea that the Game.spawns object would be repopulated with new data at some point overnight. I don't think this is documented, and if it is, I have still not read that document - and since it was the first line of code I wrote after the tutorial, I think it should be put early in the documentation.

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.